Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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í.

DHT11 - Arduino - Hardware

Č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:

Čidlo DHT11 pro Arduino - Arduino - Hardware

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, v118:

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.


 

Předchozí článek
Arduino - Měření vzdálenosti infračerveným senzorem VL53L0X
Všechny články v sekci
Arduino - Hardware
Přeskočit článek
(nedoporučujeme)
Arduino - Měření teploty infračerveným teploměrem MLX90614
Článek pro vás napsal Adam Ježek
Avatar
Uživatelské hodnocení:
43 hlasů
Autor se převážně věnuje Arduinu a psaní tutoriálů z této oblasti, občas napíše příležitostně nějakou tu zprávičku. Většinu svého volného času momentálně věnuje Linuxu a/nebo Raspberry Pi. Také umí C#, HTML, CSS, PHP a Python.
Aktivity