programador por segundos

Buenas a todos,

Soy nuevo en el foro y llevo poco tiempo con Arduino. Estoy intentando activar un rele para un sistema de lluvia. Hasta ahí todo perfecto. El problema llega cuando intento programar la activación de varias alarmas por segundos.

Utilizo esta función para la lectura de la hora del reloj y la activación de las alarmas. Supongo que será totalmente mejorable pero como os digo llevo 1 mes con arduino.

int alarma(int hor_on, int min_on, int seg_on, int hor_off, int min_off, int seg_off, int temporizador){
Data d = rtc.getData();

if(NumMins(hor_off,min_off,seg_off) > NumMins(hor_on,min_on,seg_on)){
if((NumMins(d.hour24h,d.minutes,d.seconds) >= NumMins(hor_on,min_on,seg_on)) && (NumMins(d.hour24h,d.minutes,d.seconds) <= NumMins(hor_off,min_off,seg_off))){
digitalWrite(temporizador, HIGH);
Serial.println(“ENCENDIDO”);
}
if (NumMins(d.hour24h,d.minutes,d.seconds) > NumMins(hor_off,min_off,seg_off)){
digitalWrite(temporizador, LOW);
Serial.println( “APAGADO” );
}

Le paso los parámetros de esta forma…

alarma(10,18,00,10,18,10,rele);

Todo esto funciona correctamente, la duda me surge cuando pongo otra alarma…

alarma(10,20,00,10,20,10,rele);

El caso es que se enciende el rele pero se apaga y enciende durante el tiempo de la alarma, ya que al mandar los datos de la segunda alarma apaga el rele. Se porqué pasa pero no se como solucionarlo con la programación, he intentado varias cosas con nungún resultado positivo.

Modificando el nombre de la variable del rele para que no lo apague:

alarma(11,18,00,11,18,10,rele2);//////////////////////LLuvia 1 minuto.
if (rele2 == HIGH) {}
else {int rele3 = 3;
}
alarma(11,19,00,11,19,10,rele3);//////////////////////Lluvia 1 minuto.
if (rele3 == HIGH) {}
else {int rele4 = 3;
}
alarma(11,20,00,11,20,10,rele4);//////////////////////Lluvia 1 minuto.
if (rele4 == HIGH) {}
else {int rele5 = 3;
}

alarma(11,20,40,11,20,50,rele5);//////////////////////Lluvia 1 minuto.
if (rele5 == HIGH) {}
else {int rele3 = 3;
}
alarma(11,21,00,11,21,10,rele6);
if (rele6 == HIGH) {}
else {int rele2 = 3;
}
}

Pero como os comento no obtengo buenos resultados…

de esta forma tampoco:

if (digitalRead(rele2) == HIGH) {
}
else {
alarma(9,10,00,9,10,10,rele2);//////////////////////LLuvia 1 minuto.
if (digitalRead(rele2) == HIGH) {
}
else {
alarma(9,11,00,9,11,15,rele2);//////////////////////Lluvia 20 segundos.
if (digitalRead(rele2) == HIGH) {
}
else{
alarma(9,12,00,9,12,10,rele2);//////////////////////Lluvia 1 minuto.
if (digitalRead(rele2) == HIGH){
}
else{
alarma(9,12,40,9,12,50,rele2);//////////////////////Lluvia 1 minuto.
if (digitalRead(rele2) == HIGH){
}
else{
alarma(9,13,00,9,13,10,rele2);//////////////////////Lluvia 1 minuto
}
}
}
}
}

Se que mis conocimientos son pobres, pero os agradecería que si no podéis ayudarme por lo menos orientarme de que forma puedo arreglar este problema. Principalmente quiero aprender.

Un saludo y muchas gracias

Woow tu post si que es difícil de leer por que no mejor te pasas por el post "Normas del foro" Ahí podrás ver la forma adecuada de crear un tema y será mucho más fácil para las demás personas leer tu problema y tratar de darte una solución porque sinceramente no le veo ni pies ni cabeza a tu código, espero y no te molestes pero es que no es lo mismo que tu veas tu código ya que eres el creador a que alguien que no lo conozca lo vea por primera vez. Saludos

Ademas de seguir el consejo de mike_117 postea todo el código.

Hola.
El problema es que lo que una alarma activa, la otra lo desactiva.
Modifica tu función alarma, quitando el parámetro de pin o relé para que en lugar de encender/apagar el pin sencillamente devuelva 0 ó 1 (o true/false) para indicar si esa alarma está activa.
Entonces, desde el loop construyes la condición para encender o apagar el pin:

if (alarma(9,11,00,9,11,15) || alarma(9,12,00,9,11,15) || ....) 
    digitalWrite(rele2, HIGH);
else digitalWrite(rele2,LOW);

Aunque visto tu ejemplo, si coincide con lo que quieres hacer, yo "comprimiría" la lógica de tus alarmas para no tener que comprobar tropecientas alarmas distintas.
Saludos

Buenos días,

Muchas gracias a todos por las recomendaciones. Noter intentaré hacer lo que me dices a ver que tal va, la verdad que no se me había ocurrido, muchas gracias

Un saludo