Tento článok bude o meraní vlhkosti a teploty pomocou relatívne známeho senzora DHT11. Ukážeme si ako ho správne zapojiť, napísať jednoduchý kód a samozrejme spomenieme aj jeho vlastnosti.

Senzor DHT11

V tejto časti spomenieme dôležité parametre senzora DHT11. Tento senzor dokáže okrem merania vlhkosti vzduchu, merať aj teplotu. Tabuľka nižšie ukazuje podrobnejšie informácie.

Veličina Rozsah Presnosť
Vlhkosť (Humidity) 20 - 90%RH +/-5%RH
Teplota (Temperature) 0 - 50°C +/-2°C

Senzor je plne digitálny. Obsahuje rýchly 8bitový mikrokontrolér ku ktorému sú pripojené senzory teploty a vlhkosti vzduchu. Senzor vlhkosti vzduchu je rezistívného typu. Senzor teploty je typu NTC.

Senzor DHT11 je sa vyznačuje veľkou spoľahlivosťou a vynikajúcou dlhodobou stabilitou.

Výhody:

  • Spoľahlivosť
  • Stabilita
  • Kalibrácia pri výrobe
  • Cena (>2€)

Nevýhody

  • Možno komunikácia (Single-Wire Serial Interface), ale to je môj osobný názor. Privítal by som I2C :).

Popis vývodov

Vľavo na obrázku je popis jednotlivých vývodov senzora DHT11.

Vývod číslo 3 (NC) nemá žiadnu funkciu.

Vývod číslo 2 (DATA) je výstup dát.

Senzor DHT11 je možné nájsť ako modul, ktorý má tri vývody. Takýto modul už v sebe obsahuje pullup rezistor, ktorý je väčšinou aj tak potrebný.

Spôsob komunikácie so senzorom

So senzorom komunikujeme pomocou sériovéj linky ale len jedným vodičom. Jedná so o Single-Wire Serial Interface (jednovodičové sériové rozhranie). Takáto komunikácia prebieha asi takto: dajme tomu, že chceme načítať aktuálne údaje zo senzora. Senzor DHT11 máme pripojený k MCU, prepojíme DATA výstup s niektorým z vstupno/výstupných vývodov na MCU. MCU (napr. Arduino) vyšle najprv štartovací signál - toto v praxi urobíme tak, že pripojíme vývod na zem na určitú dobu (milisekundy alebo mikrosekundy - záleží na použitom type senzora). Po uplynutí tejto doby nastavíme späť vývod na vysokú hodnotu (log. 1) a čakáme na príjem dát zo senzora. Senzor by mal poslať data o veľkosti 40 bitov. Tieto dáta obsahujú údaje zo senzorov. Viac informácii o senzore nájdete v datasheete.

Príklad č. 1 - Testovacie zapojenie

V tomto zapojení si ukážeme ako správne pripojiť senzor DHT11 k Arduinu a ako z neho získať požadované údaje.

Zapojenie na kontaktnom poli

 

Schéma zapojenia

Ako je vidieť na obrázku zapojenie je veľmi jednoduché. Pullup rezistor zapojíme medzi vývody VCC (5V) a DATA, jeho hodnota je 10kohm.

Zdrojový kód

Zdrojový kód v súbore ArduinoDHT11.ino

#include <DHT.h>

#define DHT_PIN 8

DHT dht;

void setup()
{
	Serial.begin(9600);
	Serial.println();
	Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)");

	dht.setup(DHT_PIN);
}

void loop()
{
	delay(dht.getMinimumSamplingPeriod());

	float humidity = dht.getHumidity();
	float temperature = dht.getTemperature();

	Serial.print(dht.getStatusString());
	Serial.print("\t");
	Serial.print(humidity, 1);
	Serial.print("\t\t");
	Serial.print(temperature, 1);
	Serial.print("\t\t");
	Serial.println(dht.toFahrenheit(temperature), 1);
}

 

Popis zdrojového kódu

Prejdeme k zdrojovému kódu. V programe použijeme knižnicu DHT, ktorá v sebe zahŕňa komunikáciu so senzorom. Nemusíme teda riešiť komunikáciu a časovanie, vytvoríme len objekt dht, teda instanciu triedy DHT (viď riadok 5).

V setup metóde máme nastavenie sériového rozhrania a nastavenie DHT knižnice.

dht.setup(DHT_PIN);

Zavolaním setup metódy na objekte dht, máme nastavenú knižnicu DHT a môžeme s ňou pracovať ďalej. Metóda má jeden vstupný parameter, ktorým je číslo vývodu. V tomto príklade použijeme vývod číslo 8.

V loop metóde máme na začiatku oneskorenie. Toto oneskorenie sme získali z dht objektu. Je to minimálny interval, ktorým môžeme získavať údaje zo senzora. Ak by sme chceli nastaviť menší čas na dotazovanie sa o údaje, senzor by pravdepodobne neodpovedal, resp. nevracal by žiadne dáta.

Po uplynutí tohto času môžeme požiadať senzor o aktuálne údaje viď riadky 20 a 21. Trieda DHT obsahuje na to špeciálne funkcie:

float humidity = dht.getHumidity(); // nacitanie aktualnej vlhkosti vzduchu
float temperature = dht.getTemperature(); // nacitanie aktualnej teploty

Tieto údaje môžeme následne poslať cez sériové rozhranie do PC, alebo zobraziť na displeji.

V tomto príklade ich pošleme do PC sériovým portom. Spolu s tymito údajmi posielame aj teplotu vo fahrenheitoch (riadok 29) a stav (riadok 23) získaný metódou getStatusString().

Príklad č. 2 - Zobrazenie údajov na displeji

Druhý príklad bude možno pre niekoho zaujímavejší. Získané údaje zo senzora zobrazíme na LCD displeji.

Zapojenie na kontaktnom poli

V zapojení nám teda pribudol LCD displej 16x2, samozrejme je možné použiť aj iný napr. 20x4, ale nám tentokrát postačí 16x2. Senzor je zapojený rovnako ako v predchádzajúcom príklade.

Schéma zapojenia

 

Zdrojový kód

Zdrojový kód v súbore ArduinoDHT11_2.ino

#include <LiquidCrystal.h>
#include <DHT.h>

#define DHT_PIN 8

/* Definicia znaku 'stupen' */
byte degree[8] = {
	0b01100,
	0b10010,
	0b10010,
	0b01100,
	0b00000,
	0b00000,
	0b00000,
	0b00000
};

DHT dht;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
	lcd.createChar(0, degree);
	lcd.begin(16, 2);
	dht.setup(DHT_PIN);
}

void loop()
{
	delay(5000);
	
	float humidity = dht.getHumidity();
	float temperature = dht.getTemperature();
	
	lcd.clear();
	lcd.setCursor(0,0);
	lcd.print("Vlhkost: ");
	lcd.print(int(humidity));
	lcd.write(' ');
	lcd.print("%");
	
	lcd.setCursor(0,1);
	lcd.print("Teplota: ");
	lcd.print(int(temperature));
	lcd.write(' ');
	lcd.write(byte(0));
	lcd.write('C');
}

Popis zdrojového kódu

V zdrojovom kóde nám pribudla knižnica LiquidCrystal na prácu s LCD displejom. Definícia vývodu pre senzor DHT11 nám ostala rovnaká.

Na riadkoch 7 až 16 môžete vidieť definíciu znaku "stupeň" (º), ktorý budeme zobrazovať na displeji spolu s teplotou zo senzora.

Prejdeme hneď k metóde loop, pretože všetko v kóde už poznáte veľmi dobre z predchádzajúcich článkov.

Tentokrát máme na začiatku 5 sekundové oneskorenie.

delay(5000);

Kľudne môže byť rovnaké ako v príklade 1, ale myslím, že údaje bude stačiť aktualizovať každých 5 sekúnd. Tzn. že každých 5 sekúnd sa nám na displeji zobrazí aktuálna vlhkosť vzduchu a teplota.

Údaje dostaneme na displej veľmi jednoducho viď riadky 38 a 44.

lcd.print(int(humidity));
lcd.print(int(temperature));

Funkciou int() sme skonvertovali float na int čím sme vlastne "odsekli" desatinnú časť z aktuálnych hodnôt vlhkosti a teploty. Táto operácia nie je nutná, ak chcete zobrazovať presnejšie údaje jednoducho len nepoužijete funkciu int().

lcd.print(humidity);
lcd.print(temperature);

 

Tip na koniec

Ešte spomeniem, že s knižnicou DHT je možné použiť aj senzory s označením DHT22, AM2302 a RHT03. Napríklad senzor DHT22merací rozsah väčší ako DHT11. Konkrétne vlhkosť dokáže merať v rozmedzí od 0 do 100% (± 2%), teplotu od -40 do +80°C (±0.5°C).

Záver

Dozvedeli sme sa niečo o senzore DHT11, poznáme teda jeho vlastnosti, výhody aj nevýhody. Ukázali sme si na jednoduchých príkladoch ako ho použiť v praxi. Využili sme na to knižnicu DHT, ktorá obsahuje všetky potrebné funkcie na jednoduchú komunikáciu so senzorom. S touto knižnicou je možné použiť aj iné senzory napríklad DHT22, AM2302 a RHT03.
Ak budete mať nejaké otázky napíšte ich do komentára a ja vám na ňe rád odpoviem.