Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

4. diel - Arduino - Senzor DHT11 a konštrukcie jazyka

V minulom tutoriále o Arduino sme sa hrali s LEDkami. V dnešnom dieli si predstavíme snímač teploty a vlhkosti DHT11. Tiež si povieme niečo o knižniciach a pozrieme sa čiastočne na konštrukciu jazyka pre Arduino.

Knižnice

Než začnete s DHT11, tak by ste mali vedieť, čo sú to knižnice, bez ktorých sa v mnohých prípadoch nezaobídete (teda vlastne áno, ale prečo sa s niečím patlať, keď už to za nás urobil niekto iný a funguje to). Väčšina snímačov používa pár drôtikov a po nich sa ťahajú 1 a 0, ktoré v Arduino potom prevedieme na to, čo chceme. To väčšinou nie je jednoduché a tak budeme používať knižnice, ktoré do projektu len vložíme a ono sa to už dorieši samo. Niekoľko knižníc je v Arduino už pridané, ale myslím, že DHT11 súčasťou nie je. Pokiaľ si v Arduino IDE otvorte položku Sketch> Import library, uvidíte tu všetky knižnice. Ak tu nie je DHT11, tak si ju stiahneme tu, alternatívne download tu. Potom v Sketch> Import Library> Add Library vyberieme stiahnutý zips. Ak sa DHT11 na zozname neobjaví, skúste IDE reštartovať. Pokiaľ tu stále nebude, otvorte priečinok pre IDE (štandardne C: \ Users \ uzivatel \ Document \ Arduino), tu zložku libraries, v nej vytvorte zložku DHT11 a do nej vyextrahujte archív a spustite znovu IDE a knižnica by tu mala byť.

DHT11

Snímač DHT11 pre Arduino - Arduino

DHT11 je modré snímač so 4 vývodmi, ktoré je schopné merať teplotu a vlhkosť. Pokiaľ ho otočíme ceduľkou bane a mriežkou hore, tak piny zľava sú Vin, Dáta, NC a GND - Vstup napájania, Dátový pin, 3. je NC - Not Connected, teda ho nebudeme využívať a posledná je zem. Podľa štítku je schopný bežať od 3,5 do 5,5 V, ale ja používam len 5V. Má byť schopné merať teplotu od 0 do 50 ℃, ale pri používaní fénu ukazuje až do 78 (ďalej som už nešiel, ale Boh vie, či je to presné). Každopádne v kóde potom ideme aj cez oných 50. Vlhkosť meria vraj od 20% do 90%, ale bohvie ako to je, pre mňa je vlhkosť ďalší z nepotrebných vecí :)

Aby to nebolo strohé posielanie teploty a času po sériovej linke, tak nám Arduino bude na žiadosť hovoriť požadované údaje. Bude reagovať na chybne zadaný príkaz a tiež nám povie, kedy bude až moc horúco. Hoci bude možnosť to všetko urobiť na pár riadkov, v rámci tutoriálu to rozvediem do úplne zbytočných, ale pre ukážku možností jazyka vhodných funkcií. Okrem funkcií setup a loop si môžeme vytvárať vlastné, takže si vytvoríme funkciu Odpovedzte, ktorú si v loop budeme volať, aby nám zodpovedala na užívateľa. Tiež sa v Loop bude kontrolovať, či náhodou nie je moc horúco.

Najskôr ale zapojenie. Okrem Arduino budeme potrebovať tiež čidlo DHT11 a aby to bolo zaujímavejšie, tak si zoženieme ešte PIEZO reproduktorek. Všetko potom poskladáme podľa nasledujúcej schémy:

Snímač DHT11 pre Arduino - Arduino

A teraz 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 nahráme do Arduino. Väčšina by nám už mala byť jasná, ale pre istotu vysvetlím všetko.

#include <dht11.h>

Importujete knižnicu dht11. To sa nám urobí samo, keď knižnicu pridáme cez Sketch> Import Library.

dht11 cidlo;

Deklarujeme čidlo dht11 s názvom cidlo

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

Deklarácia niekoľkých premenných - piny, horúco a pár ďalších potrebných čo použijeme v programe. V setupu len nastavíme sériový port.

cidlo.read(dht11pin);

Prečítame dáta z nášho čidla s názvom cidlo. Funkcia read berie jeden parameter a tým je pin. Tu je použitá premenná dht11pin, takže pri prepojení čidla len stačí prepísať jeden riadok na začiatku programu.

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

Pomocou funkcií cidlo.temperature a cidlo.humidity prečítame teplotu a vlhkosť. POZOR - nedochádza k obnovenie dát, teplota pokojne môže stúpnu o 50 stupňov, ale kým znovu nezavoláme funkciu cidlo.read (), tak k obnoveniu nedôjde a zostane tam tá predchádzajúca hodnota.

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

Tu si v if zistíme, či sú k dispozícii nejaké dáta na príjme sériového portu a ak áno, tak ich uložíme do premennej int input. Int kvôli tomu, že sa posielajú čísla - text je prevedený na decimálna hodnotu, takže sa prijmú len čísla a navyše sa prijíma len znak po znaku, takže príjem textu by bol ešte ťažší a budeme tomu venovať špeciálnu lekciu. Potom je číslo prevedené na textový reťazec, hoci to nie je potrebné, tak je to tu pre ukážku urobené. Potom sa zavolá funkcia odpovedz, ktorú máme deklarovanú nižšie.

Potom je tu ďalší if, kde si zistíme, či je horúco alebo nie a spustí sa funkcia tone (), ktorá berie 2 (3) parametre - pin, frekvencia zvuku (tú si skúste sami) a tretí parameter je voliteľný. Je ním doba počas ktorej bude pípať. Ak tam nič nebude, tak sa nevypne kým nedôjde k vyvolaniu funkcie Noton (), ktorá zoberie ako parameter pin.

void odpovez(String vstup)
{
}

Vyššie je deklarácia nové funkcie, ktorá berie vstupný parameter typu String. Potom tu máme už len if, v ktorom zistíme, či nie je vo vstupe t, v alebo niečo iné. Ako som už písal, prevod textu necháme na inokedy, takže iba skontrolujeme decimálna hodnotu toho znaku. T má 116, v má 118 a tak ďalej. Ak potrebujete zistiť decimálna hodnotu onoho znaku, tak si môžete pred volanie Odpovedz () pridať riadok

Serial.println(vstup);

a po zadaní znaku sa hneď napíše jeho hodnota. Alebo môžete trochu zagooglit. Potom už tu máme len vypísanie hodnoty cez sériovú linku a program sa vráti do miesta v loop, kde prešiel na inú funkciu. Dôjde teda ku kontrole, či nie je moc horúco.

Ako to funguje je ukázané na videu nižšie. Celý súbor s kódom dávam k stiahnutiu. Pozor, video je od 0:20 hlučnejší kvôli fénu a zostáva to po skoro celom zvyšku!

Nabudúce bude kódový zámok a membránová klávesnica :)

 

Predchádzajúci článok
Arduino - Hráme sa s LEDkami
Všetky články v sekcii
Arduino
Preskočiť článok
(neodporúčame)
Arduino - Klávesnica
Článok pre vás napísal Adam Ježek
Avatar
Užívateľské hodnotenie:
2 hlasov
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