Modulo de 2 Rele con función millis(), uno funciona y el otro no. (Arduino uno)

Buans tardes,
El sistema se compone de un modulo de 2 rele que se accionan independientes dependiendo de la cantidad de tiempo que proponga para cada uno. El tema es que uno de ellos (rele 4 funciona cada 30 seg) pero el rele 3 no funciona. (El rele en si mismo funciona correctamente, pero no reproduce la función).
Es parte de un sistema que mide temperatura y humedad con un sensor DHT22 y pantalla led I2C y que acciona, según los valores de temperatura y humedad, otro modulo de reles pero esos andan bien.
Soy químico no programador… ha sido prueba y error pero acá me quedé estancado.
Se agradece su colaboración

Aca esta el codigo que uso

//Libraries
#include <DHT.h>;
//I2C LCD:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display

//Constants
#define DHTPIN 4     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino
unsigned long t;

//Variables
//int chk;
float hum;  //Stores humidity value
float temp; //Stores temperature value
int RELE1 = 2;  //Relé que controla temp
int RELE2 = 7;  //Relé que controla humedad
int RELE3 = 8;  //Relé que controla luz
int RELE4 = 9;  //Relé que controla ventilador
void setup()
{
    Serial.begin(9600);
    Serial.println("ppdo's Temp and Humidity Sensor Test");
  dht.begin();
    lcd.init(); //initialize the lcd
    lcd.backlight(); //open the backlight
    pinMode(RELE1, OUTPUT);
pinMode(RELE2, OUTPUT);
  pinMode(RELE3, OUTPUT);
pinMode(RELE4, OUTPUT);
digitalWrite(RELE1, HIGH);
digitalWrite(RELE2, HIGH);
digitalWrite(RELE3, HIGH);
digitalWrite(RELE4, HIGH);
Serial.begin(9600);
t = millis();
}

void loop()
{
    //Read data and store it to variables hum and temp
    // Reading temperature or humidity takes about 250 milliseconds!
   
   { hum = dht.readHumidity();
    temp= dht.readTemperature();
    //Print temp and humidity values to serial monitor
    Serial.print("Humidity: ");
    Serial.print(hum);
    Serial.print(" %, Temp: ");
    Serial.print(temp);
    Serial.println(" Celsius");

    
// set the cursor to (0,0):
    lcd.setCursor(0, 0);
// print from 0 to 9:

    lcd.print("Temp: ");
    lcd.print(temp);
    lcd.print(" C");
  
    lcd.setCursor(0, 1);

    lcd.print("Humidity: ");
    lcd.print(hum);
    lcd.print(" %");
  
  delay(2000); //Delay 30 sec.
  } 
 if (temp < 19 +1)
    digitalWrite(RELE1, LOW);
    
if (temp > 18 +1)
    digitalWrite(RELE1, HIGH);

if (hum < 80 +1)
    digitalWrite(RELE2, LOW);
      
if (hum > 80 +1)
    digitalWrite(RELE2, HIGH );


{if ( millis() >= t + 30000 ) {
  
   if ( RELE4==HIGH )
     RELE4=LOW;
   else
    RELE4=HIGH;
   digitalWrite(9,RELE4);
   // Guardamos el tiempo de nuevo para comprobar en las siguientes
   // pasadas.
   t = millis();  }}
   
{if ( millis() >= t + 45000 ) {
  
   if ( RELE3==HIGH )
     RELE3=LOW;
   else
    RELE3=HIGH;
   digitalWrite(8,RELE3);
   // Guardamos el tiempo de nuevo para comprobar en las siguientes
   // pasadas.
   t = millis();  }}

  
}

Se agradece su colaboración.

Tienes llaves por todo el código sin sentido, puedes ver si están bien apretando Ctrl+T, ninguna linea tendrá que aparecer pegada a la izquierda si no ha finalizado el loop.
Explícanos con mas detalle que debe hacer para contrastar con el código.

//Libraries
#include <DHT.h>;
//I2C LCD:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

//Constants
#define DHTPIN 4     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino
unsigned long t;

//Variables
//int chk;
float hum;  //Stores humidity value
float temp; //Stores temperature value
int RELE1 = 2;  //Relé que controla temp
int RELE2 = 7;  //Relé que controla humedad
int RELE3 = 8;  //Relé que controla luz
int RELE4 = 9;  //Relé que controla ventilador
void setup() {
  Serial.begin(9600);
  Serial.println("ppdo's Temp and Humidity Sensor Test");
  dht.begin();
  lcd.init(); //initialize the lcd
  lcd.backlight(); //open the backlight
  pinMode(RELE1, OUTPUT);
  pinMode(RELE2, OUTPUT);
  pinMode(RELE3, OUTPUT);
  pinMode(RELE4, OUTPUT);
  digitalWrite(RELE1, HIGH);
  digitalWrite(RELE2, HIGH);
  digitalWrite(RELE3, HIGH);
  digitalWrite(RELE4, HIGH);
  Serial.begin(9600);
  t = millis();
}

void loop() {
  //Read data and store it to variables hum and temp
  // Reading temperature or humidity takes about 250 milliseconds!

  hum = dht.readHumidity();
  temp = dht.readTemperature();
  //Print temp and humidity values to serial monitor
  Serial.print("Humidity: ");
  Serial.print(hum);
  Serial.print(" %, Temp: ");
  Serial.print(temp);
  Serial.println(" Celsius");


  // set the cursor to (0,0):
  lcd.setCursor(0, 0);
  // print from 0 to 9:

  lcd.print("Temp: ");
  lcd.print(temp);
  lcd.print(" C");

  lcd.setCursor(0, 1);

  lcd.print("Humidity: ");
  lcd.print(hum);
  lcd.print(" %");

  delay(2000); //Delay 30 sec.

  if (temp < 19 + 1)
    digitalWrite(RELE1, LOW);

  if (temp > 18 + 1)
    digitalWrite(RELE1, HIGH);

  if (hum < 80 + 1)
    digitalWrite(RELE2, LOW);

  if (hum > 80 + 1)
    digitalWrite(RELE2, HIGH );


  if ( millis() >= t + 30000 ) {

    if ( RELE4 == HIGH )
      RELE4 = LOW;
    else
      RELE4 = HIGH;
    digitalWrite(9, RELE4);
    // Guardamos el tiempo de nuevo para comprobar en las siguientes
    // pasadas.
    t = millis();
  }

  if ( millis() >= t + 45000 ) {

    if ( RELE3 == HIGH )
      RELE3 = LOW;
    else
      RELE3 = HIGH;
    digitalWrite(8, RELE3);
    // Guardamos el tiempo de nuevo para comprobar en las siguientes
    // pasadas.
    t = millis();
  }
}

Gracias!!!! ahora me fijo lo de las llaves....
El rele 1 acciona según Temperatura
El rele 2 acciona según humedad.
Estos dos funcionan bien!
El rele 3 necesito que accione cada 12hs
y el rele 4 cada 10 min...

No me aparece ninguna linea a la izquierda cuando apreto ctrl+T....

muchas gracias!!!

Hi,
Aqui el problema esta cuando comparas

if ( RELE4 == HIGH )
      RELE4 = LOW;
    else
      RELE4 = HIGH;

no vaz a tener resultado ya que cuando comparas RELE4 == HIGH no tiene resultado ya que RELE4 no tiene la condicion de HIGH o LOW. Para poder comparar si el RELE3 y RELE4 tienes que guardar la condicion en una variable que indique la condicion de 0 o 1. Adjunto tu sketch modificado usando las variables de flag_rly3 y flag_rly4 para guardar la condicion del relay 3 y 4. Tratalo parar ver si el relay 3 y 4 te trabaja. Posiblemente hay una mejor forma de hacerlo pero ver si es el problema en la forma de comparar usando el RELE4 para ver la condicion HIGH o LOW.

//Libraries
#include <DHT.h>;
//I2C LCD:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>

LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

//Constants
#define DHTPIN 4     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino
unsigned long t;

//Variables
//int chk;
float hum;  //Stores humidity value
float temp; //Stores temperature value
int RELE1 = 2;  //Relé que controla temp
int RELE2 = 7;  //Relé que controla humedad
int RELE3 = 8;  //Relé que controla luz
int RELE4 = 9;  //Relé que controla ventilador
byte flag_rly3;
byte flag_rly4;
//*********************************************************
void setup()
{
  Serial.begin(9600);
  Serial.println("ppdo's Temp and Humidity Sensor Test");
  dht.begin();
  lcd.init(); //initialize the lcd
  lcd.backlight(); //open the backlight
  pinMode(RELE1, OUTPUT);
  pinMode(RELE2, OUTPUT);
  pinMode(RELE3, OUTPUT);
  pinMode(RELE4, OUTPUT);
  digitalWrite(RELE1, HIGH);
  digitalWrite(RELE2, HIGH);
  digitalWrite(RELE3, HIGH); flag_rly3 = 1;
  digitalWrite(RELE4, HIGH); flag_rly4 = 1;
  Serial.begin(9600);
  t = millis();
}

void loop()
{
  //Read data and store it to variables hum and temp
  // Reading temperature or humidity takes about 250 milliseconds!

  { hum = dht.readHumidity();
    temp = dht.readTemperature();
    //Print temp and humidity values to serial monitor
    Serial.print("Humidity: ");
    Serial.print(hum);
    Serial.print(" %, Temp: ");
    Serial.print(temp);
    Serial.println(" Celsius");


    // set the cursor to (0,0):
    lcd.setCursor(0, 0);
    // print from 0 to 9:

    lcd.print("Temp: ");
    lcd.print(temp);
    lcd.print(" C");

    lcd.setCursor(0, 1);

    lcd.print("Humidity: ");
    lcd.print(hum);
    lcd.print(" %");

    delay(2000); //Delay 30 sec.
  }
  if (temp < 19 + 1)
    digitalWrite(RELE1, LOW);

  if (temp > 18 + 1)
    digitalWrite(RELE1, HIGH);

  if (hum < 80 + 1)
    digitalWrite(RELE2, LOW);

  if (hum > 80 + 1)
    digitalWrite(RELE2, HIGH );


{ if ( millis() >= t + 30000 ) {

      if ( flag_rly4 == 1 )
        flag_rly4 = LOW;
      else
        flag_rly4 = 1;
      digitalWrite(RELE4, HIGH);
      // Guardamos el tiempo de nuevo para comprobar en las siguientes
      // pasadas.
      t = millis();
    }
  }

{ if ( millis() >= t + 45000 ) {

      if ( flag_rly3 == 1 )
        flag_rly3 = 0;
      else
        digitalWrite(RELE3, HIGH );
      // Guardamos el tiempo de nuevo para comprobar en las siguientes
      // pasadas.
      t = millis();
    }
  }


}

Muchas Gracias tauro0221
no pasó nada...
puede ser por que al rele 3 y 4 les asigno la misma variable? por que cuando bajo la cantidad de tiempo a uno de ellos... el de menor tiempo acciona y el de mayor tiempo no...
ayy no se..jajaja gracias por tu ayuda!!!!

Usas la misma variable de comparación para todos los relés.
Obviamente se ejecutan los t mas rápidos porque eso el mas lento de 45000 mseg no se ejecuta.
Crea variables t1, t2....tn para cada caso.

if ( millis() >= t4 + 30000 ) {
	if ( RELE4 == HIGH )
		RELE4 = LOW;
    else
		RELE4 = HIGH;
    digitalWrite(9, RELE4);
    // Guardamos el tiempo de nuevo para comprobar en las siguientes
    // pasadas.
    t4 = millis();
  }

  if ( millis() >= t3 + 45000 ) {

    if ( RELE3 == HIGH )
      RELE3 = LOW;
    else
      RELE3 = HIGH;
    digitalWrite(8, RELE3);
    // Guardamos el tiempo de nuevo para comprobar en las siguientes
    // pasadas.
    t3 = millis();
  }

asocié los t a los relés involucrados.
Ajusta las variables globales correspondientes.