Jak pracovat se senzory DHT22 a DHT11?

Arduino Návody - 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.

Začneme tím nejzákladnějším, zapojíme senzor DHT22 podle schématu. Senzor DHT11 má naprosto totožné zapojení, jako DHT22.

Zapojení senzorů DHT22 a DHT11 s deskou Arduino UNO

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:

Výstup teplotního senzoru DHT22 a DHT11 do seriál monitoru

Občas se však stane, že i po správném zapojení uvidíte něco takového:

Výstup teplotního senzoru DHT22 a DHT11 do seriál monitoru s chybou

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:

Výstup teplotního senzoru DHT22 a DHT11 do seriál monitoru s isnan funkcí

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.

Zapojení DHT22 a DHT11 s deskou Arduino UNO, kde je výstup prezentován na 16x2 LCD displey

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);
 }

 

Zobrazení teploty a vlhkosti na displeji - Arduino návody

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!

Soubory ke stažení pro bastlení s čidly DHT