3. Przykładowy program #1: odczyt temperatury i wilgoci
Program będzie miał za zadanie wysyłać do terminala dane o wilgotności, temperaturze i indeksie temperatury.
Schemat:

Program:
|
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 |
#include "DHT.h" //importuj biblioteke DHT.h DHT czujnik(10, DHT11); //utworz instancje dht dla czujnika DHT11 podlaczonego do pinu 10. float wilgotnosc,temperatura,indeksTemperauty; //utworz zmienne przecinkowe dla odczytu wilgotnosci temperatury i indeksu void setup() { Serial.begin(9600); //uruchom UART z predkoscia 9600 baud Serial.println("Pomiar temparatury i wilgotnosci. Kurs Aruino feriar-lab.pl"); czujnik.begin(); //uruchom modul DHT } void loop() { wilgotnosc = czujnik.readHumidity(); //przypisz zmiennej wilgotnosc odczyt wilgotnosci powietrza temperatura = czujnik.readTemperature(); //przypusz zmiennej temperatura oczyt temperatury indeksTemperauty = czujnik.computeHeatIndex(temperatura, wilgotnosc, false); //przypisz zmiennej indeks Temperatury oczyt indeksu Temperatury w st. C Serial.println("=========================================="); Serial.print("Wilgotnosc: "); Serial.print(wilgotnosc); Serial.println(" %"); Serial.print("Temperatura: "); Serial.print(temperatura); Serial.println(" *C "); Serial.print("Indeks temperatury: "); Serial.print(indeksTemperauty); Serial.println(" *C "); Serial.println("=========================================="); delay(2000); //odczekaj 2 sekund miedzy pomiarami } |
Program działa następująco. Importujemy bibliotekę DHT.h i tworzymy instancję dla czujnika o nazwie czujnik i konfigurujemy go dla DHT11 podłączonego do pinu 10. Definiujemy zmienne do odbioru danych jako float (liczba zmiennoprzecinkowa) Następnie w pętli startowej uruchamiamy UART do obioru danych oraz sam czujnik. Teraz w pętli głównej programu przypisujemy zmiennym kolejno: odczyt wilgotności, temperatury oraz indeksu temperatury. Następnie otrzymane informacji drukujemy na monitor portu szeregowego, a następnie odczekujemy 2 sekundy.
Efekt powinniśmy uzyskać taki:

Wszystko wydaje się w porządku, ale gdy wystąpi jakiś błąd to będziemy otrzymywać takie komunikaty:

Jak widać, zamiast wartości zostaje zwracane nan. NaN, a dokładniej Not-a-Number, czyli zwrócona wartość nie jest liczbą. Możemy ją głównie spotkać przy zmiennych typu int,float,double itp. gdzie zwracaną wartością są same liczby. Aby uniknąć błędu w takiej postaci możemy go ładnie zastąpić komunikatem. W tym celu wystarczy sprawdzić, czy dla tych zmiennych zwróconą wartością jest NaN. Można to wykonać np. w taki sposób:
|
1 2 3 4 5 6 7 |
if (isnan(wilgotnosc) & isnan(temperatura) & isnan(indeksTemperauty)) { Serial.println("Błąd oczytu z czujnika. Sprawdź połączenie"); return; } |
Wtedy powinniśmy otrzymać taki komunikat:

Tyle o tym programie. Teraz rozszerzymy nasz program o wyświetlacz.
4. Przykładowy program #2: Łączymy czujnik z LCD HD44780
Schemat:

Program:
|
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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
#include "DHT.h" //importuj bibliotekę DHT.h #include <LiquidCrystal.h> //importuj bibliotekę LiquidCrystal.h DHT dht(10, DHT11); //utworz instancje dht dla czujnika DHT11 podlaczonego do pinu 10. LiquidCrystal lcd(3,4,5,6,7,8,9); //konfigurujemy ekran: //RS - pin 3 //RW - pin 4 //E - pin 5 //D4 - pin 6 //D5 - pin 7 //D6 - pin 8 //D7 - pin 9 byte znak_stopnia[8] = { //tworzymy znak stopnia 0b00100, 0b01010, 0b10001, 0b01010, 0b00100, 0b00000, 0b00000, 0b00000 }; float wilgotnosc,temperatura,indeksTemperauty; //utworz zmienne przecinkowe dla odczytu wilgotnosci temperatury i indeksu void setup() { lcd.createChar(0, znak_stopnia); //utworz znak stopnia Serial.begin(9600); //uruchom UART z predkoscia 9600 baud Serial.println("Pomiar temparatury i wilgotnosci. Kurs Aruino feriar-lab.pl"); lcd.begin(20,4); //ustaw rozdzielczość ekranu 20x4 lcd.clear(); //wyczysc ekran dht.begin(); //uruchom modul DHT lcd.setCursor(2,1); //ustaw kursor w pozycji 2,1 (od 2 znaku po lewej, 2. rząd) lcd.print("Odczyt z DHT11"); lcd.setCursor(3,3); lcd.print("feriar-lab.pl"); delay(1000); } void loop() { delay(2000); lcd.clear(); //wyczyść bufor ekranu wilgotnosc = dht.readHumidity(); //przypisz zmiennej wilgotnosc odczyt wilgotnosci powietrza temperatura = dht.readTemperature(); //przypusz zmiennej temperatura oczyt temperatury indeksTemperauty = dht.computeHeatIndex(temperatura, wilgotnosc, false); //przypisz zmiennej indeks Temperatury oczyt indeksu Temperatury w st. C if (isnan(wilgotnosc) & isnan(temperatura) & isnan(indeksTemperauty)) { lcd.setCursor(0,1); lcd.print(" Blad czujnika"); lcd.setCursor(0,2); lcd.print(" Podlacz ponownie"); return; } lcd.setCursor(3,0); lcd.print("Odczytano dane"); lcd.setCursor(0,1); lcd.print("Wilgotnosc: "); lcd.print(wilgotnosc); lcd.print("%"); lcd.setCursor(0,2); lcd.print("Temperatura: "); lcd.print(temperatura); lcd.print((char)0); lcd.print("C"); lcd.setCursor(0,3); lcd.print("Indeks temp: "); lcd.print(indeksTemperauty); lcd.print((char)0); lcd.print("C"); } |
Efekt działania programu
Materiał do pobrania do tej części kursu:
Podsumowanie:
Po tej części kursu powinieneś umieć:
- rozróżniać moduły DHT11/21/22
- napisać program do odczytu temperatur i wilgotności powietrza
Jeżeli chcesz być informowany na bieżąco o nowych częściach kursu to kliknij „Lubię to!” bądź subskrybuj naszą stronę, aby otrzymywać na adres e-mail nowości ze strony. Jeżeli masz jakieś pytania to śmiało zadawaj je na forum ; )