////////////////////////////////////////////////////////////////////////
//// CONTROLADOR LUCES, VENTILADOR, ENCHUFES ACUARIO (de momento...)////
////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////
//// DEFINICIONES DE PINS USADOS Y LIBRERIAS USADAS ////
////////////////////////////////////////////////////////
#include <OneWire.h> //libreria para temperatura
#include <DallasTemperature.h> //otra libreria para temperatura
#include <Wire.h> //libreria para el reloj
#include <SLCD.h> //libreria para el LCD serial
#define ONE_WIRE_BUS 7 // temperatura, pin de entrada el 7
OneWire oneWire(ONE_WIRE_BUS); // temperatura
DallasTemperature sensors(&oneWire);// temperatura
#define DS1307_I2C_ADDRESS 0x68 //reloj
#define numRows 2 //LCD numero de filas
#define numCols 16 //LCD numero de columnas
SLCD lcd = SLCD(numRows, numCols); //LCD
int Rele1 = 2; //rele1, de momento libre. pero lo activo luego.
int Rele2 = 3; //rele2, luces2 al pin digital 3
int Rele3 = 4; //rele3, zeolita al pin gitital 4
int Rele4 = 5; //rele4, ventilador al pin digital 5
int meanwell = 10; //pin 10 aqui va la meanwell para dimear.
////////////////////////////////////////////////////////////////////////
//// HORARIOS DE LUCES, CAMBIAR AQUI LAS HORAS DE ENCENDIDO-APAGADO ////
////////////////////////////////////////////////////////////////////////
const byte encendidoluz2 = 12;
const byte apagadoluz2 = 20;
///////////////
//// RELOJ ////
///////////////
byte decToBcd(byte val)
{return ( (val/10*16) + (val%10) );}
byte bcdToDec(byte val)
{return ( (val/16*10) + (val%16) );}
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
///////////////
//// setup ////
///////////////
void setup()
{
pinMode(Rele1, OUTPUT);
pinMode(Rele2, OUTPUT);
pinMode(Rele3, OUTPUT);
pinMode(Rele4, OUTPUT);
Wire.begin(); //RELOJ
lcd.init(); //LCD
Serial.begin(9600); //LCD
sensors.begin(); //Temperatura
}
///////////////////////////////
//// LOOP, BUCLE PRINCIPAL ////
///////////////////////////////
void loop ()
{
lcdoff();
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // LEEMOS LA HORA
InfoLcd(); //MUESTRA LA INFORMACION EN EL LCD
Luces(); //COMPRUEBA EL PROGRAMA Luces Y ENCENDERA/APAGARA RELE2 SEGUN TOQUE
ventilador(); //COMPRUEBA EL PROGRAMA VENTILADOR Y ENCENDERA/APAGARA RELE4 SEGUN TOQUE
zeolita(); //COMPRUEBA EL PROGRAMADO DEL HORARIO DEL RELE3 PARA LA BOMBA DEL REACTOR DE ZEOLITA
digitalWrite (Rele1, HIGH);//lo dejo siempre encendido. para enchufar aqui lo que sea.
amanecida(); //PROGRAMA DE AMANECER ANOCHECER CON LA MEANWELL Y LOS 10 LEDS.
}
///////////////////////////////
//// funciones secundarias ////
///////////////////////////////
//Iniciar LCD
void Lcdini ()
{
lcd.brightness(99);
lcd.displayOn();
lcd.clear();
}
//Apagar LCD
void lcdoff()
{
lcd.displayOff();
lcd.brightness(0);
}
// Pausa 3 segundos
void p ()
{
delay (3000);
}
////////////////////////////
//// PROGRAMAS DE LUCES ////
////////////////////////////
//caso 1: luces controladas por meanwell
void amanecida()
{
if (hour == 11 && minute < 2) // como va a tardar 255 segundos no volvera a entrar
{
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1)
{analogWrite(meanwell, fadeValue);
delay(2000);}
}
if (hour == 21 && minute < 2) // Para anochecer
{
for(int fadeValue = 255 ; fadeValue <= 0; fadeValue -=1)
{analogWrite(meanwell, fadeValue);
delay(2000);}
}
}
//caso 2: resto de luces que se encienden y apagan de golpe
//PARA CAMBIAR LA HORA IR A LA CONSTANTE DEFINIDA AL PRINCIPIO
void Luces()
{
if (hour >= encendidoluz2 && hour < apagadoluz2)
{digitalWrite (Rele2,HIGH);}
else
{digitalWrite (Rele2,LOW);}
}
//////////////////////////////////////////////////////////////////////////////
//// para encender y apagar la bomba del reactor de zeolitas cada 3 horas ////
//////////////////////////////////////////////////////////////////////////////
void zeolita()
{
if (((hour >= 1)&&(hour<=3)) || ((hour >= 7)&&(hour<=9)) || ((hour >= 13)&&(hour<=15)) || ((hour >= 19)&&(hour<=21)))
{digitalWrite (Rele3,HIGH);}
else
{digitalWrite (Rele3,LOW);}
}
/////////////////////////////
//// PROGRAMA VENTILADOR ////
/////////////////////////////
//CAMBIAR AQUI LA TEMPERATURA A CONTROLAR
void ventilador()
{
sensors.requestTemperatures(); //COMPRUEBA TEMPERATURA
if (sensors.getTempCByIndex(1)>27.50) //entre parentesis (1). uno es el acuario y cero el ambiente.
{digitalWrite(Rele4,HIGH);}
if (sensors.getTempCByIndex(1)<27.00)
{digitalWrite(Rele4,LOW);}
}
///////////////
//// RELOJ ////
///////////////
//AQUI no se toca nada. si hay que poner en hora ir al sketch del reloj solo.
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
*second = bcdToDec(Wire.receive() & 0x7f);
*minute = bcdToDec(Wire.receive());
*hour = bcdToDec(Wire.receive() & 0x3f);
*dayOfWeek = bcdToDec(Wire.receive());
*dayOfMonth = bcdToDec(Wire.receive());
*month = bcdToDec(Wire.receive());
*year = bcdToDec(Wire.receive());
}
//////////////////////////////////////
//// INOFORMACION EN PANTALLA LCD ////
//////////////////////////////////////
void InfoLcd ()
{
//Nombre del proyecto
Lcdini(); //poner aqui el nombre de tu controlador, del acuario, de tu madre,
lcd.print(" KICO'S REEF ", 0, 2); //de tu gato, o el modelo de aquella moto que nunca os pudisteis comrar
lcd.print(" VER 1.0", 1, 4); //o poner "te quiero" y se lo enseñais a la parienta en san valentin (polvete...)
p();
// ahora para mostrar fecha y hora
p();
Lcdini();
lcd.print("Hora:",0,1);
if (hour < 10) Serial.print("0");
Serial.print(hour, DEC);
Serial.print(":");
if (minute < 10) Serial.print("0");
Serial.print(minute, DEC);
Serial.print(":");
if (second < 10) Serial.print("0");
Serial.print(second, DEC);
switch (dayOfWeek)
{
case 1:
lcd.print("Lun , ",1,0);
break;
case 2:
lcd.print("Mar , ",1,0);
break;
case 3:
lcd.print("Mie , ",1,0);
break;
case 4:
lcd.print("Jue , ",1,0);
break;
case 5:
lcd.print("Vie , ",1,0);
break;
case 6:
lcd.print("Sab , ",1,0);
break;
case 7:
lcd.print("Dom , ",1,0);
break;
}
Serial.print(dayOfMonth, DEC);
Serial.print("/");
if (month < 10) Serial.print("0");
Serial.print(month, DEC);
Serial.print("/");
Serial.print("20");
if (year < 10) Serial.print("0");
Serial.print(year, DEC);
p();
Lcdini();
sensors.requestTemperatures();
lcd.print("Temp. Ambiente: ",0,1);
Serial.print(sensors.getTempCByIndex(0));
p();
//FadeLcd();
Lcdini();
lcd.print("Temp. Acuario: ",0,0);
Serial.print(sensors.getTempCByIndex(1));
p();
lcdoff();
}