Codigo para modulo relé doble canal

Hola a todos, estoy tratando de controlar dos electrovalvulas con arduino y un modulo relé de doble canal. Mi problema es que en el código que tengo solo activa un relé( el que tiene el tiempo mas reciente) y el otro lo ignora. Por favor alguna idea de que esta mal en mi codigo. Gracias de antemano

#include <Wire.h>    
#include <RTClib.h>   

RTC_DS3231 rtc;     

bool evento_inicio = true;  
bool evento_fin = true;   

#define relaypin1  3
#define relaypin2  4
        
void setup () {
 Serial.begin(9600);    
 pinMode(relaypin1, OUTPUT);   
 pinMode(relaypin2, OUTPUT);   


 if (! rtc.begin()) {       
 Serial.println("Modulo RTC no encontrado !");  
 while (1);         
 }
}

void loop () {
 DateTime fecha = rtc.now();        
              
              {
 if ( fecha.hour() == 18 && fecha.minute() == 54 ){ 
    if ( evento_inicio == true ){     
      digitalWrite(relaypin1, HIGH);       
      Serial.println( "Rele encendido" );   
      evento_inicio = false;        
    }             
  }


 if ( fecha.hour() == 18 && fecha.minute() == 55 ){ 
    if ( evento_fin == true ){        
      digitalWrite(relaypin1, LOW);        
      Serial.println( "Rele apagado" );     
      evento_fin = false;       
    }             
  }}


   {
 if ( fecha.hour() == 18 && fecha.minute() == 53 ){ 
    if ( evento_inicio == true ){     
      digitalWrite(relaypin2, HIGH);       
      Serial.println( "Rele encendido" );   
      evento_inicio = false;        
    }             
  }


 if ( fecha.hour() == 18 && fecha.minute() == 54 ){ 
    if ( evento_fin == true ){        
      digitalWrite(relaypin2, LOW);   
      Serial.println( "Rele apagado" );   
      evento_fin = false;       
    }             
  }}

 Serial.print(fecha.day());       
 Serial.print("/");         
 Serial.print(fecha.month());  
 Serial.print("/");         
 Serial.print(fecha.year());  
 Serial.print(" ");         
 Serial.print(fecha.hour());      
 Serial.print(":");         
 Serial.print(fecha.minute());     
 Serial.print(":");         
 Serial.println(fecha.second());     
 
 delay(1000);           

  if ( fecha.hour() == 2 && fecha.minute() == 0 ){  // si hora = 2 y minutos = 0 restablece valores de
    evento_inicio = true;       // variables de control en verdadero
    evento_fin = true;
  }}

Hola @skyward29 ,
por favor ponga su boceto en etiquetas (</>) y lea:

Tu boceto comienza con

start_event = true;
event_fin = verdadero;

en el primero si de cada evento pones cada uno en "false",
y ya no lo establece en "true" y, por lo tanto, no se ejecutan más eventos.

Como no sé cuál es la lógica de su proyecto, no pude corregirlo.

obs: En su boceto, hay 2 "{" y 2 "}" innecesarios.

RV mineirin

Moderador:
Por favor, lee las Normas del foro y edita tu código usando etiquetas de código.
Ve a edición, luego selecciona todo el error que has publicado, lo cortas y click en </>


Aunque sea una sola línea de código o error debe ir con etiquetas.
IMPORTANTE:No sigas respondiendo sin editar lo que te he solicitado.

Así como lo tienes escrito, al ocurrir el 1er evento. y como no reseteas las variables de control hasta las 02:00, cualquier evento posterior se ignora.

Necesitas otro par de variables de control para el 2do. relé.
O sea, agregar por ej.

bool evento_inicio2 = true; 
bool evento_fin2 = true;

Otra posibilidad, que yo veo más lógica, es resetear las variables en el evento "contrario", o sea

bool evento_inicio = true; 
bool evento_fin = false;

// en cada evento de encendido

Serial.println( "Rele encendido" );
evento_inicio = false;
evento_fin = true;
}

// en cada evento de apagado

Serial.println( "Rele apagado" );
evento_fin = false;
evento_inicio = true;
}

Así te va a funcionar en el código tal cual lo has planteado pero tiene el problema que no te permite solapar los eventos, por ej. encender un relé 18:53, el otro 18:54 y apagarlo 18:55 pero al 1ro apagarlo 19:01.
Además yo modificaría el orden de las comparaciones para que los horarios queden de menor a mayor.

Lo mejor, creo, es mezclar ambas soluciones, usar 2 pares de variables de control pero resetearlas como te indico más arriba.

Y te olvidas de resetearlas a las 02:00, que no entiendo por qué lo has ideado así y, para ser sincero, no le veo sentido.

Saludos

PD: Por favor corrige el código como ya te han solicitado

Hola, gracias por responder.
Disculpas por no poner el boceto entre (</>) leeré con mas detenimiento las reglas.
Ok entiendo el error aprecio mucho la ayuda.

Hola, gracias por responder.
La idea de resetearlo a las 2 era para que la rutina continúe diariamente.
Entiendo el error, lo intentare como me indicas, aprecio mucho la ayuda, saludos.

En #4 no te expliqué el por qué de setear/resetear las variables de control de esa forma.

Ubiquémonos en momento de inicio del loop inmediatamente luego de haberse ejecutado el setup() e imaginemos que trabajamos con un solo relé para facilitar la explicación.

El programa solo debería esperar eventos de encendido del relé porque no tiene sentido un evento de apagado todavía ya que el relé está apagado por defecto.
Entonces la variable de control de encendido, según como has planteado tu lógica, debe ser verdadera y la de control de apagado debe ser falsa.
En otras palabras, ¿Espera el encendido? Si. ¿Espera el apagado? No, ya está apagado.

Una vez detectado el horario de encendido, pones en falso la variable de control de encendido, para que éste no se repita hasta que previamente se haya apagado, y entonces pones en verdadera la variable de control de apagado para habilitar la espera de este segundo evento.
Otra vez, ¿Espera el encendido? No, ya está encendido. ¿Espera el apagado? Si.

Cuando ocurre el apagado, pones su variable de control en falso (porque ese relé ya se apagó) y pones la variable de control de encendido en verdadero para habilitar la espera de delnuevo encendido.
Ahora, como al principio, ¿Espera el encendido? Si. ¿Espera el apagado? No, ya se apagó.

Lo mismo para el resto de los relés con sus respectivas variables de control.

Espero sirva la explicación (si acaso te hiciera falta :wink: ).

Saludos

Disculpas, tendré mas cuidado para la próxima, gracias.

#include <Wire.h>
#include <RTClib.h>

RTC_DS3231 rtc;

bool evento_inicio = true;
bool evento_fin = true;

#define relaypin1 3
#define relaypin2 4

void setup () {
  Serial.begin(9600);
  pinMode(relaypin1, OUTPUT);
  pinMode(relaypin2, OUTPUT);

  if (! rtc.begin()) {
    Serial.println("Modulo RTC no encontrado !");
    while (1);
  }
}

void loop () {
  DateTime fecha = rtc.now();

  {
    if ( fecha.hour() == 18 && fecha.minute() == 54 ) {
      if ( evento_inicio == true ) {
        digitalWrite(relaypin1, HIGH);
        Serial.println( "Rele encendido" );
        evento_inicio = false;
      }
    }

    if ( fecha.hour() == 18 && fecha.minute() == 55 ) {
      if ( evento_fin == true ) {
        digitalWrite(relaypin1, LOW);
        Serial.println( "Rele apagado" );
        evento_fin = false;
      }
    }
  }

  {
    if ( fecha.hour() == 18 && fecha.minute() == 53 ) {
      if ( evento_inicio == true ) {
        digitalWrite(relaypin2, HIGH);
        Serial.println( "Rele encendido" );
        evento_inicio = false;
      }
    }

    if ( fecha.hour() == 18 && fecha.minute() == 54 ) {
      if ( evento_fin == true ) {
        digitalWrite(relaypin2, LOW);
        Serial.println( "Rele apagado" );
        evento_fin = false;
      }
    }
  }

  Serial.print(fecha.day());
  Serial.print("/");
  Serial.print(fecha.month());
  Serial.print("/");
  Serial.print(fecha.year());
  Serial.print(" ");
  Serial.print(fecha.hour());
  Serial.print(":");
  Serial.print(fecha.minute());
  Serial.print(":");
  Serial.println(fecha.second());

  delay(1000);

  if ( fecha.hour() == 2 && fecha.minute() == 0 ) { // si hora = 2 y minutos = 0 restablece valores de
    evento_inicio = true; // variables de control en verdadero
    evento_fin = true;
  }
}