// *** CONTROL DE VENTILACIÓN 2 *** (CON RELOJ RTC DS1307)
#include <LiquidCrystal.h>
#include <DHT.h>
#include <DHT_U.h>
#include <Wire.h>
#include <RTClib.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
RTC_DS1307 rtc;
#define DHTPIN 2 // Pin 2 del Arduino Uno.
#define DHTTYPE DHT22 // Definir el sensor como un DHT22.
DHT dht(DHTPIN,DHTTYPE);
float temperatura;
float humedad;
bool estado_coolers = false; // Estado de coolers encendidos/apagados
int relay = 12; //Pin del relay 12.
DateTime ultimo_apagado;
DateTime prox_encendido;
DateTime prox_apagado;
int min_apagado = 20; // Tiempo mínimo que debe estar apagado (s)
int max_apagado = 50; // Tiempo máximo apagado (s)
int duracion = 5; // Duración prendido (s)
int modo = 1;
int boton = 0;
int boton_anterior = 0;
void setup()
{
lcd.begin(16, 2);
dht.begin();
Serial.begin(115200);
pinMode(relay, OUTPUT);
pinMode(13, INPUT);
digitalWrite(relay, HIGH); // relé sin energía (coolers apagados)
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
rtc.adjust(DateTime(__DATE__, __TIME__)); // Solo usar esta línea la primera vez, luego comentarla
prox_encendido = rtc.now()+4; // tiempo de espera hasta el primer encendido de coolers
}
void loop()
{
// MOSTRAR HUMEDAD Y TEMPERATURA EN LA PANTALLA
temperatura = dht.readTemperature(); // Lee la temperatura.
humedad = dht.readHumidity(); // Lee la humedad.
lcd.setCursor(0, 0);
lcd.write("Temp.: ");
lcd.print(temperatura);
lcd.write(" C");
lcd.setCursor(0, 1);
lcd.write("Hume.: ");
lcd.print(humedad);
lcd.write(" %");
// MOSTRAR FECHA Y HORA
DateTime hora = rtc.now();
Serial.print("Fecha: ");
Serial.print(hora.day(), DEC);
Serial.print("/");
Serial.print(hora.month(), DEC);
Serial.print("/");
Serial.print(hora.year(), DEC);
Serial.print(" ");
Serial.print("Hora: ");
Serial.print(hora.hour(), DEC);
Serial.print(":");
Serial.print(hora.minute(), DEC);
Serial.print(":");
Serial.println(hora.second(), DEC);
// ENCENDER LOS COOLERS
// Encender por temperatura alta
if (temperatura >= 28.5 && hora >= ultimo_apagado + min_apagado && estado_coolers == false)
{
digitalWrite(relay, LOW); // Energiza el relé y enciende el cooler.
prox_apagado = hora + duracion; // Programa la hora de apagado.
lcd.clear();
lcd.setCursor(0,0);
lcd.write("Coolers: ON");
Serial.println("coolers: ON");
estado_coolers = true; // Variable de control del estado de los coolers -> 'VERDADERO'.
}
// Encender por tiempo
if(hora >= prox_encendido && estado_coolers == false)
{
digitalWrite(relay, LOW); // Energiza el relé y enciende el cooler.
prox_apagado = hora + duracion; // Programa la hora de apagado.
lcd.clear();
lcd.setCursor(0,0);
lcd.write("Coolers: ON");
Serial.println("coolers: ON");
estado_coolers = true; // Variable de control del estado de los coolers -> 'VERDADERO'.
}
// APAGAR LOS COOLERS
if(hora >= prox_apagado && estado_coolers == true)
{
digitalWrite(relay, HIGH); // Desnergiza el relé y apaga el cooler.
ultimo_apagado = hora; // Registra la hora del ultimo apagado.
prox_encendido = hora + max_apagado; // Programa la hora de encendido.
lcd.clear();
lcd.setCursor(0,0);
lcd.write("Coolers: OFF");
Serial.println("coolers: OFF");
estado_coolers = false; // Variable de control del estado de los coolers -> 'FALSO'.
}
// SELECIONAR MODO
boton = digitalRead(13); // Lectura de botonera
if(boton == HIGH){ // Si se presiona el botón "SELECT" cambia el modo
if(boton_anterior == LOW && estado_coolers == false){ // Los coolers deben estar apagados
if(modo < 3){
modo = modo + 1;
}
else{
modo = 1;
}
Serial.print("Modo ");
Serial.print(modo);
lcd.clear();
lcd.setCursor(0,0);
lcd.write("Modo ");
lcd.print(modo);
if(modo == 1){
max_apagado = 50; // 8 hs = 28800 segundos
Serial.println(" CC");
Serial.println("Frecuencia 8 hs");
lcd.write(" CC:");
lcd.setCursor(0,1);
lcd.write("Frecuencia 8 hs");
}
if(modo == 2){
max_apagado = 40; // 4 hs = 14400 segundos
Serial.println(" PP");
Serial.println("Frecuencia 4 hs");
lcd.write(" PP:");
lcd.setCursor(0,1);
lcd.write("Frecuencia 4 hs");
}
if(modo == 3){
max_apagado = 30; // 90 min = 5400 segundos
Serial.println(" GG");
Serial.println("Frecuencia 1,5 hs");
lcd.write(" GG:");
lcd.setCursor(0,1);
lcd.write("Frecuencia 1,5 hs");
}
prox_encendido = ultimo_apagado + max_apagado;
}
}
boton_anterior = boton;
delay(2000); // Tiempo de espera entre una lectura y otra. Para el DHT22 son 2 segundos.
}