Coneix els sensors de temperatura i humitat DHT11/DHT22, com connectar‑los correctament a un ESP32 i com programar‑los amb explicacions pas a pas.
Els sensors DHT11 i DHT22 (també anomenats AM2302) mesuren temperatura i humitat relativa. Utilitzen un protocol digital d’un sol fil (one‑wire) propi, no compatible amb 1‑Wire de Dallas. Les diferències principals:
Tots dos requereixen una resistència pull‑up externa al pin de dades (excepte si el mòdul breakout ja la porta). A la secció següent veuràs el perquè.
| Pin DHT | Connecta a |
|---|---|
| VCC (+) | 3.3 V de l’ESP32 (evita 5 V) |
| DATA (out) | Qualsevol GPIO disponible, p. ex. GPIO 4, 15, 16 |
| GND (-) | GND de l’ESP32 |
Si utilitzes un mòdul que ja inclou la resistència a la PCB, connecta directament VCC, GND i DATA als pins de l’ESP32.
El protocol del DHT funciona deixant el pin de dades en estat alt (HIGH) per defecte. Quan el microcontrolador o el sensor volen iniciar comunicació, estiren la línia cap a baix (LOW). Sense una resistència que mantingui la línia en HIGH quan ningú l’activa, la tensió quedaria flotant i es produirien lectures erràtiques o fallades totals.
Per tant:
Per treballar amb el DHT necessites dues llibreries que gestionen el protocol i les lectures. Instal·la‑les des del Library Manager (menú Eines → Gestiona les llibreries):
DHT).fatal error: Adafruit_Sensor.h: No such file or directory, assegura’t d’haver instal·lat primer la llibreria Adafruit Unified Sensor.
Utilitzarem el DHT22 per la seva millor precisió. El codi val tant per ESP32‑S3 com per ESP32 Nano; només cal canviar el número de pin.
delay())
// 1. Incloure la llibreria
#include "DHT.h"
// 2. Definir pin i tipus de sensor
#define DHTPIN 15 // GPIO on connectes el DATA
#define DHTTYPE DHT22 // O DHT11 si fas servir el model bàsic
// 3. Crear l'objecte DHT
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200); // Inicialitza comunicació sèrie
delay(1000); // Petita pausa per estabilitzar l'alimentació
dht.begin(); // Inicialitza el sensor
Serial.println("DHT22 inicialitzat. Començant lectures...");
}
void loop() {
// 4. Llegir humitat i temperatura
float humitat = dht.readHumidity();
float temperatura = dht.readTemperature(); // Per defecte en Celsius
// 5. Comprovar si la lectura ha fallat (retorna NaN)
if (isnan(humitat) || isnan(temperatura)) {
Serial.println("Error: no s'ha pogut llegir el DHT. Revisa les connexions.");
delay(2500);
return; // Sortir d'aquesta iteració
}
// 6. Mostrar resultats
Serial.print("Humitat: ");
Serial.print(humitat);
Serial.print(" %\t");
Serial.print("Temperatura: ");
Serial.print(temperatura);
Serial.println(" °C");
// 7. Esperar el temps mínim entre lectures (DHT22 ≈ 2 s)
delay(2500);
}
readTemperature() retorna la temperatura en graus Celsius. Si vols Fahrenheit, fes servir dht.readTemperature(true).
millis()) – recomanada per a projectes reals
Fer servir delay() atura completament el microcontrolador durant segons. Això impedeix, per exemple, actualitzar una pantalla o respondre a botons. Aquí tens una versió que respecta l’interval mínim sense bloquejar el bucle.
#include "DHT.h"
#define DHTPIN 15
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
unsigned long ultimLectura = 0; // quan vam fer l'última lectura
const unsigned long interval = 2500; // 2500 ms = 2.5 segons (marge extra)
void setup() {
Serial.begin(115200);
delay(1000);
dht.begin();
}
void loop() {
// Obtenim el "temps actual" en mil·lisegons
unsigned long ara = millis();
// Si ha passat prou temps des de l'última lectura, fem una de nova
if (ara - ultimLectura >= interval) {
ultimLectura = ara; // actualitzem el marcador de temps
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Error de lectura");
} else {
Serial.print("Humitat: ");
Serial.print(h);
Serial.print(" %\tTemperatura: ");
Serial.print(t);
Serial.println(" °C");
}
// No fem delay; el programa segueix executant-se
}
// Aquí pots posar altres tasques (llegir botons, actualitzar un display…)
// …
}
Si no obtens lectures, prova aquest esbós de diagnòstic que també verifica la presència del sensor:
#include "DHT.h"
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
delay(1000);
dht.begin();
Serial.println("--- Test DHT ---");
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
Serial.print("Lectura: ");
Serial.print(millis());
Serial.print(" ms -> ");
if (isnan(h) || isnan(t)) {
Serial.println("ERROR - Comprova cablejat, pull-up i voltatge.");
delay(3000);
} else {
Serial.print("H=");
Serial.print(h);
Serial.print("%, T=");
Serial.print(t);
Serial.println("°C");
delay(2500);
}
}
Si el missatge d’error apareix immediatament al cap d’un segon, probablement el sensor no es comunica. Revisa la resistència, els cables i l’alimentació.
NaN
Les connexions i el codi són pràcticament idèntics en ambdues famílies. Tot i això:
Les plaques Seeed Studio XIAO ESP32C3 i XIAO ESP32S3 són de les més compactes del mercat. Tot i la seva mida, treballen perfectament amb els sensors DHT, sempre que es tinguin en compte unes poques particularitats.
3V3 → DHT VCCGND → DHT GNDEvita el pin D7 (GPIO9) ja que és un pin de strapping (boot) i pot impedir l’arrencada si té algun nivell imposat.
3V3 → DHT VCCGND → DHT GNDComprova sempre la serigrafia de la teva placa. A la XIAO ESP32S3, el GPIO0 pot funcionar sense problemes sempre que no tingui una resistència de pull‑up o pull‑down externa que alteri el mode d’arrencada.
#define DHTPIN.
// Codi per a Seeed XIAO ESP32C3 amb DHT22 a D2 (GPIO4)
#include "DHT.h"
#define DHTPIN D2 // D2 = GPIO4 en XIAO ESP32C3
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
delay(1000);
dht.begin();
Serial.println("XIAO + DHT22 en marxa");
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Error de lectura");
} else {
Serial.print("Humitat: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperatura: ");
Serial.print(t);
Serial.println(" °C");
}
delay(2500);
}
Per a la XIAO ESP32S3, defineix el pin com D0, D2 o D4 segons on hagis connectat el DATA, i recorda que els GPIOs són directament els números impresos (per exemple, #define DHTPIN D2).