ESP32: temperatura i vlažnost vazduha (DHT11) i meteo stanica
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.

Senzor DHT11

| DHT11 | DHT22 | |
|---|---|---|
| temperatura | 0 do 50 °C, ±2 °C | −40 do 80 °C, ±0,5 °C |
| vlažnost | 20 do 90 %, ±5 % | 0 do 100 %, ±2 % |
| najviše merenja | 1 u sekundi | 1 u 2 sekunde |
| napajanje | 3,3–5 V | 3,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 modul | ESP32 |
|---|---|
| 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) + " °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();
}
}
- Upiši ime i lozinku svoje mreže, pošalji program i otvori Serial Monitor.
- Kada se pojavi poruka „Otvori u pregledacu: http://192.168…“, otvori tu adresu na telefonu ili računaru.
- Strana se sama osvežava na 5 sekundi (red sa
refresh).
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
- Ispisuj temperaturu i u Farenhajtima (
dht.readTemperature(true)). - Upali LED diodu na GPIO2 kada temperatura pređe 26 °C.
- Na veb strani prikaži i najvišu i najnižu temperaturu od uključenja.
- 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)?
