/* * MECRO KIT - PROYECTO 19 (REVISIÓN B): MONITOR AMBIENTAL WIFI
* Hardware: ESP32, DHT22 (Digital), Relé, OLED SSD1306
* Corrección: Cambio de lógica Analógica a Digital (DHT)
*/
*
#include <WiFi.h>
#include <WebServer.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h> // ¡Necesaria para el DHT22!
// --- 1. CONFIGURACIÓN OLED ---
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// --- 2. CONFIGURACIÓN SENSOR (CAMBIO CRÍTICO) ---
#define DHTPIN 15 // ¡CAMBIA EL CABLE A ESTE PIN! (El 34 es solo entrada)
#define DHTTYPE DHT22 // Definimos el modelo del sensor
DHT dht(DHTPIN, DHTTYPE);
// --- 3. HARDWARE ACTUADORES ---
const int PIN_RELE = 26;
// --- 4. CREDENCIALES WIFI ---
const char* ssid = "Wokwi-GUEST"; // Red por defecto de Wokwi
const char* password = "";
// --- VARIABLES GLOBALES ---
float humedad = 0.0;
float temperatura = 0.0;
String estado_bomba = "OFF";
unsigned long last_screen_update = 0;
WebServer server(80);
// --- HTML DASHBOARD ---
String getHTML() {
String html = "<!DOCTYPE html><html><head>";
html += "<meta name='viewport' content='width=device-width, initial-scale=1'>";
html += "<meta http-equiv='refresh' content='3'>";
html += "<style>";
html += "body{background:#121212; color:#fff; font-family:sans-serif; text-align:center;}";
html += ".card{background:#222; padding:20px; margin:20px auto; max-width:400px; border-radius:10px;}";
html += "h1{color:#0f0;} .val{font-size:3rem;}";
html += "</style></head><body>";
html += "<div class='card'><h1>MECRO CLIMATE</h1>";
html += "<p>Humedad Relativa</p><div class='val'>" + String(humedad, 1) + "%</div>";
html += "<p>Temperatura</p><div class='val'>" + String(temperatura, 1) + "C</div>";
html += "<p>Estado Sistema: <strong>" + estado_bomba + "</strong></p></div>";
html += "</body></html>";
return html;
}
void handleRoot() {
server.send(200, "text/html", getHTML());
}
void setup() {
Serial.begin(115200);
pinMode(PIN_RELE, OUTPUT);
digitalWrite(PIN_RELE, LOW);
// Iniciar OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("Fallo OLED")); for(;;);
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0,0);
display.println("Iniciando Sensores...");
display.display();
// Iniciar DHT
dht.begin();
// Conexión WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Mostrar IP
display.clearDisplay();
display.setCursor(0,0);
display.println("WIFI OK. IP:");
display.println(WiFi.localIP());
display.display();
delay(2000);
server.on("/", handleRoot);
server.begin();
}
void loop() {
server.handleClient();
// --- LECTURA SENSOR DIGITAL ---
// Leer temperatura y humedad toma unos 250ms
float h = dht.readHumidity();
float t = dht.readTemperature();
// Comprobar si la lectura falló (NaN = Not a Number)
if (isnan(h) || isnan(t)) {
Serial.println("Fallo lectura DHT!");
return; // Intentar de nuevo en el siguiente ciclo
}
humedad = h;
temperatura = t;
// --- LÓGICA DE CONTROL ---
// Ejemplo: Si la humedad es muy baja (< 40%), activamos riego/humidificador
if (humedad < 40.0) {
digitalWrite(PIN_RELE, HIGH);
estado_bomba = "ON";
} else if (humedad > 60.0) {
digitalWrite(PIN_RELE, LOW);
estado_bomba = "OFF";
}
// --- ACTUALIZAR OLED (Cada 500ms) ---
if (millis() - last_screen_update > 500) {
updateOLED();
last_screen_update = millis();
}
}
void updateOLED() {
display.clearDisplay();
// Línea superior: Estado WiFi
display.setTextSize(1);
display.setCursor(0,0);
display.print("IP: "); display.println(WiFi.localIP());
display.drawLine(0, 10, 128, 10, WHITE);
// Datos Principales
display.setCursor(0, 15);
display.print("Temp: "); display.print(temperatura, 1); display.println(" C");
display.setCursor(0, 30);
display.print("Hum: "); display.print(humedad, 1); display.println(" %");
// Barra gráfica de Humedad
// Mapeamos 0-100% a 0-100 pixels de ancho
display.drawRect(10, 45, 100, 10, WHITE);
display.fillRect(10, 45, (int)humedad, 10, WHITE);
// Estado Actuador
display.setCursor(0, 56);
if(estado_bomba == "ON") display.print("SISTEMA: ACTIVO");
else display.print("SISTEMA: ESPERA");
display.display();
}