Senzorii DHT11 & DHT22: Măsurare Mediu & Protocol Single-Wire
Cum măsoară un polimer dielectric umiditatea relativă, calculul punctului de rouă (Dew Point), sincronizarea temporală a pachetului de 40 de biți și diferența crucială dintre DHT11 și DHT22.
1. Cum funcționează traductorul intern?
În interiorul carcasei perforate se află două elemente distincte: un substrat capacitiv sensibil la umiditate (două armături metalice separate de un polimer higroscopic a cărui constantă dielectrică se modifică odată cu absorbția vaporilor de apă) și un termistor NTC (rezistență a cărei valoare scade exponențial cu temperatura). Un mic microcontroler pe 8 biți intern convertește aceste semnale analogice și le transmite serial pe un singur fir de date.
- Temperatură: 0°C până la 50°C (marjă eroare: ±2°C)
- Umiditate: 20% până la 80% RH (marjă eroare: ±5%)
- Rată de eșantionare: Maxim 1 citire pe secundă (1 Hz)
- Temperatură: -40°C până la +80°C (marjă: ±0.5°C)
- Umiditate: 0% până la 100% RH (marjă: ±2%)
- Rezoluție: 16 biți (valori cu virgulă mobilă zecimală)
Calculator Inginerec: Punctul de Rouă (Ecuația Magnus-Tetens)
Punctul de rouă indică temperatura exactă la care vaporii de apă din aer se condensează în picături lichide pe carcase și componente electronice, provocând scurtcircuite.
La orice suprafață cu temperatura sub 14.4°C va apărea condens lichid.
2. Protocolul Single-Wire: Cum se transmit cei 40 de biți
Senzorii DHT nu folosesc protocolul I2C sau UART. În schimb, folosesc un protocol asimetric pe un singur fir, unde durata impulsului HIGH determină valoarea bitului:
Minim 18ms pentru DHT11 sau 1ms pentru DHT22 pentru a trezi senzorul din somn.
Impulsul HIGH este scurt (sub 30µs) pentru valoarea logică 0.
Impulsul HIGH este lung (~70µs) pentru valoarea logică 1.
3. Cod Model: Citire DHT22 cu Verificare Checksum
#include <DHT.h>
#define DHTPIN 4 // Pinul GPIO la care este legat pinul DATA
#define DHTTYPE DHT22 // Modelul: DHT22 (AM2302) sau DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
Serial.println("[DHT] Initializare senzor de mediu...");
dht.begin();
}
void loop() {
// Senzorul necesita minim 2 secunde intre citiri consecutive
delay(2000);
float umiditate = dht.readHumidity();
float temperatura = dht.readTemperature(); // Grade Celsius
// Verificam daca citirea a esuat (timeout pe magistrala single-wire)
if (isnan(umiditate) || isnan(temperatura)) {
Serial.println("⚠️ Eroare citire DHT: Verifica rezistenta de 10k pull-up!");
return;
}
// Calcul index de caldura perceput (Heat Index)
float heatIndex = dht.computeHeatIndex(temperatura, umiditate, false);
Serial.print("Umiditate: ");
Serial.print(umiditate, 1);
Serial.print("% | Temperatura: ");
Serial.print(temperatura, 1);
Serial.print("°C | Indice resimtit: ");
Serial.print(heatIndex, 1);
Serial.println("°C");
}