Encontramos un código ya hecho por otra persona, para después modificarlo y adaptarlo para lo que ocupábamos, sin embargo nos hemos atorado en la idea de poner una válvula solenoide de 3 vías, ya que el código esta compuesto para hacer la función de estar mandando voltaje al relevador continuamente mientras esta activo el tiempo de la alarma.
lo que nosotros necesitamos es solo un pulso de activación de esperar un tiempo mientras se ejecuta el riego y mandar otro pulso para la activación para lo cual se aplicaran 2 relees
#include <TimerOne.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd (0x27, 16, 2); // conexion en (arduino leonardo: (scl->3dgt)(sda->2dgt)).(arduino 1: (scl->A5)(sda->A4))
const int PULSADOR_MODO = 4; // seleccionar entre ajustar reloj(hra,min) , alarma(hrs,min) y regresar al mod normal
const int PULSADOR_UP = 5; // aumentar hrs y min , activar alarma
const int PULSADOR_DOWN = 6; // disminuir hrs y min , desactivar alarma
const int PULSADOR_LUZ = 7; // enceder luz de lcd , interrumpir alarma
const int BUZZER = 9;
int horas=0;
int minutos=0;
volatile int segundos=0;
volatile boolean actualizar=true;
int horas_alarma=0; //variable que representa la hora a la que se va aactivar el riego
int minutos_alarma=0; //variable que representaa los minutosmamlos que se vaa activar la alarma
boolean alarmaOn=false; // variable que muestra si eta habilitada o desabiitada la alarma
int contador_alarma=0; //es el tiempo que tiene activa la alarma
boolean luzOn=false; //encender y apagar la luz e interrumoir actividad de la alarma
int contador_luz=0;//incremtenta este contado cada vez que pase 1 seg cuando se ocurra una interrupcion (talvez)
char texto[10];
int modo = 0;
const int N=6;
void setup(){
Wire.begin(); // para inicializar la lcd
lcd.begin(16,2); // declarar las medidas de la lcd
lcd.clear(); // limpiar la lcd
lcd.backlight(); // encendeer luz de la lcd
pinMode(PULSADOR_MODO, INPUT);
pinMode(PULSADOR_UP, INPUT);
pinMode(PULSADOR_DOWN, INPUT);
pinMode(PULSADOR_LUZ, INPUT);
pinMode(BUZZER, OUTPUT);
Timer1.initialize(1000000); //inicia el timer generando una interrupcion cada 1 seg
Timer1.attachInterrupt(manejadoraTimer); //ejecuta la variable manejadoraTimer cada vez que pasa 1 seg
}
//interrupcion t0 esta funcion se ejecuta cada segundo
void manejadoraTimer(){
segundos++;
if(luzOn==true){
contador_luz++;
}
if(digitalRead(BUZZER)==HIGH){
contador_alarma++;
}
actualizar=true;
// actualizar despues de cada segundo
}
//actualizar el relog e incrementar minutos y horas despues de cada 60seg o cada 60min
void actualizarReloj(){
minutos += segundos / 60;
segundos = segundos % 60;
horas += minutos / 60;
minutos = minutos % 60;
horas = horas % 24;
}
void incrementarHoras(){
horas ++;
horas = horas % 24;
actualizar=true;
}
void decrementarHoras(){
horas --;
if(horas<0){
horas = 23;
}
actualizar=true;
}
void incrementarHorasAlarma(){
horas_alarma++;
horas_alarma = horas_alarma % 24;
actualizar=true;
}
void decrementarHorasAlarma(){
horas_alarma--;
if(horas_alarma<0){
horas_alarma = 23;
}
actualizar=true;
}
void incrementarMinutosAlarma(){
minutos_alarma ++;
minutos_alarma = minutos_alarma % 60;
actualizar=true;
}
void decrementarMinutosAlarma(){
minutos_alarma --;
if(minutos_alarma<0){
minutos_alarma = 59;
}
actualizar=true;
}
void incrementarMinutos(){
minutos ++;
minutos = minutos % 60;
actualizar=true;
}
void decrementarMinutos(){
minutos --;
if(minutos<0){
minutos = 59;
}
actualizar=true;
}
void fijarCursorModo(){
switch(modo){
case 0:
lcd.noBlink();
break;
case 1:
lcd.setCursor(0, 0);
lcd.blink();
break;
case 2:
lcd.setCursor(3, 0);
lcd.blink();
break;
case 3:
lcd.setCursor(0, 1);
lcd.blink();
break;
case 4:
lcd.setCursor(3, 1);
lcd.blink();
break;
case 5:
lcd.setCursor(6, 1);
lcd.blink();
break;
}
}
void loop(){
if(digitalRead(PULSADOR_MODO)==HIGH){
contador_luz=0;
modo++;
modo = modo % N;
fijarCursorModo();
while(digitalRead(PULSADOR_MODO)==HIGH);
}
//comprueba si se esta precionando el boton la luz correctamente ,sin contar el buzzer (talvez)
if(digitalRead(PULSADOR_LUZ)==HIGH){
if(digitalRead(BUZZER)==HIGH){
digitalWrite(BUZZER, LOW);
contador_alarma=0;
}
contador_luz=0;
if(luzOn==false){
lcd.backlight();
}else{
lcd.noBacklight();
}
luzOn=!luzOn;
while(digitalRead(PULSADOR_LUZ)==HIGH); //es para si se activa muy rapido el lcd no de un rebote y se este apagando o encendiendo,con eso nos seguramos que se dejo se precionar el boton (talvez)
}
switch(modo){
//RELOJ
case 1:
if(digitalRead(PULSADOR_UP)==HIGH){
contador_luz=0;
incrementarHoras();
while(digitalRead(PULSADOR_UP)==HIGH);
}
if(digitalRead(PULSADOR_DOWN)==HIGH){
contador_luz=0;
decrementarHoras();
while(digitalRead(PULSADOR_DOWN)==HIGH);
}
break;
case 2:
if(digitalRead(PULSADOR_UP)==HIGH){
contador_luz=0;
incrementarMinutos();
while(digitalRead(PULSADOR_UP)==HIGH);
}
if(digitalRead(PULSADOR_DOWN)==HIGH){
contador_luz=0;
decrementarMinutos();
while(digitalRead(PULSADOR_DOWN)==HIGH);
}
break;
//ALARMA
case 3:
if(digitalRead(PULSADOR_UP)==HIGH){
contador_luz=0;
incrementarHorasAlarma();
while(digitalRead(PULSADOR_UP)==HIGH);
}
if(digitalRead(PULSADOR_DOWN)==HIGH){
contador_luz=0;
decrementarHorasAlarma();
while(digitalRead(PULSADOR_DOWN)==HIGH);
}
break;
case 4:
if(digitalRead(PULSADOR_UP)==HIGH){
contador_luz=0;
incrementarMinutosAlarma();
while(digitalRead(PULSADOR_UP)==HIGH);
}
if(digitalRead(PULSADOR_DOWN)==HIGH){
contador_luz=0;
decrementarMinutosAlarma();
while(digitalRead(PULSADOR_DOWN)==HIGH);
}
break;
/activar y descativar alarma/
case 5:
/on , off con bot up/
/*
if(digitalRead(PULSADOR_UP)==HIGH){
contador_luz=0;
alarmaOn=!alarmaOn;
actualizar=true;
while(digitalRead(PULSADOR_UP)==HIGH);
}
*/
/on=bot up , off=bot down/
if(digitalRead(PULSADOR_UP)==HIGH){
alarmaOn=true;
actualizar=true;
while(digitalRead(PULSADOR_UP)==HIGH);
}
if(digitalRead(PULSADOR_DOWN)==HIGH){
alarmaOn=false;
actualizar=true;
while(digitalRead(PULSADOR_DOWN)==HIGH);
}
break;
}
//checa si esta variable pasa a true cada vez que ocurre tal interrupcion, pone la variable true para poder actualizar la lcd(talvez)es una comprobacion
if(actualizar == true){
actualizarReloj();
lcd.clear();
lcd.noBlink();
//RELOJ(control)
lcd.setCursor(0,0); // sirve para posiscionar el cursor en la pantalla lcd
sprintf(texto, "%02d:%02d:%02d",horas,minutos, segundos);
lcd.print(texto);
//ALARMA (control de la alarma)
lcd.setCursor(0,1);
sprintf(texto, "%02d:%02d",horas_alarma,minutos_alarma);
lcd.print(texto);
//control para hacer coincidir el reloj con la alarma(comprobacion)(talvez)"pero solo si la alarma esta encendida"
if(alarmaOn ==true){
if(segundos==0 && horas == horas_alarma && minutos == minutos_alarma){
digitalWrite(BUZZER, HIGH);
}
lcd.print(" ON");
}else{
lcd.print(" OFF");
}
//tiempo que va a durar activado el relee (contador_alarma=="xxx"),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
if(contador_alarma==60){
digitalWrite(BUZZER, LOW);
contador_alarma=0;
}
//LUZ (control luz)
if(contador_luz==30){
lcd.noBacklight();
luzOn=false;
contador_luz=0;
}
actualizar = false;
fijarCursorModo();
}
}