Õpime õhuniiskust ja temperatuuri mõõtma

Enne selle õppetunni kallale asumist on sul vaja teha ära järgmised tööd:

Programmeerimine ongi keeruline ja ära muretse kui sa kõigest aru ei saa. Praktilise töö käigus õpime selgeks 🙂

Selle õppetunni jaoks on sul vaja:

  • DHT22 temperatuuri ja õhuniiskuse andur
  • ESP32 mikrokontroller
  • Montaažplaat
  • 3tk F-M ühenduskaablit
  • Mikro-USB kaabel
  • Arvuti koos Arduino arenduskeskkonnaga

I osa. Sul on vaja teada klemmide tähendusi.

Kõige olulisemad on rohelisega tähistatud nimetused GPIOxx – sama nummerdust on kasutatud programmikoodis.

II osa. Ühenda DHT22 andur järgmiselt.

  • DHT22 + klemm -> ESP32 3V3 klemm (see annab 3,3 V toitepinge)
  • DHT22 – klemm -> ESP32 GND klemm (neid on rohkem kui üks, vali ise)
  • DHT22 out klemm -> ESP32 GPIO04 klemm (võib kasutada ka teisi, määratakse programmikoodis)

III osa. Ühenda ESP32 mikro-usb kaabli abil arvutiga.

Käivita arenduskeskkond ja paigalda DHT22 teekid (programmikäskude ja funktsioonide kogumid).

  • Arduino arenduskeskkonnas vali menüü Tools -> Manage Libraries…
  • Otsi DHT sensor ja paigalda “DHT sensor library by Adafruit”.

IV osa. Trüki ümber järgnev programmikood.

#include "DHT.h"

#define DHTPIN 4
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println("DHT22 proov");
  dht.begin();

}

void loop() {
  delay(5000);

  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t)) {
    Serial.println("Andmed vigased!");
    return;
  }  

  Serial.println("Õhuniiskus: "+String(h,1)+"%, temperatuur: "+String(t,1)+"°C. ");

}

Pane tähele, et programmikood jaguneb osadeks ja selline ülesehitus kordub alati. Read 1-6 on muutujate ja teekide määramine. 8-13 on tööparameetrite paika sättimine. 15-28 on programmikood mis jääb lõpmatult korduma.

Programmikoodi kirjeldus ridade kaupa:

1. #include "DHT.h" Kaasab (ik include) DHT.h nimelise faili kaudu DHT22 anduriga suhtlemiseks vajaliku teeki (vaata punkt 3). Loomulikult võib ka selle osa ise kirjutada aga nii on palju mugavam ja lihtsam. Pane tähele, et muidu lisatakse # nende ridade ette, mis on kommentaariks mõeldud. Siin ja mõnel juhul veel aga kasutatakse # märki erinevalt. Jäta meelde!

3, 4. #define DHTPIN 4 ja #define DHTTYPE DHT22. Defineeritakse (ik define) ehk määratakse muutujatele DHTPIN ja DHTTYPE väärtused vastavalt 4 ja DHT22. Nende muutujate nimesid võid ise valida. Ei sobi eesti erimärgid (õ, ü, ä, ö), suur- ja väiketähed on olulised. Pane tähele, et neid muutujaid kasutatakse hiljem. Selliselt määratud muutjad on kasutatavad ka funktsioonide sees. Siin märgitud DHTPIN väärtus 4 on seoses I osas kirjeldatud GPIO04-ga. Ühendades DHT22 out klemmi teise sobiva ESP32 klemmi külge, muuda ka programmikoodis vastavat väärtust!

6. DHT dht(DHTPIN, DHTTYPE); Määratakse objekt (Arduino arenduskeel on C++ ja kasutatakse objektorienteeritud programmeerimist) nimega dht ja klassiga DHT. See objekt saab argumentideks muutujad DHTPIN ja DHTTYPE. Põhimõtteliselt võiks selle rea kirjutada ka nii DHT dht(4, DHT22); – hoiaks mujalt paar rida kokku aga jääks selgeks õppimata muutujate kasutamine.

8, 13. void setup() { ... } Tehakse valmis spetsiaalne funktsioon nimega setup aga seda veel ei käivitata. Selle spetsiaalse funktsiooni käivitab ESP32 ise omale sobival ajal. Funktsioon on programmikäskude kogum, mida saab ühise nimetaja abil käivitada. Põhimõtteliselt võiks alati kõik käsud välja kirjutada aga siis läheks keerulisem programmikood väga pikaks ja raskesti arusaadavaks sest kordusi on palju. Funktsioon algab alati sõnaga void, millele järgneb nimi (vabalt valitav aga ei tohi kasutada juba kasutusel olevaid nimesid, vaata https://www.arduino.cc/reference/en/). Järgnevad ümarsulud, siia saab kirjutada muutujate nimed (komaga eraldatult), mille abil saab vahendada infot funktsiooni sisse. Funktsiooni sees olevad programmikäsud ei näe funktsioonist väljaspool olevaid muutujaid ja vastupidi, va #define. Järgnevad loogelised sulud, mille vahel kirjutataksegi programmikäsud. Kujuta ette funktsiooni kui eraldiseisvat programmi.

9. Serial.begin(9600); Arvutiga ühenduse loomiseks. Selle abil saadab ESP32 arvutile tagasi informatsiooni. Siin on objekt Serial ja selle meetod (meetod on objekti sees olev funktsioon) begin(). Erinevus on selles, et me ei määra enne seda objekti mingi klassiga. Enamustel programmikäskudel ja meetoditel on nime järel ümarsulud, mille sisse saab kirjutada muutujate nimed (komadega eraldatult) või väärtused. Antud juhul on siin numbriline väärtus 9600 aga oleks võinud ka eespool määrata muutuja nimega speed ja väärtusega 9600. Näiteks nii #define SPEED 9600 ja seejärel saaksime selle rea kirjutada Serial.begin(SPEED);. Käsk lõpeb semikooloniga.

10. Serial.println("DHT22 proov"); ESP32 saadab arvutile info tagasi. Antud juhul on infoks tekst (DH22 proov) ja seepärast on see jutumärkide vahel. Aga võib olla ka muutuja. Muutuja korral saadetakse tagasi siis muutuja väärtus. Sobivad vaid mõned kindla tüübiga muutujad. Vajadusel tuleb konverteerida ühest tüübist teise. Objekt on Serial, meetod on println().

11. dht.begin(); – DHT22 anduriga suhtluse alustamiseks. Seda meetodit ei saa täita (ja tekib viga) kui rida 1 on puudu. Objekt on dht ja meetod begin().

12. Lihtsalt tühi rida sest miks mitte 🙂

15, 28. void loop() { ... }. Loome spetsiaalse funktsiooni mille ESP32 ise käivitab siis kui vaja. ESP32 jääbki seda funktsiooni lõputult kordama, kui kõik muud asjad on korda aetud. Siit ka nimi loop ehk ringiratast või kordus.

16. delay(5000); Programmkäsk, mis palub viivitada etteantud millisekundite jagu. Antud juhul 5000 millisekundit ehk 5 sekundit. Kui aeg möödas, käivitub järgmine käsk. Tulevikus leiame sellele aseaine sest see funktsioon peatab kogu ESP32 töö ja see on väga halb.

18, 19. Luuakse (mitte ei määrata) uued muutujad nimedega h ja t. Mõtle, millest sellised nimed?! Seekord öeldakse ka, et nende muutjate tüübiks on float ehk murdarv või komaga arv. Lisaks määratakse võrdusmärgiga muutujale ka koheselt väärtused. Väärtus tuleb seekord dht meetoditest dht.readHumidity(); ja dht.readTemperature(); mis tähendavad vastavalt DHT22 seest temperatuuri ja õhuniiskuse andmete lugemist. Need programmikäsud on erilised sest neid ei saa eraldiseisvalt välja kutsuda. Nad tagastavad alati midagi ja neid saab kasutada ainult nii, et nende väärtus omistatakse mingile muutujale. Nagu muutujad, mille väärtust sa ise muuta ei saa. Muutuja väärtus tekib/uueneb väljakutusmise hetkel.

21, 24. if (väide) { ... } IF ehk “juhul kui” on programmeerimise esimene “päris asi”. Sellega teeme otsuseid – kui on nii, siis täidame need käsud (ja kui on naa siis teised käsud). Väga üldistavalt võib öelda, et kogu programmeerimine ongi “juhul kui”. Süntaks ehk see kuidas programmikoodi kirjutatakse näeb ette järgmise reegli:

if (väide) {
  Käsud mida täidetakse, kui väide on tõene. 
}

Toimub väidete kontroll, näiteks on öeldud a > 3. Kui muutuja a väärtus ongi suurem kolmest siis on väide tõene. Tõese väite korral käivitatakse loogeliste sulgude vahel olevad käsud. Kui muutuja a väärtus on väiksem või võrdne kolmega siis väide on väär ja loogeliste sulgude vahel olevaid käske ei täideta. Kontrollitavaid väiteid võib olla rohkem kui üks ja neid eraldatakse märkide && (ja) ning || (või) abil.

Pane tähele! Programmikäsk isnan(h) tagastab väärtuse tõene juhul kui muutuja h ei oma väärtust. Vastupidine loogika!

22. Saadetakse arvutile tagasi tekst “Andmed vigased!”.

23. Katkestatakse funktsiooni edasine täitmine ehk põhimõtteliselt funktsiooni loop töö lõpetatakse ja järgnevaid ridu ei täideta. AGA tegevus toimub spetsiaalse funktsiooni nimega loop sees siis algab kõik otsast peale. Algus on real 16.

26. Saadetakse arvutile tagasi tekst. Pane tähele, et siin on võimalik üksteise otsa ja niivisi kokku ühks tekstiks liita erinevaid muutujaid ja väärtusi kasutades selleks + märki. Kõik tüübid omavahel kokku ei sobi ja seepärast kasutatakse float-tüüpi muutujate korral programmikäsku String(muutuja nimi, ümarduse komakoht);. See teisendab murdarvu tekstiks ja vajadusel ümardab määratud kohta peale koma.

28. Programmikäsud said otsa. Kuna tegevus toimub spetsiaalse funktsiooni loop sees siis koheselt alustatakse uuesti otsast peale. Kus on algus?

V osa. Lae kood ESP32 peale kasutades arenduskeskkonnas nuppu upload.

Varu aega, see võib võtta paar minutit. Kui tekivad vead, siis kontrolli programmikoodi ja vaata, kas jälgisid juhendit hoolsalt. Küsi juhendajalt nõu.

VI osa. Vaata temperatuuri ja õhuniiskust.

Selleks ava arenuskeskkonnas menüü Tools -> Serial monitor. Määra kiiruseks sama väärtus mis real 9. Edukas tulemus näeb välja selline:

VII osa. Uuri lisa.

Vaata lisaks https://randomnerdtutorials.com/esp32-dht11-dht22-temperature-humidity-sensor-arduino-ide/