ESP32 WiFiManager OLED DHT22
Una estación conectada, paso a paso: portal Wi-Fi, sensor ambiental y lecturas en una pantalla OLED.
01 / Enunciado
Construye una estación de temperatura y humedad con ESP32, sensor DHT22 y OLED SSD1306 I²C de 128 × 64. Configura el Wi-Fi mediante un portal WiFiManager y muestra las lecturas en pantalla sin escribir el nombre de la red ni su contraseña en el sketch.
Ver el enunciado del profesor ↗
Material
- ESP32 clásico, cable USB de datos y protoboard.
- DHT22 y resistencia de 10 kΩ entre DATA y 3,3 V si el sensor no lleva pull-up integrada.
- OLED SSD1306 I²C compatible con lógica de 3,3 V y cables.
- Red Wi-Fi de 2,4 GHz y móvil u ordenador para configurar el portal.
02 / Conexiones
| Componente | Señal | ESP32 |
|---|---|---|
| DHT22 | VCC / DATA / GND | 3V3 / GPIO27 / GND |
| OLED | VCC / GND | 3V3 / GND (comprueba tu módulo) |
| OLED | SDA / SCL | GPIO21 / GPIO22 |
| DHT22 | Pull-up de DATA | 10 kΩ a 3V3, si no está integrada |
Haz el cableado sin alimentación. Comprueba las etiquetas del sensor y de la pantalla: el orden de sus pines puede cambiar entre módulos. La dirección I²C de la OLED suele ser 0x3C; compruébala y ajusta el sketch si tu pantalla utiliza otra.
Bibliotecas de Arduino IDE
Instala WiFiManager de tzapu, DHT sensor library de Adafruit, Adafruit Unified Sensor, Adafruit GFX Library y Adafruit SSD1306. WiFi y Wire pertenecen al paquete de placas ESP32.
03 / Programa y configura
Descargar sketch completo ↓#include <WiFi.h>
#include <WiFiManager.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
constexpr uint8_t DHT_PIN = 27;
constexpr uint8_t OLED_ADDR = 0x3C;
DHT dht(DHT_PIN, DHT22);
Adafruit_SSD1306 display(128, 64, &Wire, -1);
WiFiManager wifiManager;
unsigned long lastRead = 0;
void setup() {
Serial.begin(115200);
Wire.begin(21, 22);
dht.begin();
if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
Serial.println("OLED no detectada: revisa direccion y cableado");
while (true) delay(1000);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Configura el WiFi");
display.println("AP: MER-ESP32");
display.println("192.168.4.1");
display.display();
WiFi.mode(WIFI_STA);
wifiManager.setConfigPortalTimeout(180);
// Clave del AP de configuracion de esta practica; usa tu propia clave.
if (!wifiManager.autoConnect("MER-ESP32", "Practica2026")) {
Serial.println("Tiempo agotado: reiniciando");
delay(1000);
ESP.restart();
}
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}
void loop() {
if (millis() - lastRead < 2500) return;
lastRead = millis();
const float temperature = dht.readTemperature();
const float humidity = dht.readHumidity();
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
if (isnan(temperature) || isnan(humidity)) {
display.println("Error de sensor DHT22");
Serial.println("DHT22: lectura no valida");
} else {
display.print("T: "); display.print(temperature, 1); display.println(" C");
display.print("H: "); display.print(humidity, 1); display.println(" %");
display.println();
display.println(WiFi.status() == WL_CONNECTED ? "WiFi conectado" : "WiFi desconectado");
Serial.printf("T: %.1f C | H: %.1f %%\n", temperature, humidity);
}
display.display();
}- Selecciona tu placa y puerto y carga el sketch. Abre el monitor serie a 115200 baudios.
- En el primer arranque, conéctate a la red MER-ESP32 usando la clave de ejemplo del sketch.
- Abre el portal cautivo; si no aparece, visita
http://192.168.4.1mientras estás conectado a esa red. - Selecciona la red de clase e introduce su contraseña. El ESP32 guarda la configuración y se conecta.
- Comprueba la IP en el monitor serie y las lecturas de la OLED.
En siguientes arranques WiFiManager intenta usar la red guardada. Para forzar otra configuración durante las pruebas, puedes ejecutar una vez wifiManager.resetSettings() antes de autoConnect y después retirar esa línea.
04 / Prueba la visualización
Esta demostración local permite comprobar cómo se presentan las lecturas. Los valores se cambian con los controles y no proceden de una placa.
H: 45 %WiFi conectado
05 / Diagnóstico
| Síntoma | Comprobación |
|---|---|
| OLED apagada | Alimentación, SDA/SCL, dirección I²C y modelo SSD1306. |
| Lectura no válida / NaN | GPIO27, tipo DHT22, pull-up y cableado. Mantén al menos 2 s entre lecturas. |
| No aparece el portal | Conéctate al AP del ESP32 y visita 192.168.4.1; revisa credenciales guardadas. |
| No conecta al router | Comprueba banda de 2,4 GHz, alcance y contraseña. |
| Reinicia después de 3 minutos | El portal agotó su tiempo de espera sin conseguir conexión. |
Organización del material de referencia
El profesor divide la aplicación en oled.h (pantalla), wm.h (conexión) y dht22.h (sensor). La secuencia consiste en iniciar pantalla y red, preparar el DHT22 y actualizar sus lecturas durante loop.
El sketch que ya estaba en esta web se conserva sin cambios: usa las bibliotecas de Adafruit y DATA en GPIO27. Al montar, el cableado debe coincidir con ese programa; los ejemplos del profesor usan otra organización y otra asignación del sensor.
06 / Comprobación y entrega
Entrega el sketch, una foto del montaje, una captura del portal sin contraseñas y una tabla de pruebas con resultado esperado y observado. El sketch se debe compilar y probar en la placa del aula.