MER / Práctica 3

ESP32 WiFiManager OLED DHT22

Una estación conectada, paso a paso: portal Wi-Fi, sensor ambiental y lecturas en una pantalla OLED.

20/10/2026Guía de desarrolloWiFiManager · OLED · DHT22

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

ComponenteSeñalESP32
DHT22VCC / DATA / GND3V3 / GPIO27 / GND
OLEDVCC / GND3V3 / GND (comprueba tu módulo)
OLEDSDA / SCLGPIO21 / GPIO22
DHT22Pull-up de DATA10 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();
}
  1. Selecciona tu placa y puerto y carga el sketch. Abre el monitor serie a 115200 baudios.
  2. En el primer arranque, conéctate a la red MER-ESP32 usando la clave de ejemplo del sketch.
  3. Abre el portal cautivo; si no aparece, visita http://192.168.4.1 mientras estás conectado a esa red.
  4. Selecciona la red de clase e introduce su contraseña. El ESP32 guarda la configuración y se conecta.
  5. 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.

SIMULACIÓN · OLED 128 × 64T: 23.5 C
H: 45 %WiFi conectado

05 / Diagnóstico

SíntomaComprobación
OLED apagadaAlimentación, SDA/SCL, dirección I²C y modelo SSD1306.
Lectura no válida / NaNGPIO27, tipo DHT22, pull-up y cableado. Mantén al menos 2 s entre lecturas.
No aparece el portalConéctate al AP del ESP32 y visita 192.168.4.1; revisa credenciales guardadas.
No conecta al routerComprueba banda de 2,4 GHz, alcance y contraseña.
Reinicia después de 3 minutosEl 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.

¿Qué añade WiFiManager a esta práctica?

Siguiente práctica: HTTP y PHP →

Documentación