Lekce 15 - Arduino - Měření teploty a vlhkosti čidlem DHT11
V minulé lekci, Arduino - Měření vzdálenosti infračerveným senzorem VL53L0X, jsme si ukázali, jak můžeme měřit vzdálenost pomocí vysílání a snímání infračervených paprsků.
V dnešní lekci našeho HW Arduino tutoriálu si představíme další elektronickou komponentu, čidlo DHT11, které využijeme pro měření teploty a vlhkosti. Popíšeme si charakteristiky DHT11 čidla a poté si ukážeme, jak jej zapojit a naprogramovat. Ve zkratce si rovněž připomeneme, jak pracovat s knihovnami.
Knihovny
Jistě už víme, co jsou to knihovny. Bez nich se v mnoha případech
neobejdeme. Mohli bychom si samozřejmě knihovnu vytvořit sami, ale není
důvod nevyužít řešení, které za nás udělal někdo jiný a které
funguje. Většina čidel používá pár drátků a po nich se tahají hodnoty
1
a 0
, jež v Arduinu poté převedeme na to, co
chceme. To většinou není jednoduché, budeme tedy používat knihovny, které
do projektu jen vložíme a využijeme tak připravené řešení.
Několik knihoven je v Arduinu již přidáno, ale pro DHT11 tam knihovna
není. Musíme si ji stáhnout z internetu a do IDE přidat. Otevřeme si menu
Sketch -> Import Library a zvolíme Add Library,
poté vybereme stažený ZIP soubor. Pokud se DHT11 na seznamu neobjeví,
zkusíme IDE restartovat. Pokud zde stále nebude, otevřeme složku pro IDE
(standardně je její umístění
C:\Users\uzivatel\Document\Arduino\
), zde najdeme složku
libraries\
, v ní vytvoříme složku DHT11\
a do ní
extrahujeme archiv a IDE znovu spustíme.
Vraťme se ale k našemu čidlu.
Čidlo DHT11
DHT11 je digitální bezdrátové čidlo, které se používá k měření teploty a vlhkosti vzduchu. Je to jednoduché a cenově dostupné řešení pro ty, kteří potřebují změřit teplotu a vlhkost v prostředí.

Čidlo má čtyři vývody, které se používají k napájení a komunikaci s jinými zařízeními. Tyto vývody jsou označeny jako VCC, GND, DATA a NC (Not Connected, tedy nevyužité).
VCC se připojuje k napájecímu zdroji, GND se připojuje k zemi, DATA se připojuje k digitálnímu vstupu mikrokontroleru a NC se nepoužívá. Čidlo je kompatibilní s mnoha mikrokontrolery, jako je Arduino, a snadno se používá v různých projektech automatizace domácnosti nebo jiných projektech. Jeho přesnost je dobrá a spotřeba energie je nízká.
Podívejme se na uváděné specifikace pro senzor DHT11:
Napájení | 3-5V DC |
Přesnost měření teploty | +/- 2 stupně Celsia |
Přesnost měření vlhkosti | +/- 5% RH |
Rozsah měření teploty | 0-50 stupňů Celsia |
Rozsah měření vlhkosti | 20-90% RH |
Hmotnost | cca 9 g |
Rozměry | cca 40 x 40 x 15 mm |
Tvorba projektu
V projektu bychom mohli pouze posílat po sériové lince naměřené
hodnoty, my si však projekt vytvoříme tak, aby nám vždy předal
požadovaný údaj. Budeme reagovat na chybně zadaný příkaz a také
nastavíme upozornění, které se zobrazí, když bude až moc horko.
Vytvoříme si také vlastní pomocnou funkci odpovez()
, kterou
budeme v hlavní smyčce volat, aby nám odpovídala na požadavky
uživatele.
Schéma zapojení
Nejdříve si připravíme náš obvod. Kromě Arduina budeme potřebovat také čidlo DHT11 a aby to bylo zajímavější, tak si seženeme ještě Piezo buzzer. Všechno pak poskládáme dle následujícího schématu:

Naprogramování čidla DHT11
V hlavičce nejdříve importujeme knihovnu dht11.h
a
deklarujeme čidlo dht11
s názvem cidlo
:
#include <dht11.h>
dht11 cidlo;
Dále deklarujeme konstanty a několik proměnných, které použijeme v programu:
#define PIEZO 53; #define DHT11 12; int horko = 50; int teplota; int vlhkost; String vstup; boolean upozorneni;
Ve funkci setup()
jen nastavíme sériový port:
void setup() { Serial.begin(9600); }
Hlavní smyčka
Ve funkci loop()
přečteme data z našeho čidla a uložíme je
do připravených proměnných:
void loop()
{
cidlo.read(DHT11);
teplota = cidlo.temperature;
vlhkost = cidlo.humidity;
...
}
Funkce cidlo.read()
bere jeden parametr a tím je pin senzoru.
Pomocí funkcí cidlo.temperature
a cidlo.humidity
přečteme teplotu a vlhkost.
POZOR - K obnovení dat nedochází
automaticky, teplota klidně může stoupnou o 50 stupňů, ale dokud znovu
nezavoláme funkci cidlo.read()
, tak k obnovení nedojde a zůstane
tam předchozí hodnota.
V následující podmínce zjistíme, jestli jsou k dispozici nějaká data
na příjmu sériového portu. Pokud ano, uložíme je do proměnné typu
int
s názvem input
. Datový typ int
využíváme kvůli tomu, že si text převedeme na decimální hodnotu, takže
se přijmou jen čísla. Navíc se přijme jen jeden znak. Nakonec je číslo
převedeno na textový řetězec a zavolá se pomocná funkce
odpovez()
, kterou doplníme níže:
if (Serial.available()) { int input =Serial.read(); vstup = String(input, DEC); odpovez(vstup); }
Připojíme podmínky, kde si zjistíme, jestli je horko a případně
spustíme Piezo pomocí funkce tone()
. Ta bere dva až tři
parametry - pin, frekvenci zvuku a volitelný parametr, kde můžeme určit
dobu, po kterou bude buzzer pípat. Pokud jej neuvedeme, tak se Piezo nevypne,
dokud nedojde k volání funkce noTone()
, která vezme jako
parametr pin:
if (teplota > horko) { tone(PIEZO, 1500); if (!upozorneni) { Serial.println("Je moc horko!"); upozorneni = true; } } if (teplota < horko) { noTone(PIEZO); if (upozorneni) { Serial.println("Uz neni horko."); upozorneni = false; } }
Nyní si můžeme doplnit funkci odpovez()
Pomocná funkce
V hlavičce určíme, že nebude mít návratovou hodnotu a bude brát jeden
parametr typu String
:
void odpovez(String vstup)
{
...
}
Funkci doplníme podmínkami, ve kterých zjistíme, zda není ve vstupu
t
nebo v
. Srovnávat budeme decimální hodnotu
našich znaků. Písmeno t
má hodnotu 116
,
v
má 118
:
if (vstup == "116") { Serial.print("Teplota je "); Serial.print(teplota); Serial.println(" stupnu."); } else if (vstup == "118") { Serial.print("Vlhkost: "); Serial.print(vlhkost); Serial.println(" %."); } else { Serial.println("Ajaj, asi sem ti nerozumel. Napis \"t\" pro teplotu a \"v\" pro vlhkost."); }
V těle podmínek vypíšeme požadované hodnoty a ošetříme možnost, že
uživatel zadal jiný znak. Poté se program vrátí do místa ve funkci
loop()
, odkud přešel na pomocnou funkci. Dojde tedy ke kontrole,
jestli není moc horko.
Celý kód projektu
Ukažme si pro jistotu celý náš kód:
#include <dht11.h> dht11 cidlo; #define PIEZO 53; #define DHT11 12; int horko = 50; int teplota; int vlhkost; String vstup; boolean upozorneni = false; void setup() { Serial.begin(9600); } void loop() { cidlo.read(DHT11); teplota = cidlo.temperature; vlhkost = cidlo.humidity; if (Serial.available()) { int input =Serial.read(); vstup = String(input, DEC); odpovez(vstup); } if (teplota > horko) { tone(PIEZO, 1500); if (!upozorneni) { Serial.println("Je moc horko!"); upozorneni = true; } } if (teplota < horko) { noTone(PIEZO); if (upozorneni) { Serial.println("Uz neni horko."); upozorneni = false; } } delay(100); } void odpovez(String vstup) { if (vstup == "116") { Serial.print("Teplota je "); Serial.print(teplota); Serial.println(" stupnu."); } else if (vstup == "118") { Serial.print("Vlhkost: "); Serial.print(vlhkost); Serial.println(" %."); } else { Serial.println("Ajaj, asi sem ti nerozumel. Napis \"t\" pro teplotu a \"v\" pro vlhkost."); } }
Nyní máme funkční DHT11 senzor. Tento kód si nahrajeme do Arduina a náš projekt vyzkoušíme.
V další lekci, Arduino - Měření teploty infračerveným teploměrem MLX90614 , si představíme infračervený teploměr MLX90614, v novém projektu si pak ukážeme, jak jej zapojit a naprogramovat. Lekci zakončíme teoretickou částí o černých tělesech, v níž si vysvětlíme, na jakém principu teploměr funguje.