#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// ================= CONFIGURACIÓN =================
#define DHTPIN 2
#define DHTTYPE DHT22
#define COOLING_PIN 8
#define LED_ON_PIN 9
#define LED_OFF_PIN 10
// Umbrales de temperatura
#define UMBRAL_ALTO 28.0
#define UMBRAL_BAJO 20.0
#define HISTERESIS 1.0
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Ajusta la dirección I2C si es necesario
bool coolingState = false;
void setup() {
Serial.begin(9600);
// Inicializar hardware
lcd.init();
lcd.backlight();
dht.begin();
pinMode(COOLING_PIN, OUTPUT);
pinMode(LED_ON_PIN, OUTPUT);
pinMode(LED_OFF_PIN, OUTPUT);
digitalWrite(COOLING_PIN, LOW);
digitalWrite(LED_ON_PIN, LOW);
digitalWrite(LED_OFF_PIN, HIGH); // Inicia apagado
// Mensaje inicial
lcd.setCursor(0, 0);
lcd.print("Iniciando...");
delay(2000);
lcd.clear();
}
void loop() {
static unsigned long lastRead = 0;
if(millis() - lastRead >= 2000) { // Lectura cada 2 segundos
lastRead = millis();
// Verificar sensor
if(checkSensorError()) return;
// Leer valores
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// Mostrar en LCD (formato: "T:23.5°C H:45.0%")
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(temperature, 1);
lcd.print((char)223); // Símbolo grado
lcd.print("C ");
lcd.setCursor(9, 0);
lcd.print("H:");
lcd.print(humidity, 1);
lcd.print("%");
// Controlar enfriamiento (siempre muestra "Enfriar: ON/OFF")
lcd.setCursor(0, 1);
lcd.print("Enfriar: ");
lcd.print(coolingState ? "ON " : "OFF");
// Lógica de control
if (temperature > (UMBRAL_ALTO + (coolingState ? -HISTERESIS : 0))) {
setCooling(true);
}
else if (temperature < (UMBRAL_BAJO + (coolingState ? HISTERESIS : 0))) {
setCooling(false);
}
}
}
bool checkSensorError() {
if(isnan(dht.readTemperature())) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Error sensor DHT!");
lcd.setCursor(0, 1);
lcd.print("Verificar conexion");
// Parpadear LEDs en error
digitalWrite(LED_ON_PIN, LOW);
for(int i=0; i<5; i++) {
digitalWrite(LED_OFF_PIN, !digitalRead(LED_OFF_PIN));
delay(300);
}
return true;
}
return false;
}
void setCooling(bool state) {
if(coolingState != state) {
coolingState = state;
digitalWrite(COOLING_PIN, state ? HIGH : LOW);
digitalWrite(LED_ON_PIN, state ? HIGH : LOW);
digitalWrite(LED_OFF_PIN, state ? LOW : HIGH);
// Log por serial
Serial.print("Enfriamiento ");
Serial.println(state ? "ACTIVADO" : "DESACTIVADO");
}
}
ROJO Bba. Apagada
SEÑAL DE MOTOR REFRIGERACIÓN
VERDE Bba. Encendida