4. díl - Arduino - Čidlo DHT11 a konstrukce jazyka

Hardware PC Arduino Arduino - Čidlo DHT11 a konstrukce jazyka

V minulém tutoriálu o Arduinu jsme si hráli s LEDkami. V dnešním díle si představíme čidlo teploty a vlhkosti DHT11. Také si povíme něco o knihovnách a podíváme se částečně na konstrukci jazyka pro Arduino.

Knihovny

Než začnete s DHT11, tak byste měli vědět, co jsou to knihovny, bez kterých se v mnoha případech neobejdete (tedy vlastně ano, ale proč se s něčím patlat, když už to za nás udělal někdo jiný a funguje to). Většina čidel používá pár drátků a po nich se tahají 1 a 0, které v Arduinu poté převedeme na to, co chceme. To většinou není jednoduché a tak budeme používat knihovny, které do projektu jen vložíme a ono se to už dořeší samo. Několik knihoven je v Arduinu již přidáno, ale myslím, že DHT11 součástí není. Pokud si v Arduino IDE otevřete položku Sketch > Import library, uvidíte zde všechny knihovny. Pokud zde není DHT11, tak si ji stáhneme zde, alternativní download zde. Poté v Sketch > Import Library > Add Library vybereme stažený zip. Pokud se DHT11 na seznamu neobjeví, zkuste IDE restartovat. Pokud zde stále nebude, otevřete složku pro IDE (standardně C:\Users\uziva­tel\Document\Ar­duino), zde složku libraries, v ní vytvořte složku DHT11 a do ní vyextrahujte archiv a spusťte znovu IDE a knihovna by zde měla být.

DHT11

Čidlo DHT11 pro Arduino

DHT11 je modré čidlo se 4 vývody, které je schopné měřit teplotu a vlhkost. Pokud jej otočíme cedulkou dolu a mřížkou nahoru, tak piny zleva jsou Vin, Data, NC a GND - Vstup napájení, Datový pin, 3. je NC - Not Connected, tudíž jej nebudeme využívat a poslední je zem. Podle štítku je schopný běžet od 3,5 do 5,5 V, ale já používám jen 5V. Má být schopné měřit teplotu od 0 do 50 ℃, ale při používání fénu ukazuje až do 78 (dál jsem již nešel, ale búh ví, jestli je to přesné). Každopádně v kódu pak jdeme i přes oněch 50. Vlhkost měří prý od 20% do 90%, ale bůhví jak to je, pro mě je vlhkost další z nepotřebných věcí :)

Aby to nebylo strohé posílání teploty a času po sériové lince, tak nám Arduino bude na žádost říkat požadované údaje. Bude reagovat na chybně zadaný příkaz a také nám řekne, kdy bude až moc horko. Ačkoliv bude možnost to všechno udělat na pár řádků, v rámci tutoriálu to rozvedu do naprosto zbytečných, ale pro ukázku možností jazyka vhodných funkcí. Kromě funkcí setup a loop si můžeme vytvářet vlastní, takže si vytvoříme funkci odpovez, kterou si v loop budeme volat, aby nám odpovídala na uživatele. Také se v loopu bude kontrolovat, zda náhodou není moc horko.

Nejdříve ale zapojení. Kromě Arduina budeme potřebovat také čidlo DHT11 a aby to bylo zajímavější, tak si seženeme ještě PIEZO reproduktorek. Všechno pak poskládáme dle následujícího schématu:

Čidlo DHT11 pro Arduino

A nyní k programu

#include <dht11.h>
dht11 cidlo;
int piezo = 53;
int horko = 50;
int dht11pin = 12;
int teplota;
int vlhkost;
String vstup;
boolean upozorneni = false;

void setup()
{
  Serial.begin(9600);
}

void loop()
{

  cidlo.read(dht11pin);
  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 == false){
      Serial.println("Je moc horko!");
      upozorneni = true;
    }
  }
  if (teplota < horko) {
    noTone(piezo);
    if(upozorneni == true){
      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.");
    }

}

Tento kód si nahrajeme do Arduina. Většina by nám již měla být jasná, ale pro jistotu vysvětlím vše.

#include <dht11.h>

Naimportujeme knihovnu dht11. To se nám udělá samo, když knihovnu přidáme přes Sketch > Import Library.

dht11 cidlo;

Deklarujeme čidlo dht11 s názvem cidlo

int piezo = 53;
int horko = 50;
int dht11pin = 12;
int teplota;
int vlhkost;
String vstup;
boolean upozorneni = false;

Deklarace několika proměnných - piny, horko a pár dalších potřebných co použijeme v programu. V setupu jen nastavíme sériový port.

cidlo.read(dht11pin);

Přečteme data z našeho čidla s názvem cidlo. Funkce read bere jeden parametr a tím je pin. Zde je použita proměnná dht11pin, takže při přepojení čidla jen stačí přepsat jeden řádek na začátku programu.

teplota = cidlo.temperature;
vlhkost = cidlo.humidity;

Pomocí funkcí cidlo.temperature a cidlo.humidity přečteme teplotu a vlhkost. POZOR - nedochází k obnovení dat, teplota klidně může stoupnou o 50 stupňů, ale dokud znovu nezavoláme funkci cidlo.read(), tak k obnovení nedojde a zůstane tam ta předchozí hodnota.

if (Serial.available())
{
   int input =Serial.read();
   vstup = String(input);
   odpovez(vstup);
}

Zde si v if zjistíme, jestli jsou k dispozici nějaká data na příjmu sériového portu a pokud ano, tak je uložíme do proměnné int input. Int kvůli tomu, že se posílají čísla - text je převeden na decimální hodnotu, takže se přijmou jen čísla a navíc se přijímá jen znak po znaku, takže příjem textu by byl ještě těžší a budeme tomu věnovat speciální lekci. Poté je číslo převedeno na textový řetězec, ačkoliv to není potřeba, tak je to zde pro ukázku uděláno. Poté se zavolá funkce odpovez, kterou máme deklarovanou níže.

Poté je zde další if, kde si zjistíme, jestli je horko nebo ne a spustí se funkce tone(), která bere 2 (3) parametry - pin, frekvence zvuku (tu si zkuste sami) a třetí parametr je volitelný. Je jím doba po kterou bude pípat. Pokud tam nic nebude, tak se nevypne dokud nedojde k vyvolání funkce noTone(), která vezme jako parametr pin.

void odpovez(String vstup)
{
}

Výše je deklarace nové funkce, která bere vstupní parametr typu String. Pak zde máme už jen if, ve kterém zjistíme, zda není ve vstupu t, v nebo něco jiného. Jak jsem již psal, převod textu necháme na jindy, takže pouze zkontrolujeme decimální hodnotu toho znaku. T má 116, v má 118 a tak dále. Pokud potřebujete zjistit decimální hodnotu onoho znaku, tak si můžete před volání odpovez() přidat řádek

Serial.println(vstup);

a po zadání znaku se hned napíše jeho hodnota. Nebo můžete trochu zagooglit. Poté už zde máme jen vypsání hodnoty přes sériovou linku a program se vrátí do místa v loop, kde přešel na jinou funkci. Dojte tedy ke kontrole, jestli není moc horko.

Jak to funguje je ukázáno na videu níže. Celý soubor s kódem dávám ke stažení. Pozor, video je od 0:20 hlučnější kvůli fénu a zůstává to po skoro celém zbytku!

Příště bude kódový zámek a membránová klávesnice :)


 

Stáhnout

Staženo 247x (1.16 kB)
Aplikace je včetně zdrojových kódů

 

  Aktivity (1)

Článek pro vás napsal Adam Ježek
Avatar
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.

Jak se ti líbí článek?
Celkem (13 hlasů) :
4.538464.538464.538464.538464.53846


 


Miniatura
Předchozí článek
Arduino - Hrajeme si s LEDkami
Miniatura
Všechny články v sekci
Arduino
Miniatura
Následující článek
Arduino - Klávesnice

 

 

Komentáře
Zobrazit starší komentáře (14)

Avatar
Ondřej Pohořelý:

Tak já nevím jak to zapojit dělám to podle tutoriálu (jen bez pieza) ale stejně to nejde a když to dám do 3.3v tak Zeleně svítí jen maličko a oranžová (aref) zhasne ale pomaličku

Odpovědět 20. ledna 19:25
Nezastavuj se dlouho protože život nikdy nečeká !
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na Ondřej Pohořelý
Adam Ježek:

Je tam zkrat, nebo něco s čidlem, normální se takhle nechová.

Odpovědět 20. ledna 20:40
Programátor dělá co může. Počítač co chce. | Pokud mi dáš mínus, tak prosim, napiš proč!
Avatar
Odpovídá na Adam Ježek
Ondřej Pohořelý:

vvyřešeno měl jsem zapojeno obráceně

Odpovědět 20. ledna 21:52
Nezastavuj se dlouho protože život nikdy nečeká !
Avatar
lelixus
Člen
Avatar
lelixus:

Potřebuji radu. Potřebuji odečíst 2 stupně dolů.
A nevím jestli je správne dopsat do kodu "teplota = cidlo.temperature -2;" k odečtení dojde.
Ale jestli je to správně .

 
Odpovědět 3. března 0:20
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na lelixus
Adam Ježek:

je to spravne, proc by nemelo byt?

Odpovědět 3. března 7:17
Programátor dělá co může. Počítač co chce. | Pokud mi dáš mínus, tak prosim, napiš proč!
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Adam Ježek
ostrozan:

To je prostě ta negativní stránka arduina - všechno na zlatém podnose a pak takové otázky ;-)

 
Odpovědět 3. března 7:28
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Daniel Vítek:

Proč je to čidlo zapojeno na PWM? Není PWM výstup?

 
Odpovědět 3. března 14:58
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Daniel Vítek
ostrozan:

Až na výjimky jsou všechny piny I/O jestli to bude vstup nebo výstup se určuje nastavením registrů portu .

 
Odpovědět 3. března 16:40
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovídá na Daniel Vítek
Adam Ježek:

Dá se použít jako PWM, ale taky se dá použít jako úplně normální I/O port, takže je to naprosto jedno.

Odpovědět 3. března 17:48
Programátor dělá co může. Počítač co chce. | Pokud mi dáš mínus, tak prosim, napiš proč!
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Daniel Vítek
ostrozan:

Pro doplnění : funkce pinů se určuje pomocí pinMode() - zde se o to stará knihovna dht11 která pin dokonce využíva jako vstup i jako výstup.

 
Odpovědět 3. března 19:17
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 24. Zobrazit vše