#include <DallasTemperature.h>
#include <OneWire.h>
#include <RelojDS1307.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
unsigned long estadoprevio=0;
boolean repeticion=1;
//creamos las variables para las funciones de encendido manual y apagado
boolean botonmanual10=0;
boolean botonmanual1=0;
int sumamanual=0;//se utilizará para hacer 2 comprobaciones de boton manual
boolean botonoff10=0;
boolean botonoff1=0;
int sumaoff=0;//se utilizará para hacer 2 comprobaciones de boton apagado
int boton3ultimo=0;
int boton3actual=0;
int contador=0;
boolean boton4=0;
#define TEMP 22
#define ULTRASONI 23
#define BUZZER 7
#define rele3 34
#define ABONO1 30
#define ABONO2 31
#define BOMBA 33
#define LUZPANT 32
#define VENT 35
LiquidCrystal_I2C lcd(0x27,20,4);
OneWire oneWire(TEMP);
DallasTemperature sensors(&oneWire);
DeviceAddress ACUARIO;
DeviceAddress PANTALLA;
RelojDS1307Class Reloj;
byte bat1[8] = {B01110,B11011,B10001,B10001,B10001,B10001,B10001,B11111
};
byte bat2[8] = {B01110,B11011,B10001,B10001,B10001,B11111,B11111,B11111
};
byte bat3[8] = {B01110,B11011,B10001,B11111,B11111,B11111,B11111,B11111
};
byte bat4[8] = {B01110,B11111,B11111,B11111,B11111,B11111,B11111,B11111
};
void setup(){
lcd.init();
lcd.backlight();
lcd.createChar(2, bat1);
lcd.createChar(3, bat2);
lcd.createChar(4, bat3);
lcd.createChar(5, bat4);
pinMode(BUZZER,OUTPUT);
pinMode(VENT, OUTPUT);
pinMode(LUZPANT, OUTPUT);
pinMode(ABONO1, OUTPUT);
pinMode(ABONO2, OUTPUT);
pinMode(BOMBA, OUTPUT);
pinMode(rele3, OUTPUT);
pinMode(40, INPUT);//botonmanual
pinMode(41, INPUT);//botonoff
pinMode(42, INPUT);//boton2
pinMode(43, INPUT);//boton3
pinMode(44, INPUT);//boton4
Serial.print("Localizando sondas de temperatura: ");
Serial.print("Encontradas ");
Serial.print(sensors.getDeviceCount(), DEC);
Serial.println(" sondas.");
digitalWrite(BOMBA,LOW);
digitalWrite(VENT,HIGH);
digitalWrite(ABONO1,HIGH);
digitalWrite(ABONO2,HIGH);
digitalWrite(LUZPANT,LOW);
digitalWrite(BUZZER,LOW);
digitalWrite(rele3,HIGH);
lcd.setCursor(4,0);
lcd.print("HOLA ALBERTO");
lcd.setCursor(5,3);
lcd.print("PLABOT V2");
delay(2000);
lcd.setCursor(5,1);
lcd.print("condensador");
lcd.setCursor(3,1); lcd.write(2);delay(tiempo);
lcd.setCursor(3,1); lcd.write(3);delay(tiempo);
lcd.setCursor(3,1); lcd.write(4);delay(tiempo);
lcd.setCursor(3,1); lcd.write(5);delay(tiempo);
lcd.setCursor(3,1); lcd.write(2);delay(tiempo);
lcd.setCursor(3,1); lcd.write(3);delay(tiempo);
lcd.setCursor(3,1); lcd.write(4);delay(tiempo);
lcd.setCursor(3,1); lcd.write(5);delay(tiempo);
delay(1500);
lcd.clear();
lcd.setCursor(6,1);
lcd.print("¡LISTO!");
delay(1500);
lcd.clear();
}
void loop(){
Serial.begin(9600);
sensors.requestTemperatures();
printTemperature(ACUARIO);
digitalWrite(BOMBA,HIGH);
digitalWrite(ABONO1,HIGH);
digitalWrite(ABONO2,HIGH);
lcd.setCursor(6,2);
lcd.print("PUMP:SI");
lcd.setCursor(14,2);
lcd.print("K:NO");
lcd.setCursor(14,3);
lcd.print("Fe:NO");
float AGUA1 = sensors.getTempC(ACUARIO);
if(AGUA1 <= 28.8){
digitalWrite(VENT,HIGH);
lcd.setCursor(1,2);
lcd.print("V:NO");
}
if(AGUA1 >= 29){
digitalWrite(VENT,LOW);
lcd.setCursor(1,2);
lcd.print("V:SI");
}
if(AGUA1 >= 32){
tone(BUZZER,3000);
delay(2500);
noTone(BUZZER);
}
else if(AGUA1 <= 21){
tone(BUZZER,3000);
delay(2500);
noTone(BUZZER);
}
else{
noTone(BUZZER);
}
apagado(ACUARIO);
abonado(ACUARIO);
manual (ACUARIO);
contador=0;//volvemos a poner el contador manual a 0
apagado (ACUARIO);
contador=0;//volvemos a poner el contador apagado a 0
//programados la luz de la pantalla que posee un chip de reducción a 4 cables. Un relé esta conectado a los pines de la luz
if(Reloj.IsLater(9, 00) && Reloj.IsPrevious(22, 00)){
digitalWrite(LUZPANT,LOW);
}
else{
digitalWrite(LUZPANT,HIGH);
}
if(Reloj.IsLater(00, 00) && Reloj.IsPrevious(7, 00)){
lcd.noDisplay();
}
else{
lcd.display();
}
//mostramos un fallo en caso de un fallo en la sonda
if (!sensors.getAddress(ACUARIO, 0))
{
Serial.println("INCAPAZ DE ENCONTRAR SONDA ACUARIO");
lcd.setCursor(0,1);
lcd.print("FALLO S1");
}
if (sensors.getAddress(ACUARIO, 0))
{
lcd.setCursor(0,1);
lcd.print("S1--OK");
}
}
//mediante void manual cuando pulso el boton del pin 41, me saldrá un menú en el que
//mediante el número de pulsaciones del pin 42, puedo poner en modo manual (encendido)
//los distintos elementos
void manual (DeviceAddress deviceAddress){
botonmanual10=digitalRead(41);//hacemos dos comprobaciones del boton 41 y comprobamos lo que da la suma de ambas
delay(tiempo1);
botonmanual1=digitalRead(41);
sumamanual=botonmanual10+botonmanual1;
if (sumamanual==2){
lcd.clear(); }
while(sumamanual==2){
opciones(ACUARIO);
boton3actual=digitalRead(42);
if (boton3actual != boton3ultimo){
if (boton3actual == HIGH) {
contador = contador + 1;
}
}
boton3ultimo= boton3actual;
switch (contador){
case 1:
lcd.setCursor(19,0);
lcd.print("1");
boton4=digitalRead(43);
if(boton4==HIGH){
digitalWrite(BOMBA,HIGH);
}
break;
case 2:
lcd.setCursor(19,0);
lcd.print("2");
boton4=digitalRead(43);
if(boton4==HIGH){
digitalWrite(ABONO1,LOW);
}
break;
case 3:
lcd.setCursor(19,0);
lcd.print("3");
boton4=digitalRead(43);
if(boton4==HIGH){
digitalWrite(ABONO2,LOW);
}
break;
case 4:
lcd.setCursor(19,0);
lcd.print("4");
boton4=digitalRead(43);
if(boton4==HIGH){
digitalWrite(VENT, LOW);
}
break;
case 5:
lcd.setCursor(19,0);
lcd.print("5");
boton4=digitalRead(43);
if(boton4==HIGH){
digitalWrite(LUZPANT,LOW);
}
break;
case 6://salimos a la pantalla principal
lcd.setCursor(19,0);
lcd.print("6");
boton4=digitalRead(43);
if(boton4==HIGH){
sumamanual=3;
lcd.clear();
}
break;
default:
lcd.setCursor(19,0);
lcd.print("-");
contador=0;
}
}
}
//mediante void apagado cuando pulso el boton del pin 44, me saldrá un menú en el que
//mediante el número de pulsaciones del pin 42, puedo poner en modo apagado
//los distintos elementos
void apagado (DeviceAddress deviceAddress){
botonoff10=digitalRead(44);
delay(tiempo1);
botonoff1=digitalRead(44);
sumaoff=botonoff10+botonoff1;
if (sumaoff==2){
lcd.clear(); }
while(sumaoff==2){
opciones(ACUARIO);
boton3actual=digitalRead(42);
if (boton3actual != boton3ultimo){
if (boton3actual == HIGH) {
contador = contador + 1;
}
}
boton3ultimo= boton3actual;
boton4=digitalRead(43);
switch (contador){
case 1:
lcd.setCursor(19,0);
lcd.print("1");
boton4=digitalRead(43);
if(boton4==HIGH){
digitalWrite(BOMBA,LOW);
}
break;
case 2:
lcd.setCursor(19,0);
lcd.print("2");
boton4=digitalRead(43);
if(boton4==HIGH){
digitalWrite(ABONO1,HIGH);
}
break;
case 3:
lcd.setCursor(19,0);
lcd.print("3");
boton4=digitalRead(43);
if(boton4==HIGH){
digitalWrite(ABONO2,HIGH);
}
break;
case 4:
lcd.setCursor(19,0);
lcd.print("4");
boton4=digitalRead(43);
if(boton4==HIGH){
digitalWrite(VENT, HIGH);
}
break;
case 5:
lcd.setCursor(19,0);
lcd.print("5");
boton4=digitalRead(43);
if(boton4==HIGH){
digitalWrite(LUZPANT,HIGH);
}
break;
case 6://vuelvo a la pantalla principal
lcd.setCursor(19,0);
lcd.print("6");
boton4=digitalRead(43);
if(boton4==HIGH){
sumaoff=3;
lcd.clear();
}
break;
default:
lcd.setCursor(19,0);
lcd.print("-");
contador=0;
}
}
}
//este es el menú que sale en void manual o apagado
void opciones (DeviceAddress deviceAddress){
lcd.setCursor(2,0);
lcd.print("ALBERTO,elige");
lcd.setCursor(1,1);
lcd.print("1.BOMBA");
lcd.setCursor(1,2);
lcd.print("2.K2SO4");
lcd.setCursor(1,3);
lcd.print("3.Fe");
lcd.setCursor(10,1);
lcd.print("4.VENT");
lcd.setCursor(10,2);
lcd.print("5.PANT");
lcd.setCursor(10,3);
lcd.print("6.SALIR");
}
//este es mi intento del abonado. Algo lioso y dificil de entender pero lo importante
//es que no funciona
void abonado(DeviceAddress deviceAddress){
unsigned long retardo=0;
unsigned long retardo1=0;
if(millis()!=86400000){
if(Reloj.IsLater(14, 37) && Reloj.IsPrevious(14, 39)){
if(millis()*estadoprevio==0){
estadoprevio=millis();
}
}
if(millis()-estadoprevio==86400000){
retardo=millis();
lcd.clear();
while(retardo+5000>=millis()){
digitalWrite(ABONO1,LOW);
lcd.setCursor(3,1);
lcd.print("DOSIFICANDO");
lcd.setCursor(9,2);
lcd.print("Fe");
estadoprevio=0;
}
lcd.clear();
digitalWrite(ABONO1,HIGH);
lcd.setCursor(14,3);
lcd.print("Fe:NO");
lcd.setCursor(1,0);
lcd.print(Reloj.DateTime());
}
}
if(Reloj.IsLater(14, 34) && Reloj.IsPrevious(14, 36)){
if(repeticion!=0){
if(estadoprevio==0){
retardo1=millis();
lcd.clear();
while(retardo1+5000>=millis()){
digitalWrite(ABONO2,LOW);
lcd.setCursor(3,1);
lcd.print("DOSIFICANDO");
lcd.setCursor(7,2);
lcd.print("K2SO4");
}
repeticion=0;
lcd.clear();
digitalWrite(ABONO2,HIGH);
lcd.setCursor(14,2);
lcd.print("K:NO");
}
}
}
else{
repeticion=1;
}
}
//esto todavía no lo tengo terminado
void ultrasonidos (DeviceAddress deviceAddress){
int distancia;
unsigned long tardanza=0;
pinMode(ULTRASONI,OUTPUT);
digitalWrite(ULTRASONI,LOW);
delayMicroseconds(5);
digitalWrite(ULTRASONI,HIGH);
delayMicroseconds(5);
digitalWrite(ULTRASONI,LOW);
pinMode(ULTRASONI,INPUT);
tardanza=pulseIn(ULTRASONI,HIGH);
tardanza=tardanza/2;
distancia=int(0.034*tardanza);
lcd.setCursor(0,3);
lcd.print("NIVEL:");
lcd.setCursor(7,3);
lcd.print(distancia);
}
//mostramos las temperaturas y la hora
void printTemperature(DeviceAddress deviceAddress)
{
float AGUA1 = sensors.getTempC(ACUARIO);
Serial.print("ACUARIO: ");
Serial.print(AGUA1);
Serial.print(" ");
lcd.setCursor(1,0);
lcd.print(Reloj.DateTime());
lcd.setCursor(7,1);
lcd.print("TEMP:");
lcd.print(AGUA1);
}