Skocz do zawartości
Komentator

Kurs Arduino II - #8 - cyfrowy czujnik wilgotności (DHT11)

Pomocna odpowiedź

Witam, mam pytanie - czy będzie (ewentualnie jest już) jakiś artykuł, w którym opisane jest jak można rozszerzyć ilość wejść/wyjść Arduino przy pomocy ekspandera np.

https://botland.com.pl/ekspandery-wyprowadzen/4455-modul-pcf8574-ekspander-wyprowadzen-mikrokontrolera.html?search_query=+PCF8574&results=19

Proszę o informacje, ponieważ bardzo mi się to przyda 🙂

Pozdrawiam!

Udostępnij ten post


Link to post
Share on other sites

Witam,
a jest gdzieś użyty sam ekspander? Potrzebuję kilku dodatkowych pinów, a cały shield do obsługi serwo nie jest mi do niczego potrzebny przy moim projekcie 🙂

Głównie chodzi mi o podłączenie całości do układu - program wydaje mi się, że ogarnę z artykułu 🙂

Udostępnij ten post


Link to post
Share on other sites

SiaQ, chodzi Ci o samo podłączenia? Poszukaj schematu naszego shielda, może coś Ci pomoże 😉 Te układy podłącza się bardzo łatwo: zasilanie, linie do komunikacji i właściwie tyle (jeśli nie chcesz zmieniać adresu układu).

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Mam problem z DHT, ciągle wyskakuje mi błąd kompilacji dla płytki Arduino, exit status 1...

Co oznacza(co robi) ten zapis: DHT dht;

Wydaje mi się, że mam problem z bibliotekami, bo problem pojawia się od razu po ich zadeklarowaniu. Czy zależnie od tego którą mam "wersję"(cc, lub org) powinienem zainstalować różne biblioteki?

Instalowałem zgodnie z info z części 2, zainstalowane poprawnie, wpisywałem takie i takie i razem i osobno i ciągle ten błąd kompilacji.

Dlaczego wasza biblioteka jest w "", a program ją wpisuje w<>?

Kiedy kolejny odcinek kursu? Na koniec tego artykułu jest napisane, ze kolejny wkrótce, ale to było w lutym.... 🙁

Treker w komentarzach zapowiedział, że już na dniach coś o oświetleniu...

Kiedyś było coś wspominane, że pojawią się wyświetlacze graficzne, fajnie by było się też dowiedzieć co to jest I2C!!!

Zresztą Treker et consortes wiedzą czego lud pragnie 🤣

[ Dodano: 23-11-2017, 12:01 ]

Dobra doszedłem do tego, że dizała mi biblioteka SimpleDHT, zainstalowałem jej przykład:

int pinDHT11 = 13;
SimpleDHT11 dht11;

void setup() {
 Serial.begin(9600);
}

void loop() {
 // start working...
 Serial.println("=================================");
 Serial.println("Sample DHT11...");

 // read without samples.
 byte temperature = 0;
 byte humidity = 0;
 int err = SimpleDHTErrSuccess;
 if ((err = dht11.read(pinDHT11, &temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
   Serial.print("Read DHT11 failed, err="); Serial.println(err);delay(1000);
   return;
 }

 Serial.print("Sample OK: ");
 Serial.print((int)temperature); Serial.print(" *C, "); 
 Serial.print((int)humidity); Serial.println(" H");

 // DHT11 sampling rate is 1HZ.
 delay(1500);
}

działa i wyświetla wartości ok, ale pozmieniałem to dla siebie:

#include <SimpleDHT.h>
#include <LiquidCrystal.h> //Dołączenie bilbioteki
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza


int pinDHT11 = 13;
SimpleDHT11 dht11;
void setup() {
}

void loop() {
 byte temperature = 0;
 byte humidity = 0;
 lcd.begin(16, 2);
 lcd.setCursor(0, 0);
 lcd.print((int)humidity);
 lcd.print("%RH");
 lcd.setCursor(0, 1);
 lcd.print((int)temperature);
 lcd.print("*C");

 delay(1500);
}

i wyświetla mi wartości dla temperatury i wilgotności 0 i 0... Dlaczego?

Rozumiem, że w pierwszym przypadku program skądś bierze wartość byte temperatury i wilgotności, ale nie widzę skąd, a w moim programie po prostu wyświetla przypisaną wartość... jak to naprawić?

Udostępnij ten post


Link to post
Share on other sites

SOYER, odnosząc się do Twojego pierwszego problemu - czy przypadkiem nie masz zainstalowanej innej biblioteki? Może nazywać się tak samo, a nie być tą, która była linkowana w kursie. Nie podałeś pełnej treści komunikatu z błędem, więc ciężko jednoznacznie określić, co tam się dzieje. Jeśli zdecydujesz się na korzystanie z innej biblioteki (jak w aktualizacji Twojego wpisu), to załóż proszę osobny temat, aby innym czytelnikom nie myliły się kody. Z góry dziękuję za zrozumienie i pomoc w utrzymaniu porządku na forum 🙂

Jeśli chodzi o kontynuację kursu Arduino, to tak jak wspominałem - pojawi się i nie chce na razie deklarować terminów, bo jak widać w tym konkretnym przypadku bywa niestety różnie... W między czasie pracowałem przy m.in.: kursie budowy robotów, kursie FPGA, kursie Raspberry Pi i jakoś za daleko odszedłem od tego Arduino... Nadrobię to jednak 😉

Udostępnij ten post


Link to post
Share on other sites

Mam arduino.org. Tak jak pisałem, zainstalowałem zgodnie z kursem. Komunikat wyskakuje taki krótki jak napisałem...

Udostępnij ten post


Link to post
Share on other sites

@SOYER: daj programowi szansę i pozwól mu odczytać wartości z czujnika...

Udostępnij ten post


Link to post
Share on other sites

Ethanak, nie rozumiem...

Udostępnij ten post


Link to post
Share on other sites

Popatrz na pierwszy i drugi program. Czego Ci w drugim brakuje?

Jak myślisz - skąd mają się wziąć wartości temperature i humidity?

Rozumiem że kończyłeś Hogwart a nie jakieś głupie technikum - ale w przypadku Arduino magia wiele nie pomoże, natomiast odczytanie danych z czujnika na pewno.

Udostępnij ten post


Link to post
Share on other sites

SOYER, wydaje mi się, że ciągle popełniasz ten sam błąd i nadal nie rozumiesz skąd biorą się wartości zmiennych i kiedy zmieniają. Dlatego jakiś czas temu w innym wątku proponowałem Ci spróbowanie sił z czymś innym niż Arduino i użycie debuggera. Wtedy mógłbyś wykonywać program krok-po-kroku, oglądać jak zmieniają się zmienne i od razu wiele rzeczy stałoby się oczywiste.

Ogólnie - nie ma magicznego powiązdania miedzy zmienną, a jakimś obiektem, powiedzmy pinem, czy wartością pobraną z czujnika. Zmienna to po prostu "pojemnik" na wartość. Ale tą wartość trzeba tam umieścić, więc potrzebne są np. instrukcje readAnalog() do odczytu z przetwornika analogowo-cyfrowego, a w tym programie podpowiem chodzi o:

dht11.read(pinDHT11, &temperature, &humidity, NULL) 

Inaczej zmienna temperature i humidity będzie przechowywała to co tam zostało zapisane (czyli zero) i nigdy nie pokaże wyników pomiarów.

Udostępnij ten post


Link to post
Share on other sites

Elvis, Dzięki jak zwykle jesteś niezawodny. Przeczytaj jeszcze raz moje pytania, właśnie o to pytałem skąd program bierze te zmienne, po prostu wydawało mi się, że te linijki w przykladowym kodzie odnoszą się tylko do wypadku kiedy występuje jakiś błąd. Wiem co to zmienne i że trzeba je kazać programowi wpisać w odpowiednie miejsce. Choć hogwarthu nie ukończyłem;)

Udostępnij ten post


Link to post
Share on other sites
Mam arduino.org. Tak jak pisałem, zainstalowałem zgodnie z kursem. Komunikat wyskakuje taki krótki jak napisałem

Dla formalności dodam, że nie pytałem o wersję środowisko tylko biblioteki, której używasz do obsługi tego czujnika 😉

Udostępnij ten post


Link to post
Share on other sites

Treker napisz jak to sprawdzić. Formalnie problem rozwiązałem inną biblioteką.

Przy okazji DHT, nauczyłem się LCD, przewijania tekstu, używania pętli for i tworzenia funkcji(super ułatwiają pracę):

#include <LiquidCrystal.h> //Dołączenie bilbioteki
#include <SimpleDHT.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu 
int pinDHT11 = 13; //pin czujnika
int maphum; //zmienna do sterowania diodami
SimpleDHT11 dht11; 
#define led1 10 
#define led2 12 
#define led3 9 
#define led4 11 
#define led5 8 
void setup() {
  pinMode(led1, OUTPUT); 
 pinMode(led2, OUTPUT); 
 pinMode(led3, OUTPUT); 
 pinMode(led4, OUTPUT); 
 pinMode(led5, OUTPUT); 
 digitalWrite(led1, LOW); 
 digitalWrite(led2, LOW); 
 digitalWrite(led3, LOW); 
 digitalWrite(led4, LOW); 
 digitalWrite(led5, LOW); 
 Serial.begin(9600); 
}

void loop() {

byte temperature = 0; 
 byte humidity = 0; 
 dht11.read(pinDHT11, &temperature, &humidity, NULL);  //odczyt z czujnika
 maphum = map(((int)humidity), 10, 95, 1, 5);  //mapowanie odczytu wilg. do ster. diodami

 switch(maphum){ //sterowanie diodami na podstawie odczytu wilgotnosci zmapowanego 1-5
   case 1: 
 digitalWrite(led1, HIGH); 
 digitalWrite(led2, LOW); 
 digitalWrite(led3, LOW); 
 digitalWrite(led4, LOW); 
 digitalWrite(led5, LOW); 
   break; 
   case 2: 
 digitalWrite(led1, LOW); 
 digitalWrite(led2, HIGH); 
 digitalWrite(led3, LOW); 
 digitalWrite(led4, LOW); 
 digitalWrite(led5, LOW); 
   break; 
   case 3: 
 digitalWrite(led1, LOW); 
 digitalWrite(led2, LOW); 
 digitalWrite(led3, HIGH); 
 digitalWrite(led4, LOW); 
 digitalWrite(led5, LOW); 
   break; 
   case 4: 
 digitalWrite(led1, LOW); 
 digitalWrite(led2, LOW); 
 digitalWrite(led3, LOW); 
 digitalWrite(led4, HIGH); 
 digitalWrite(led5, LOW); 
   break; 
   case 5: 
 digitalWrite(led1, LOW); 
 digitalWrite(led2, LOW); 
 digitalWrite(led3, LOW); 
 digitalWrite(led4, LOW); 
 digitalWrite(led5, HIGH);
   break; 
 } 
Serial.println(maphum); 
 dzieci();
 wyniki();
 franek();
 wyniki();
 dominik();
 wyniki();
 zosia();

}
void zosia(){
 lcd.begin(16, 2);
 lcd.setCursor(16,0);
 lcd.print(" Czesc Zosia :-)");  //tekst 1 linii
 for (int positionCounter = 0; positionCounter < 33; positionCounter++) {
   lcd.scrollDisplayLeft(); // przesuwamy ww tekst o 33 pozycji w lewo czyli "poza ekran"
   delay(600);  //czas przeskoku o ledną pozycję na wyświetlaczu (szybkosc przewijania)
 }
}
void franek(){
 lcd.begin(16, 2);
 lcd.setCursor(16,1);
 lcd.print(" Czesc Franek :-)");  //tekst 2 linii
 delay(1500);  // czekamy z ww. tekstem
 for (int positionCounter = 0; positionCounter < 35; positionCounter++) {
   lcd.scrollDisplayLeft(); // przesuwamy ww tekst o 35 pozycji w lewo czyli "poza ekran"
   delay(600);  //czas przeskoku o jedną pozycję na wyświetlaczu (szybkosc przewijania)
 }
}
void wyniki(){
 byte temperature = 0; 
 byte humidity = 0; 
 dht11.read(pinDHT11, &temperature, &humidity, NULL);  //odczyt z czujnika
 lcd.begin(16, 2); // ustawiamy lcd dla nast. wyswietlenia
 lcd.setCursor(2, 0); 
 lcd.print("Wilg.: "); 
 lcd.print((int)humidity); 
 lcd.print("%RH"); 
 lcd.setCursor(2, 1); 
 lcd.print("Temp.: "); 
 lcd.print((int)temperature); 
 lcd.print("*C"); // wyswietlamy temp. i wilgotnosc wraz z jednostkami
 delay(3000); // czekamy z ww. tekstem 
 for (int positionCounter = 0; positionCounter < 2; positionCounter++) {
   lcd.scrollDisplayRight(); //przewijamy ww tekst do prawej krawedzi lcd
   delay(1000);// szybkosc przewijania
 }
 for (int positionCounter = 0; positionCounter < 4; positionCounter++) {
   lcd.scrollDisplayLeft(); //przewijamy do lewej krawedzi ww tekst
   delay(1000); // szybkosc przeijania
 }
 for (int positionCounter = 0; positionCounter < 2; positionCounter++) {
   lcd.scrollDisplayRight(); // przewijamy teks znowu do srodka lcd
   delay(1000); //czekamy
 }
 delay(3000);
}
void dominik(){
 lcd.begin(16, 2);
 lcd.setCursor(16,0);
 lcd.print(" Czesc Dominik :-)");  //tekst 2 linii
 delay(1500);  // czekamy z ww. tekstem
 for (int positionCounter = 0; positionCounter < 35; positionCounter++) {
   lcd.scrollDisplayLeft(); // przesuwamy ww tekst o 35 pozycji w lewo czyli "poza ekran"
   delay(600);  //czas przeskoku o ledną pozycję na wyświetlaczu (szybkosc przewijania)
 }
}
void dzieci(){
 int migniecie = 0;
 lcd.begin(16, 2);
 lcd.setCursor(4,0);
 lcd.print("Dominik");  //tekst 1 linii
 lcd.setCursor(2,1);
 lcd.print("Zosia Franek"); //tekst 2 linii
  for(int migniecie =0; migniecie <10; migniecie++){
    lcd.noDisplay();
    delay(500);
    lcd.display();
    delay(500); // 10 krotne migniecie napisu
  }
}

Udostępnij ten post


Link to post
Share on other sites

SOYER, najlepiej po prostu wgrać bibliotekę linkowaną w artykule (dodać ją ręcznie bez posiłkowania się automatycznym instalatorem). Faktycznie, funkcje ułatwiają pisanie programów - dlatego było o tym mówione już w pierwszym poziomie kursu Arduino 🙂

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...