ESP32 DHT22 Temperatura y humedad (con pantalla LCD)
Se trata de un proyecto que mide la temperatura y la humedad ambientales mediante el sensor DHT22 y las muestra en tiempo real en una pantalla LCD I2C 16x2. Los datos del sensor se leen mediante el protocolo de un solo cable (one-wire) utilizando la biblioteca DHT de Adafruit. Este proyecto constituye la base para estaciones meteorológicas IoT, sistemas de automatización doméstica inteligente o sistemas de monitorización ambiental en invernaderos.

Video
Diagrama del circuito

Código fuente
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// ESP32 DHT22 Temperatura y humedad (con pantalla LCD)
4// ─────────────────────────────────────────
5// Lee la temperatura y la humedad del DHT22 cada 2 s y las muestra en un
6// LCD I2C de 16x2. Si una lectura falla, la pantalla muestra un aviso de
7// cableado y pull-up.
8//
9// Pines:
10// GPIO 4 -> DATA del DHT22
11// Pull-up de 10k entre DATA y VCC
12// GPIO 21 -> SDA del LCD, GPIO 22 -> SCL del LCD
13// DHT22 VCC -> 3V3, VCC del LCD -> 5V (VIN)
14// Todos los GND en común
15
16#include <Wire.h>
17#include <LiquidCrystal_I2C.h>
18#include <DHT.h>
19
20// Definición de pines
21const int DHT_PIN = 4;
22#define DHT_TYPE DHT22
23
24DHT dht(DHT_PIN, DHT_TYPE);
25
26// Dirección del LCD: 0x27 o 0x3F
27LiquidCrystal_I2C lcd(0x27, 16, 2);
28
29// El DHT22 necesita al menos 2 s entre lecturas
30const unsigned long READ_INTERVAL = 2000;
31unsigned long lastRead = 0;
32
33void setup() {
34 // Pines I2C por defecto de la DevKit V1
35 Wire.begin(21, 22);
36 lcd.init();
37 lcd.backlight();
38
39 // Pantalla de bienvenida de 3 s
40 lcd.setCursor(3, 0);
41 lcd.print("BlueGrays");
42 lcd.setCursor(3, 1);
43 lcd.print("DHT22 v1.0");
44 delay(3000);
45 lcd.clear();
46
47 dht.begin();
48}
49
50void loop() {
51 // Leer cada 2 s sin delay()
52 if (millis() - lastRead >= READ_INTERVAL) {
53 lastRead = millis();
54
55 float h = dht.readHumidity();
56 float t = dht.readTemperature();
57
58 lcd.clear();
59
60 // NaN = problema de cableado/pull-up
61 if (isnan(h) || isnan(t)) {
62 lcd.setCursor(0, 0);
63 lcd.print("Sensor okunamadi");
64 lcd.setCursor(0, 1);
65 lcd.print("Kablo+10k pullup");
66 } else {
67 // Temperatura
68 lcd.setCursor(0, 0);
69 lcd.print("Sicaklik:");
70 lcd.print(t, 1);
71 lcd.print("C");
72 // Humedad, el DHT22 da decimales
73 lcd.setCursor(0, 1);
74 lcd.print("Nem :");
75 lcd.print(h, 1);
76 lcd.print("%");
77 }
78 }
79}
80Preguntas frecuentes
¿Cuál es la diferencia entre el DHT22 y el DHT11?▾
El DHT22 es más preciso (±0,5 °C, ±2–5 % de humedad), mide en un rango más amplio (entre −40 y 80 °C) y ofrece una resolución de 0,1. El DHT11 es más barato, pero tiene una precisión limitada de ±2 °C y una resolución en números enteros.
¿Es necesaria una resistencia pull-up de 10 kΩ?▾
El sensor DHT22 sin carcasa requiere una resistencia pull-up de 10 kΩ para la línea de datos. En los módulos de tres pines montados en la placa, esta resistencia suele estar ya incorporada.
LCD de 5 V, ESP32 de 3,3 V; ¿funcionan juntos?▾
Los módulos LCD I2C ofrecen una imagen más nítida con 5 V. Si las resistencias pull-up de las líneas SDA/SCL del módulo alimentado a 5 V están conectadas a 5 V, lo más seguro es utilizar un convertidor de nivel; aunque mucha gente las conecta directamente, esto pone a prueba los límites del ESP32.
¿Puedo enviar los datos a Internet?▾
Sí, gracias al Wi-Fi del ESP32, puedes enviar las mediciones a ThingSpeak, Blynk o a tu propio servidor y ver los gráficos desde el móvil.
