Guia completa en un sol HTML: DHT11 / DHT22 amb ESP32 (ESP32‑S3 i ESP32 Nano) + Web Server

Resum tècnic: alimenta el sensor a 3.3V, afegeix pull‑up 4.7–10k al pin de dades si el breakout no en porta, respecta l'interval de lectura (DHT11 ≥1s, DHT22 ≥2s). Aquest fitxer conté instruccions, sketches Arduino (inclòs servidor web SSE), blocs de codi amb copy i consells de resolució d'errors.

1 Material i connexions

Material necessari
Connexions (mòdul 3 pins)
Pin sensorConnexió
VCC3.3V (no 5V amb ESP32)
DATAGPIO digital (p.ex. 4, 15, 27). Afegir pull‑up 4.7k–10k entre DATA i VCC si cal
GNDGND

Evita pins que afectin el boot mode. Si la placa no arrenca amb el sensor connectat, prova un altre GPIO per DATA.

2 Preparar Arduino IDE i llibreries


3 Sketchs Arduino

Cada bloc té un botó per copiar el codi. Canvia DHTPIN, DHTTYPE, ssid i password segons la teva configuració.

3.1 Exemple mínim DHT22 (Arduino IDE)


// DHT22 mínim per ESP32
#include "DHT.h"
#define DHTPIN 15
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

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

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (isnan(h) || isnan(t)) {
    Serial.println("Error: lectura DHT fallida");
  } else {
    Serial.printf("Temp: %.2f C  Hum: %.2f %%\n", t, h);
  }
  delay(2500); // DHT22: >=2000 ms
}
    

3.2 Exemple mínim DHT11 (Arduino IDE)


// DHT11 mínim per ESP32
#include "DHT.h"
#define DHTPIN 4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

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

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (isnan(h) || isnan(t)) {
    Serial.println("Error: lectura DHT fallida");
  } else {
    Serial.printf("Temp: %.2f C  Hum: %.2f %%\n", t, h);
  }
  delay(1200); // DHT11: >=1000 ms
}
    

3.3 Sketch complet: Web server amb SSE (ESPAsyncWebServer) — DHT → navegador en temps real


// ESP32 DHT WebServer amb SSE
// Requereix: Adafruit Unified Sensor, DHT sensor library (Adafruit),
//           AsyncTCP, ESPAsyncWebServer

#include 
#include 
#include 
#include "DHT.h"

// --- CONFIGURA AQUI ---
const char* ssid = "TU_SSID";
const char* password = "TU_PASSWORD";

#define DHTPIN 15        // GPIO on connectes DATA
#define DHTTYPE DHT22    // DHT22 o DHT11

DHT dht(DHTPIN, DHTTYPE);
AsyncWebServer server(80);
AsyncEventSource events("/events");

unsigned long lastRead = 0;
const unsigned long readInterval = (DHTTYPE == DHT22) ? 2500UL : 1200UL;
float lastTemp = NAN;
float lastHum  = NAN;

void setup(){
  Serial.begin(115200);
  delay(1000);
  dht.begin();

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("Connexió WiFi");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("IP: ");
  Serial.println(WiFi.localIP());

  // Serveix pàgina principal (HTML embegut)
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", R"rawliteral(



  
  
  DHT Web Server
  


  

DHT sensor — Lectures en temps real

Temperatura: -- °C
Humitat: -- %
Última actualització: --
)rawliteral"); }); server.addHandler(&events); server.begin(); } void loop(){ unsigned long now = millis(); if (now - lastRead >= readInterval) { lastRead = now; float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(h) || isnan(t)) { Serial.println("Error: lectura DHT fallida"); events.send("{\"t\":null,\"h\":null}", "reading", millis()); } else { lastTemp = t; lastHum = h; String payload = "{\"t\":" + String(t,2) + ",\"h\":" + String(h,2) + "}"; events.send(payload.c_str(), "reading", millis()); Serial.printf("Temp: %.2f C Hum: %.2f %%\n", t, h); } } // No fer delay() per no bloquejar el servidor asíncron }

4 Resolució de problemes comuns

Lectures NaN o "Failed to read"
Problemes amb el servidor web

5 Notes pràctiques i recomanacions