Jak pracovat se senzory DHT22 a DHT11?
Na e-shopu se objevila také čidla teploty a vlhkosti DHT22 a DHT11 a my pro vás máme podrobný Arduino návod, jak tyto senzory naplno využít ve vašich projektech. Mezi zajímavé Arduino projekty, kde se dá využít senzor DHT, patří např. domácí termostat, chytrý skleník a samozřejmě nesmí chybět různé variace meteostanice.
zapojení senzorů dht22 a dht11
Senzor dosáhl své popularity nejen díky skvělým výkonům v oblasti měření, ale také díky velice jednoduchému zapojení. Abychom se jen nebavili, tak si vše rovnou ukážeme na příkladech, ke kterým budete potřebovat následující Arduino věcičky.
- Arduino deska (například Arduino UNO)
- senzor DHT22 nebo DHT11
- 1 x rezistor 10 kΩ
- propojovací vodiče
- kontaktní pole (breadboard)
Začneme tím nejzákladnějším, zapojíme senzor DHT22 podle schématu. Senzor DHT11 má naprosto totožné zapojení, jako DHT22.
Proč je tam rezistor, když to funguje i bez něj? Je to kvůli sběrnici. Rezistor v tomto případě je tzv. „pull-up rezistor“ a slouží k tomu, aby vodič sběrnice táhl napěťově nahoru, k logické jedničce (měkké jedničce). V praxi to znamená, že zabráníme rušení, tudíž může být vodič delší. A proč právě 10 kΩ? Je to „zlatá střední cesta“. Pokud by však byl vodič mnohem delší, musíme hodnotu pull-up rezistoru snížit. Snížením rezistoru ale v obvodu potečou větší proudy, což je nevýhodné například při provozu z baterie.
programování snímače teploty a vlhkosti
Tento program má jednoduchý úkol – zjistit naměřené hodnoty a vypsat je na sériové lince. Nezapomeňte importovat knihovny! Jedná se o knihovnu DHT, kterou vidíme v programu a "neviditelnou" knihovnu, která v programu vidět není, ale je nezbytná pro chod, má jméno "Adafruit_Sensor-master". Knihovny jsou ke stažení na konci návodu. Pokud nevíte jak importovat knihovny, podívejte se na Arduino návod "Jak správně naimportovat knihovnu?".
#include "DHT.h" // číslo pinu Arduina, kam je připojený DATA pin senzoru DHT #define DHTPIN 2 // řekneme, že senzor je typu DHT-22 #define DHTTYPE DHT22 // pro případ, že by byl senzor typu DHT-11 //#define DHTTYPE DHT11 // do proměné dht uložíme údaje o již nadefinovaném senzoru DHT dht(DHTPIN, DHTTYPE); // vytvoříme proměnou pro vlhkost (humidity) float hum; // vytvoříme proměnou pro teplotu (temperature) float temp; void setup() { // zapneme sériovou linku a určíme rychlost 9600 baudů Serial.begin(9600); // aktivujeme komunikaci senzoru DHT dht.begin(); } void loop() { // načteme informaci (vlhkost) z čidla a uložíme jí do proměné hum hum = dht.readHumidity(); // načteme informaci (teplota) z čidla a uložíme jí do proměné temp temp = dht.readTemperature(); // vypíšeme informace po sériové lince Serial.print("Vlhkost: "); Serial.print(hum); Serial.print(" %, Teplota: "); Serial.print(temp); Serial.println(" Celsius"); // počkáme 2s před opakováním měření delay(2000); }
Pokud vše funguje správně, dostane se vám následujícího pohledu:
Občas se však stane, že i po správném zapojení uvidíte něco takového:
Co vlastně to „nan“ znamená? Znamená to, že veličina nebyla naměřená / zpracovaná. V každém případě se jedná o chybu měření. To, že se nám veličina z nějakého důvodu nenaměří, neopravíme, ale zařídíme, aby se například tato chyba nezapsala na SD kartu nebo se neposlala dál ke zpracování. K tomu nám poslouží funkce „isnan“, její použití a aplikaci si ukážeme v následujícím programu.
#include <DHT.h> #define DHTPIN 2 #define DHTTYPE DHT22 DHT dht(DHTPIN, DHTTYPE); float hum; float temp; void setup() { Serial.begin(9600); dht.begin(); } void loop() { hum = dht.readHumidity(); temp = dht.readTemperature(); // až do teď se v programu nic nezměnilo // pokud je hodnota "hum" nebo "temp" nan, tak: if (isnan(hum) || isnan(temp)) { // vypíšeme po sériové lince "Chyba cteni" Serial.println("Chyba cteni!"); } // pokud jsou obě hodnoty v pořádku, tak: else { Serial.print("Vlhkost: "); Serial.print(hum); Serial.print(" %, Teplota: "); Serial.print(temp); Serial.println(" Celsius"); } delay(2000); }
Výsledek by měl vypadat takto:
Proč vlastně vzniká chyba? V datasheetu čidla DHT22 se dočtete: „Sampling rate = 0.5 Hz“, což je jediná nevýhoda tohoto senzoru. V překladu to znamená, že můžete dostat nová data pouze jednou za 2 sekundy (proto je delay 2000). Pokud se budete snažit data získat častěji, může dojít k chybě čtení.
zapojení čidla s LCD displejem
Abychom se oprostili od sériové linky, tak si ukážeme, jak zkombinovat čidlo DHT22 s 16x4 LCD displejem.
- řídící deska Arduino UNO
- senzor DHT22
- 1 x 10 kΩ rezistor
- LCD displej 20x4 nebo 16x2
- Trimr 10 kΩ (potenciometr)
- propojovací vodiče
- kontaktní pole (breadboard)
Zapojení displejů 20x4 a 16x2 je naprosto totožné, jediný rozdíl je v kódu. Pokud ještě nevíte, jak zprovoznit LCD, pak navštivte Arduino návod věnovaný právě LCD displeji.
// importování knihovny pro čidlo DHT22 #include <DHT.h> // importování knihovny pro LCD (je součásti IDE) #include <LiquidCrystal.h> #define DHTPIN_22 8 #define DHTTYPE_22 DHT22 float hum_22; float temp_22; DHT dht_22(DHTPIN_22, DHTTYPE_22); // definice pinů pro lcd LiquidCrystal lcd(7, 6, 5, 4, 3, 2); void setup() { Serial.begin(9600); dht_22.begin(); // řekněme, že displej je 20x4, kdo má 16x2 nebo 16x4 musí to přepsat lcd.begin(20, 4); } void loop() { hum_22 = dht_22.readHumidity(); temp_22 = dht_22.readTemperature(); delay(250); Serial.println("DHT 22: "); Serial.print("Vlhkost: "); Serial.print(hum_22); Serial.print(" %, Teplota: "); Serial.print(temp_22); Serial.println(" Celsius"); // 1. znak, 1. řádek (čísluje se od 0, zleva, zvrchu) lcd.setCursor(1,1); lcd.print("Tep.: "); lcd.print(temp_22); lcd.print(" "); lcd.print((char)223); lcd.print("C"); lcd.setCursor(1,2); lcd.print("Vlh.: "); lcd.print(hum_22); lcd.print(" %"); delay(2000); }
Shrnutí Arduino návodu pro senzory DHT
V tomto návodu jsme si ukázali, jak používat senzory DHT, jejich zapojení, programovaní a jednoduché příklady. Pokud jste něčemu nerozuměli, tak se neváhejte zeptat pod článkem v sekci "komentáře", popřípadě navštívit další návody na stránce Arduino návody, nebo na stránce www.arduino.cz.
Bastlení ZDAR!