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.
../maqueta/maqueta.jpg
esp32_wifimanager_oled_dht22/
#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();
}
#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
}
#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);
}
}
}
#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");
}
}