ESP32: temperatura i vlažnost vazduha (DHT11) i meteo stanica

Lekcija 18 od 28 · Arduino i ESP32

Senzor DHT11 meri temperaturu i vlažnost vazduha – sa njim smo radili u Arduino lekciji senzor temperature. ESP32 ima ugrađen Wi-Fi, pa iste podatke možemo da pogledamo i na mobilnom telefonu: napravićemo malu meteo stanicu sa veb stranom.

ESP32 i senzor DHT11 na eksperimentalnoj ploči
ESP32 i senzor DHT11 na eksperimentalnoj ploči

Senzor DHT11

DHT11: izgled, raspored pinova i unutrašnja struktura
DHT11: izgled, raspored pinova i unutrašnja struktura
DHT11DHT22
temperatura0 do 50 °C, ±2 °C−40 do 80 °C, ±0,5 °C
vlažnost20 do 90 %, ±5 %0 do 100 %, ±2 %
najviše merenja1 u sekundi1 u 2 sekunde
napajanje3,3–5 V3,3–5 V

Senzor ima tri (modul) ili četiri (sam senzor) nožice. Podaci se šalju preko jedne žice (DATA) u obliku niza impulsa – zato nam treba biblioteka koja ih razume.

Povezivanje

DHT11 modulESP32
VCC (+)3V3
DATA (OUT, S)GPIO4
GND (−)GND
  • Modul na pločici već ima otpornik od 10 kΩ između DATA i VCC. Ako koristiš sam senzor sa 4 nožice, taj otpornik dodaj sam.
  • Na ESP32 senzor napajamo sa 3,3 V – tada je i signal DATA 3,3 V, bezbedan za pin.

Korak 1: merenje u Serial Monitoru

Instaliraj biblioteke DHT sensor library i Adafruit Unified Sensor (Library Manager). Program je isti kao za Arduino – menja se samo broj pina i brzina serijske veze:

// ESP32 – temperatura i vlažnost vazduha senzorom DHT11
// Biblioteka: „DHT sensor library“ (Adafruit) + „Adafruit Unified Sensor“
#include <DHT.h>

const int DHT_PIN = 4;          // DATA pin senzora
DHT dht(DHT_PIN, DHT11);        // za DHT22 napiši DHT22

void setup() {
  Serial.begin(115200);
  dht.begin();
}

void loop() {
  delay(2000);                  // DHT11 meri najviše jednom u sekundi – čekamo 2 s

  float vlaznost = dht.readHumidity();
  float temperatura = dht.readTemperature();   // u °C

  // ako čitanje ne uspe, biblioteka vraća NaN („nije broj“)
  if (isnan(vlaznost) || isnan(temperatura)) {
    Serial.println("Greska pri citanju DHT senzora!");
    return;
  }

  float osecaj = dht.computeHeatIndex(temperatura, vlaznost, false);  // „subjektivni osećaj“ toplote

  Serial.print("Temperatura: ");
  Serial.print(temperatura, 1);
  Serial.print(" C   Vlaznost: ");
  Serial.print(vlaznost, 0);
  Serial.print(" %   Osecaj: ");
  Serial.print(osecaj, 1);
  Serial.println(" C");
}
  • isnan() proverava da li je merenje uspelo. Ako se stalno javlja greška – proveri žicu DATA i broj pina.
  • Osećaj toplote (heat index) kaže koliko nam je toplo kada uzmemo u obzir i vlažnost: na 30 °C i 80 % vlažnosti osećamo skoro 38 °C.

Korak 2: meteo stanica sa veb stranom

ESP32 se povezuje na kućnu Wi-Fi mrežu i postaje mali veb server. Kada u pregledaču na telefonu (u istoj mreži) otvoriš njegovu adresu, dobiješ stranu sa temperaturom i vlažnošću.

// ESP32 – meteo stanica: DHT11 + veb strana preko Wi-Fi mreže
#include <WiFi.h>
#include <WebServer.h>
#include <DHT.h>

const char* SSID    = "IME_MREZE";      // upiši ime svoje Wi-Fi mreže
const char* LOZINKA = "LOZINKA";        // i lozinku

const int DHT_PIN = 4;
DHT dht(DHT_PIN, DHT11);
WebServer server(80);

float temperatura = 0;
float vlaznost = 0;
unsigned long poslednjeMerenje = 0;

void merenje() {
  float t = dht.readTemperature();
  float h = dht.readHumidity();
  if (!isnan(t) && !isnan(h)) {         // pamtimo samo ispravna merenja
    temperatura = t;
    vlaznost = h;
  }
}

void pocetnaStrana() {
  String s = "<!DOCTYPE html><html><head><meta charset='utf-8'>";
  s += "<meta name='viewport' content='width=device-width'>";
  s += "<meta http-equiv='refresh' content='5'>";       // osvežavanje na 5 s
  s += "<title>Meteo stanica</title></head><body style='font-family:sans-serif'>";
  s += "<h1>Meteo stanica ESP32</h1>";
  s += "<p>Temperatura: <b>" + String(temperatura, 1) + " &deg;C</b></p>";
  s += "<p>Vlaznost vazduha: <b>" + String(vlaznost, 0) + " %</b></p>";
  s += "</body></html>";
  server.send(200, "text/html", s);
}

void setup() {
  Serial.begin(115200);
  dht.begin();
  WiFi.begin(SSID, LOZINKA);
  Serial.print("Povezivanje");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("Otvori u pregledacu: http://");
  Serial.println(WiFi.localIP());        // adresa ESP32 u tvojoj mreži

  server.on("/", pocetnaStrana);
  server.begin();
}

void loop() {
  server.handleClient();                 // odgovara pregledaču
  if (millis() - poslednjeMerenje >= 2000) {   // merenje na 2 s, bez delay()
    poslednjeMerenje = millis();
    merenje();
  }
}
  1. Upiši ime i lozinku svoje mreže, pošalji program i otvori Serial Monitor.
  2. Kada se pojavi poruka „Otvori u pregledacu: http://192.168…“, otvori tu adresu na telefonu ili računaru.
  3. Strana se sama osvežava na 5 sekundi (red sa refresh).
Zašto nema delay(2000) u loop()? Server mora stalno da odgovara pregledaču. Zato vreme merimo funkcijom millis() (koliko je milisekundi prošlo od uključenja) i merimo kada prođe 2 s, a između toga handleClient() odgovara na zahteve. Isti način koristi i automatsko zalivanje bašte.

Zadaci za vežbu

  1. Ispisuj temperaturu i u Farenhajtima (dht.readTemperature(true)).
  2. Upali LED diodu na GPIO2 kada temperatura pređe 26 °C.
  3. Na veb strani prikaži i najvišu i najnižu temperaturu od uključenja.
  4. Na veb strani obeleži vlažnost bojom: ispod 30 % – „suvo“ (narandžasto), iznad 70 % – „vlažno“ (plavo).
Rešenje: LED se pali kada je previše toplo
// Zadatak – upozorenje: LED se pali kada temperatura pređe granicu
#include <DHT.h>

const int DHT_PIN = 4;
const int LED_PIN = 2;
const float GRANICA = 26.0;     // °C

DHT dht(DHT_PIN, DHT11);

void setup() {
  Serial.begin(115200);
  pinMode(LED_PIN, OUTPUT);
  dht.begin();
}

void loop() {
  delay(2000);
  float t = dht.readTemperature();
  if (isnan(t)) {
    return;                     // preskačemo neuspelo merenje
  }
  Serial.println(t);
  if (t > GRANICA) {
    digitalWrite(LED_PIN, HIGH);   // previše toplo
  } else {
    digitalWrite(LED_PIN, LOW);
  }
}

Proveri znanje

Otvori kviz

Kviz: DHT11 i meteo stanica

1. Šta meri senzor DHT11?




2. Koliko često najviše može da meri DHT11?




3. Šta znači kada readTemperature() vrati NaN?




4. Zašto u meteo stanici koristimo millis() umesto delay(2000)?