Witam!
Dzisiaj pragnę zaprezentować mój projekt z użyciem czujnika DHT21, którego zadaniem będzie wyświetlenie aktualnej temperatury i wilgotności na ekranie LCD 2×16 (HD44780) i stworzenie archiwum temperatur w pliku txt na komputerze. Projekt ten piszę ze względu na bardzo małą ilość polskich tutoriali związanych z tym czujnikiem. Zaczynamy!
Potrzebne części to:
-Arduino (korzystam z Leonardo R3, jednak każde powinno zadziałać)
-Czujnik temperatury i wilgotności DHT21 (AM2301) do kupienia np. tu
-Płytka stykowa dowolnej wielkości
-Garść kabelków i drobnicy elektronicznej (rezystor 1k)
-Komputer
-Trochę chęci :)
Do korzystania z czujnika wybrałem bibliotekę od Adafruit, która pomimo, że napisana dla czujników DHT21 i DHT22, doskonale współgra również z naszym.
Może też paść pytanie, dlaczego akurat DHT21? Otóż ma najlepszy stosunek dokładności i zakresu pomiaru do ceny :D
Na sam początek musimy pobrać bibliotekę dostępną tutaj (klikamy przycisk “download ZIP”) i następnie folder skompresowany rozpakować do katalogu /libraries który bez problemu znajdziemy w folderze instalacji Arduino IDE. Ot co, zwykła instalacja biblioteki :D.
Następnym krokiem jest podłączenie naszego niebieskiego przyjaciela do komputera, uruchomienie Arduino IDE i wgranie do pamięci mikrokontrolera następującego kodu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#include "DHT.h" // biblioteka DHT od Adafruit #define DHTPIN 2 // numer pinu sygnałowego #define DHTTYPE DHT21 // typ czujnika (DHT21) DHT dht(DHTPIN, DHTTYPE); // definicja czujnika void setup() { Serial.begin(9600); // otworzenie portu szeregowego dht.begin(); // inicjalizacja czujnika } void loop() { // Odczyt temperatury i wilgotności powietrza float t = dht.readTemperature(); float h = dht.readHumidity(); // Sprawdzamy czy są odczytane wartości if (isnan(t) || isnan(h)) { // Jeśli nie, wyświetlamy informację o błędzie Serial.println("Blad odczytu danych z czujnika"); } else { // Jeśli tak, wyświetlamy wyniki pomiaru Serial.print("Wilgotnosc: "); Serial.print(h); Serial.print(" % "); Serial.print("Temperatura: "); Serial.print(t); Serial.println(" *C"); } } |
Napomknę tylko, że ten kod nie jest mój, jest zaczerpnięty i lekko zmodyfikowany, a dostępny w oryginale tu.
Musimy też oczywiście podłączyć do Arduino nasz czujnik, korzystając z schematu poniżej (dostępny na stronie produktu na botland.com.pl), wkradł im się błąd, z czujnika DHT21 wychodzą tylko 3 piny, nie ma tam 4-tego.
Pin VDD podłączmy pod zasilanie w Arduino (zadziała zarówno w 3.3V jak i w logice 5V), pin GND podłączamy pod masę w arduino, a pin data mostkujemy z pinem VDD korzystając z rezystora 1k lub podobnego i następnie podłączamy pod pin cyfrowy 2 w naszym niebieskim przyjacielu.
Jeśli wszystko wykonaliśmy prawidłowo, otwarcie Serial Monitora, powinno dać nam informację o temperaturze i wilgotności :).
Tak jak napisałem na początku naszym celem jest wyświetlenie aktualnej temperatury i wilgotności na ekraniku LCD i stworzenie ich archiwum na dysku komputera. Tak więc weźmy się za to!
Na początek do naszego układu dołączyć musimy wyświetlacz LCD, schemat posiadam stąd (polecam tam zajrzeć!)
Dodam, że wartość rezystora na schemacie to 220 ohm.
Następnie przepinamy kabelek od DHT21 na złącze o numerze 7, gdyż nasze złącze nr.2 zostało zajęte przez wyświetlacz.
Kolejnym krokiem jest wgranie na Arduino następującego kodu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#include "DHT.h" // biblioteka DHT #include <LiquidCrystal.h> // biblioteka LCD #define DHTPIN 7 // numer pinu sygnaĹ‚owego #define DHTTYPE DHT21 // typ czujnika (DHT11). Jesli posiadamy DHT22 wybieramy DHT22 DHT dht(DHTPIN, DHTTYPE); // definicja czujnika LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // definicja wyswietlacza void setup() { Serial.begin(9600); // otworzenie portu szeregowego dht.begin(); // inicjalizacja czujnika lcd.begin(16, 2); // kolumny i wiersze LCD } void loop() { // Odczyt temperatury i wilgotnoĹ›ci powietrza float t = dht.readTemperature(); float h = dht.readHumidity(); // Sprawdzamy czy sa… odczytane wartoĹ›ci if (isnan(t) || isnan(h)) { // Jezeli nie, wyswietlamy informacje o bledzie Serial.println("Blad odczytu danych z czujnika"); lcd.print("Blad odczytu danych z czujnika"); } else { // Jezeli tak, wyswietlamy wyniki pomiaru na monitorze portu szeregowego Serial.print("Wilgotnosc: "); Serial.print(h); Serial.print(" % "); Serial.print("Temperatura: "); Serial.print(t); Serial.println(" *C"); // I na LCD lcd.print("Wilg: "); lcd.print(h); lcd.print(" %"); lcd.setCursor(0, 1); lcd.print("Temp: "); lcd.print(t); lcd.print(" *C"); lcd.setCursor(0, 0); } } |
Dzięki któremu, jeśli prawidłowo podłączyliśmy wyświetlacz, zobaczymy na nim aktualną temperaturę i wilgotność, odświeżaną średnio co 2 sekundy (taka informacja widnieje w karcie informacyjnej DHT21). Możemy oczywiście sztucznie spowolnić odświeżanie, lecz po co, skoro ekran właściwie prawie nie mruga :).
W celu odbioru informacji na komputerze posłużyliśmy się już wcześniej Serial Monitorem wbudowanym w Arduino IDE, jednakże możemy posłużyć się równie dobrze napisanym przeze mnie programem Comtrol #autoreklama. Do pobrania tutaj, serdecznie polecam :D.
Jednak nawet mój programik nie posiada funkcji zapisu otrzymanych informacji na dysku komputera :(. Aby tego dokonać pobieramy z tej strony program CoolTerm (był na jego temat wpis na majsterkowie który moim zwyczajem oczywiście podlinkuję tu). W celu odbioru danych rozpakowujemy archiwum w dowolne miejsce dysku naszego komputera i uruchamiamy plik .exe. Wchodzimy w Options, tam ustawiamy port szeregowy, na którym znajduje się nasze Arduino (do sprawdzenia np. w Arduino IDE) i następnie wybieramy prędkość transmisjii 9600 bodów, gdyż takową zdefiniowaliśmy w kodzie naszego programu. Następnie klikamy przycisk Connect. Powinny pokazać się nasze odczyty.
Aby zapisać nasze dane w pliku tekstowym, wchodzimy w “Connection -> Capture to Textfile” i wybieramy “Start”. Pokaże się okienko proszące o podanie lokalizacji i nazwy pliku, a po wypełnieniu tych czynności i zapisaniu ich korzystając z guziczka “OK” nasze dane będą dynamicznie zapisywane w pliku który zdefiniowaliśmy, aż do czasu zamknięcia programu.
To w sumie wszystko, dziękuje za uwagę i wesołego roku pańskiego 2016!
Jeszcze fotka gotowego układu:
Polskich tutoriali jest mało może z tego względu że obsługa jest identyczna jak DHT11/22(w sensie programowym)
dodatkowo DHT21 jest gotowym modułem który ma juz w sobie zaimplementowany rezystor podciągający dlatego nie ma potrzeby stosowania kolejnego jak Ty to robisz wystarczy pin 2 podłączyć bezpośrednio do arduino. Takie rozwiązanie jest potrzebne jak stosujesz sam czujnik a nie pełny moduł(choć w wypadku 21 jest to nie możliwe gdyż są to dwa niezależne czujniki połączone w jeden moduł)
Z tym, że ani razu na polskich internetach nie spotkałem się ze zdaniem “obsługa jest taka sama jak DHT22″…
A z drugiej strony skoro jest to gotowy moduł, to czemużby w datasheecie widnieje schemat na którym jest rezystor podciągający? Chociaż może? Sprawdzę, czy bez rezystora czujnik też zadziała :)
#edit
Masz rację, bez rezystora też działa, aczkolwiek zastanawiam się, poco wtedy podają taką informację w datasheecie… Może po to, by móc przesyłać sygnał na większe odległości?
Super !!! Bardzo fajny projekt ;) Ładnie i przejrzysto przedstawiony
Super artykuł. Wszystko ładnie wyjaśnione.
Masz 5!!!
Ja się również nie mogę zgodzić ze stwierdzeniem, że DHT21 jest dobrym wyborem ze względu na stosunek możliwości do ceny. W cenie DHT21 można kupić DHT11, który spełnia dokładnie taką samą rolę i posiada dokładność do 0,5*C.
*2 sztuki DHT11! :)
Tak, tylko zakres pomiaru masz inny, DHT21 mierzy temp. ujemne od -40 st. C a DHT11 tylko dodatnie, czytaj “pokojowe” :)
A projekt jak projekt, ta biblioteka jest prosta jak drut, raptem odczyt wilgotności i dwa odczyty temp. (w C i F) i prezentacja na LCD, banalne bym powiedział :)
Wszystkim którzy w swych wypowiedziach sugerują jakoby gość niepotrzebnie robił to co robi powiem tylko jedno- jesteście buraczanymi cieniaskami-hejtuśkami. Sami zróbcie jakiś projekt i tak ładnie go opiszcie a nie gównarzerie odstawiacie baranie cipki.
Witam,
Dziękuję za artykuł MSSC. Gratulacje precyzyjnie i bezbłędnie.
To moja pierwsza zabawa z Arduino i wszystko działa : )
Chciałbym dołączyć jeszcze kilka takich czujników i zbudować jako niezależny układ z zapisem na karcie SD.
…tylko jeszcze nie wiem jak to zrobić :)
Proszę o podpowiedź jeśli można …
pozdrawiam
GK
Skopiowałem cały sketch wkleiłem do arduino Leonardo i wyskakuje “Bład kompilacji dla płytki arduino Leonardo”. Ktoś może mi pomóc? Co zrobić ?