Código Modular Listo

ESP32 • WiFiManager, OLED y DHT22

Monitor ambiental con visualización en pantalla OLED I2C, lecturas de temperatura y humedad en tiempo real con sensor DHT22 y portal cautivo de configuración Wi-Fi automática.

ESP32 NodeMCU WiFiManager (192.168.4.1) SSD1306 OLED (I2C) DHT22 / AM2302 (GPIO 33) Reset BOOT (GPIO 0)

Montaje en Maqueta

Imagen vinculada desde ../maqueta/maqueta.jpg
Maqueta ESP32 con sensores y pantalla OLED

Conexiones utilizadas por este sketch:

Pantalla OLED
SDA: GPIO 21 SCL: GPIO 22 3.3V / GND
Sensor DHT22
Datos: GPIO 33 VCC / GND
Reset WiFi (BOOT)
Pulsador: GPIO 0 > 3 seg
LED Indicador
Parpadeo: GPIO 2
Ver maqueta completa y lista de materiales →

Código Fuente Modular

Ubicación: esp32_wifimanager_oled_dht22/
esp32_wifimanager_oled_dht22/esp32_wifimanager_oled_dht22.ino
Descargar
#include "oled.h"
#include "wm.h"
#include "dht22.h"


void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println("Iniciando...");
  setupOled();
  mostrarOled("Iniciando...", "WiFiManager", "OLED", "ESP32");
  setupWM();
  setupDHT22();
}

void loop() {
  loopWM();
  loopDHT22();
}
esp32_wifimanager_oled_dht22/oled.h
Descargar
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0);

void setupOled() {
  u8g2.begin();
}

void mostrarOled(String cad1="", String cad2="", String cad3="", String cad4="") {
  u8g2.clearBuffer();  // limpia el buffer interno
  u8g2.setFont(u8g2_font_6x10_tf);
  u8g2.setCursor(5, 14);
  u8g2.print(cad1);
  u8g2.setCursor(5, 30);
  u8g2.print(cad2);
  u8g2.setCursor(5, 46);
  u8g2.print(cad3);
  u8g2.setCursor(5, 62);
  u8g2.print(cad4);
  u8g2.sendBuffer();  // transfiere memoria al display
}
esp32_wifimanager_oled_dht22/wm.h
Descargar
#include "WiFi.h"
#include <WiFiManager.h>

const int pinCero = 0;
const int pinDos = 2;
WiFiManager wm;
String ipActual = "ninguna";

unsigned long tiempoPulsado = 0;
bool botonCeroPulsado = false;
bool estadoLedDos = LOW;
unsigned long tiempoRetardo = 0;

void setupWM() {
  pinMode(pinCero, INPUT);
  pinMode(pinDos, OUTPUT);
  digitalWrite(pinDos, LOW);
  // conectando
  Serial.println();
  Serial.println(WiFi.getHostname());
  digitalWrite(pinDos, HIGH);
  mostrarOled("SSID", WiFi.getHostname(), "Portal Cautivo", "192.168.4.1");
  if (wm.autoConnect(WiFi.getHostname(), "")) {
    IPAddress ip = WiFi.localIP();
    ipActual = ip.toString();
    mostrarOled("IP: " + ipActual);
    digitalWrite(pinDos, LOW);
  } else {
    Serial.println("Ha fallado la conexión");
  }
}

void loopWM() {
  if (digitalRead(pinCero) == LOW) {
    if (!botonCeroPulsado) {
      tiempoPulsado = millis();
      botonCeroPulsado = true;
      Serial.println("Boton boot pulsado");
      mostrarOled("Boton 0 pulsado", "", "", "");
    }

    int segundos = (millis() - tiempoPulsado) / 1000;
    mostrarOled("Boton 0 pulsado", "Tiempo: " + String(segundos) + " s", "Restante: " + String(3 - segundos) + " s");

    // Si el botón ha sido presionado por menos de 3 segundos, parpadea el LED
    if (millis() - tiempoPulsado < 3000) {
      if (millis() - tiempoRetardo >= 200) {  // Parpadea cada 200 ms
        estadoLedDos = !estadoLedDos;
        digitalWrite(pinDos, estadoLedDos);
        tiempoRetardo = millis();
      }
    } else {
      // Si el botón ha sido presionado por más de 3 segundos, mantén el LED encendido
      digitalWrite(pinDos, HIGH);
      mostrarOled("", "Reseteando WiFi...", "", "");
      wm.resetSettings();  // borra los datos de la memoria interna (SSID y contraseña)
      ESP.restart();
    }
  } else {
    if (botonCeroPulsado) {
      digitalWrite(pinDos, LOW);
      botonCeroPulsado = false;
      mostrarOled("IP: " + ipActual);
    }
  }
}
esp32_wifimanager_oled_dht22/dht22.h
Descargar
#include <DHTesp.h>

DHTesp dht;
const int pinDHT = 33;

TempAndHumidity datosTH;
String temperatura;
String humedad;

unsigned long tiempoAnterior = 0;
const long intervalo = 10000;  // intervalo de 10 segundos

void setupDHT22() {
  dht.setup(pinDHT, DHTesp::DHT22);
}

void loopDHT22() {
  unsigned long tiempoActual = millis();
  if (tiempoActual - tiempoAnterior >= intervalo) {
    tiempoAnterior = tiempoActual;

    datosTH = dht.getTempAndHumidity();
    temperatura = String(datosTH.temperature, 2) + " °C";
    humedad = String(datosTH.humidity, 1) + " %"; 
    Serial.print("Temperatura: ");
    Serial.print(temperatura);
    Serial.print("  Humedad: ");
    Serial.print(humedad);
    Serial.println();

    mostrarOled("ip: " + ipActual, "Temperatura: " + temperatura, "Humedad: " + humedad, "cvf");
  }
}

Instrucciones de Uso

1. Conexión Wi-Fi inicial
Al encender por primera vez, el ESP32 crea su propia red Wi-Fi sin contraseña. Conéctate a ella y accede a 192.168.4.1 en el navegador para elegir tu red doméstica e introducir la clave.
2. Lectura y Display
Una vez conectado, la pantalla OLED mostrará la dirección IP asignada por el router. Cada 10 segundos se actualizarán las lecturas de temperatura (°C) y humedad relativa (%).
3. Reseteo de Wi-Fi
Mantén pulsado el botón BOOT (GPIO 0) durante más de 3 segundos. El LED parpadeará y se borrarán las credenciales guardadas en la memoria no volátil, reiniciándose el portal cautivo.