Activar desactivar relés de forma temporizada con millis

Buenas. Llevo todo el día de hoy intentando programar con millis lo soguiente:

Arduino recibe una señal digital.

Al recibir esta señal, se activa relé 1 y relé 2 espera varios minutos para encenderse.
Si se corta la señal digital, el relé 2 se apaga y el relé 1 permanece encendido un par de minutos.

Esta era la base que luego quería complicar un poco más, haciendo que los pines del 6 al 12 fuesen salidas digitales de encendido temporizado con un minuto de incremento cada uno (para poder poner controlar el tiempo de espera del relé 1 sólo cambiando un cable de lugar) y los pines del 2 al 5, fuesen salidas digitales de apagado temporizado con un minuto de incremento también (pero partiendo de 0 minutos en lugar de desde 1) para controlar el comportamiento del relé 2 de idéntica forma.

Pues, aunque tengo correctamente realizado el montaje físico de la placa, soy incapaz de hacer que funcione ni la idea base; no me aclaro con el código y no entiendo qué está mal. Estoy bastante desesperado, la verdad; a ver si podéis ayudarme.

#include <Bounce2.h>                                    // Incluimos biblioteca Bounce para eliminar el debouncing producido el rele de entrada

int BOMBA0M       = 2 ;
int BOMBA1M       = 3 ;
int BOMBA2M       = 4 ;
int BOMBA3M       = 5 ;
int AEROTERMIA1M  = 6 ;
int AEROTERMIA2M  = 7 ;
int AEROTERMIA3M  = 8 ;
int AEROTERMIA4M  = 9 ;
int AEROTERMIA5M  = 10 ;
int AEROTERMIA6M  = 11 ;
int AEROTERMIA7M  = 12 ;
int ONOFF         = 13 ;

unsigned long TIEMPOPULSADO = 0;
byte TEMP = 0;

Bounce debouncer = Bounce();                           // Iniciado un objeto Bounce

void setup() {
  pinMode( BOMBA0M , OUTPUT);                           // Sin retardador apagado bomba
  pinMode( BOMBA1M , OUTPUT);                           // Retardo 1 minuto apagado bomba
  pinMode( BOMBA2M , OUTPUT);                           // Retardo 2 minutos apagado bomba
  pinMode( BOMBA3M , OUTPUT);                           // Retardo 3 minutos apagado bomba
  pinMode( AEROTERMIA1M , OUTPUT);                      // Retardo 1 minuto encendido aerotermia
  pinMode( AEROTERMIA2M , OUTPUT);                      // Retardo 2 minutos encendido aerotermia
  pinMode( AEROTERMIA3M , OUTPUT);                      // Retardo 3 minutos encendido aerotermia
  pinMode( AEROTERMIA4M , OUTPUT);                      // Retardo 4 minutos encendido aerotermia
  pinMode( AEROTERMIA5M , OUTPUT);                      // Retardo 5 minutos encendido aerotermia
  pinMode( AEROTERMIA6M , OUTPUT);                      // Retardo 6 minutos encendido aerotermia
  pinMode( AEROTERMIA7M , OUTPUT);                      // Retardo 7 minutos encendido aerotermia

  pinMode( ONOFF , INPUT_PULLUP);                       // Senal de la deshumidificadora
  
  debouncer.attach(ONOFF);
  debouncer.interval(50);                               // intervalo en ms, mas alto por ser un interruptor manual
}

void loop() {

  debouncer.update();                                  // Actualizar los estados Bounce
  
  int valor1 = debouncer.read();                       // Leemos el del pulsador

  if (digitalRead(valor1)==HIGH) {  
      TIEMPOPULSADO=millis(); 
      TEMP = 1;
      digitalWrite(AEROTERMIA1M,LOW);
      }
  if((millis()>TIEMPOPULSADO+2500)&&TEMP==1){
      digitalWrite(AEROTERMIA1M,HIGH);
      TEMP = 0;
      }
      
   digitalWrite(BOMBA0M,valor1) ;              //apagamos las bombas
      

  }

Moderador: Por qué una simple pregunta de software es posteada en el foro Proyectos? Ya deberías saber como se postea y DONDE corresponde cada cosa. Por esa razón moví el hilo a software.

Esto debería corregir tu error.

void loop() {

  debouncer.update();                                  // Actualizar los estados Bounce
  
  int valor1 = debouncer.read();                       // Leemos el del pulsador

  if (valor1) {  
      TIEMPOPULSADO = millis(); 
      TEMP = 1;
      digitalWrite(AEROTERMIA1M,LOW);
  }
  if (millis()>TIEMPOPULSADO+2500 && TEMP){
      digitalWrite(AEROTERMIA1M,HIGH);
      TEMP = 0;
  }
      
  digitalWrite(BOMBA0M,valor1) ;              //apagamos las bombas   
}

Si usas bounce2 no hace falta llamar a digitalRead, Bounce2 se encarga de ello. Si no, que sentido tiene?

¡Muchísimas gracias por desatascarme!

Lo de colocarlo fuera de sitio, pues mezcla de costumbre y la ofuscación propia del desespero.

Ahora ya me funciona perfectamente y en un momento he podido terminar todo el código. Lo pongo a continuación por si a alguien le es útil:

#include <Bounce2.h>                                    // Incluimos biblioteca Bounce para eliminar el debouncing producido el rele de entrada

int BOMBA0M       = 2 ;
int BOMBA1M       = 3 ;
int BOMBA2M       = 4 ;
int BOMBA3M       = 5 ;
int AEROTERMIA1M  = 6 ;
int AEROTERMIA2M  = 7 ;
int AEROTERMIA3M  = 8 ;
int AEROTERMIA4M  = 9 ;
int AEROTERMIA5M  = 10 ;
int AEROTERMIA6M  = 11 ;
int AEROTERMIA7M  = 12 ;
int ONOFF         = 13 ;

unsigned long TIEMPOPULSADO = 0;
unsigned long TIEMPOPULSADO2 = 0;
byte TEMP = 0;
byte TEMP2 = 0;

Bounce debouncer = Bounce();                           // Iniciado un objeto Bounce

void setup() {
  pinMode( BOMBA0M , OUTPUT);                           // Sin retardador apagado bomba
  pinMode( BOMBA1M , OUTPUT);                           // Retardo 1 minuto apagado bomba
  pinMode( BOMBA2M , OUTPUT);                           // Retardo 2 minutos apagado bomba
  pinMode( BOMBA3M , OUTPUT);                           // Retardo 3 minutos apagado bomba
  pinMode( AEROTERMIA1M , OUTPUT);                      // Retardo 1 minuto encendido aerotermia
  pinMode( AEROTERMIA2M , OUTPUT);                      // Retardo 2 minutos encendido aerotermia
  pinMode( AEROTERMIA3M , OUTPUT);                      // Retardo 3 minutos encendido aerotermia
  pinMode( AEROTERMIA4M , OUTPUT);                      // Retardo 4 minutos encendido aerotermia
  pinMode( AEROTERMIA5M , OUTPUT);                      // Retardo 5 minutos encendido aerotermia
  pinMode( AEROTERMIA6M , OUTPUT);                      // Retardo 6 minutos encendido aerotermia
  pinMode( AEROTERMIA7M , OUTPUT);                      // Retardo 7 minutos encendido aerotermia

  pinMode( ONOFF , INPUT_PULLUP);                       // Senal de la deshumidificadora
  
  debouncer.attach(ONOFF);
  debouncer.interval(50);                               // intervalo en ms, mas alto por ser un interruptor manual
}

void loop() {

  debouncer.update();                                  // Actualizar los estados Bounce
  
  int valor1 = debouncer.read();                       // Leemos el del pulsador

  if (!valor1) {  
      TIEMPOPULSADO = millis(); 
      TEMP = 1;
      digitalWrite(AEROTERMIA1M,LOW);
      digitalWrite(AEROTERMIA2M,LOW);
      digitalWrite(AEROTERMIA3M,LOW);
      digitalWrite(AEROTERMIA4M,LOW);
      digitalWrite(AEROTERMIA5M,LOW);
      digitalWrite(AEROTERMIA6M,LOW);
      digitalWrite(AEROTERMIA7M,LOW);
  }
  if (millis()>TIEMPOPULSADO+60000 && TEMP){
      digitalWrite(AEROTERMIA1M,HIGH);

  }
   if (millis()>TIEMPOPULSADO+120000 && TEMP){
      digitalWrite(AEROTERMIA2M,HIGH);

  }     

   if (millis()>TIEMPOPULSADO+180000 && TEMP){
      digitalWrite(AEROTERMIA3M,HIGH);

  }

    if (millis()>TIEMPOPULSADO+240000 && TEMP){
      digitalWrite(AEROTERMIA4M,HIGH);

  }

    if (millis()>TIEMPOPULSADO+300000 && TEMP){
      digitalWrite(AEROTERMIA5M,HIGH);

  }

    if (millis()>TIEMPOPULSADO+360000 && TEMP){
      digitalWrite(AEROTERMIA6M,HIGH);

  }

    if (millis()>TIEMPOPULSADO+420000 && TEMP){
      digitalWrite(AEROTERMIA7M,HIGH);
      TEMP = 0;

  }
  digitalWrite(BOMBA0M,valor1) ;

    if (valor1) {  
      TIEMPOPULSADO2 = millis(); 
      TEMP2 = 1;
      digitalWrite(BOMBA1M,HIGH);
      digitalWrite(BOMBA2M,HIGH);
      digitalWrite(BOMBA3M,HIGH);
     
  }
  if (millis()>TIEMPOPULSADO2+60000 && TEMP2){
      digitalWrite(BOMBA1M,LOW);

  }
   if (millis()>TIEMPOPULSADO2+120000 && TEMP2){
      digitalWrite(BOMBA2M,LOW);

  }     

   if (millis()>TIEMPOPULSADO2+180000 && TEMP2){
      digitalWrite(BOMBA3M,LOW);
      TEMP2 = 0;
}
}

Seguramente había formas más eficientes y elegantes de llegar al mismo resultado, pero no me quejo; ¡funciona!

Mas elegante sería usar un array pero con la misma funcionalidad. Si quieres lo hacemos?