/* * MECRO FLIGHT CORE - PROYECTO 10: VENTILADOR INTELIGENTE
* Arquitectura: Control de Lazo Cerrado (Bang-Bang con Histéresis)
* Hardware: ESP32 + DHT11 + Motor DC + Transistor NPN
*/
#include <DHT.h>
// --- 1. DEFINICIONES DE HARDWARE ---
const int PIN_DHT = 15; // Entrada Sensor
const int PIN_MOTOR = 26; // Salida Control Transistor (Base)
// --- 2. CONFIGURACIÓN DEL SENSOR ---
#define DHTTYPE DHT22 // En Wokwi usamos DHT22 (más preciso que DHT11)
DHT dht(PIN_DHT, DHTTYPE);
// --- 3. PARÁMETROS DE CONTROL (TERMOSTATO) ---
const float TEMP_OBJETIVO = 25.0; // Grados Celsius deseados
const float HISTERESIS = 1.0; // Margen de seguridad
// Límites calculados automáticamente
const float UMBRAL_ON = TEMP_OBJETIVO + HISTERESIS; // 26.0°C
const float UMBRAL_OFF = TEMP_OBJETIVO - HISTERESIS; // 24.0°C
void setup() {
Serial.begin(115200);
pinMode(PIN_MOTOR, OUTPUT);
digitalWrite(PIN_MOTOR, LOW); // Asegurar motor apagado al inicio
dht.begin();
Serial.println("--- MECRO CLIMATE CONTROL: ACTIVO ---");
Serial.print("Objetivo: "); Serial.print(TEMP_OBJETIVO); Serial.println("°C");
}
void loop() {
// 1. LEER ENTORNO (Feedback)
// Leer temperatura como Celsius (el default)
float t = dht.readTemperature();
// 2. VALIDACIÓN DE SEGURIDAD
if (isnan(t)) {
Serial.println("¡ERROR CRÍTICO! Fallo en sensor DHT.");
// En caso de fallo de sensor, ¿qué es más seguro?
// ¿Apagar para no gastar energía o encender para no sobrecalentar?
// Por defecto: Apagar.
digitalWrite(PIN_MOTOR, LOW);
return;
}
// 3. LÓGICA DE CONTROL (Schmitt Trigger)
Serial.print("Temp Actual: "); Serial.print(t); Serial.print("°C -> ");
if (t >= UMBRAL_ON) {
// Hace demasiado calor -> Encender refrigeración
digitalWrite(PIN_MOTOR, HIGH);
Serial.println("ESTADO: ENFRIANDO (Motor ON)");
}
else if (t <= UMBRAL_OFF) {
// Ya está suficientemente frío -> Apagar para ahorrar
digitalWrite(PIN_MOTOR, LOW);
Serial.println("ESTADO: EN RANGO (Motor OFF)");
}
else {
// ZONA MUERTA (24.1°C - 25.9°C)
// No hacemos nada. Mantenemos el estado anterior para evitar
// que el motor se encienda y apague constantemente (ruido).
Serial.println("ESTADO: ESTABLE (Manteniendo)");
}
// Esperar 2 segundos entre lecturas (limitación del DHT11)
delay(2000);
}