Reles

Perdonad por mi poca experiencia pero intento usar varios reles con varios botones y no consigo solo he llegado a configurar un rele y un botón.

int pulsador=0;              //almacena el estado del botón
int estado=0;                //0=led apagado, 1=led encendido
int pulsadorAnt=0;           //almacena el estado anterior del boton

//** Programa **//

void setup() {
 pinMode(2, OUTPUT);        //declaramos el pin 2 como salida
 pinMode(3, INPUT);         //declaramos el pin 4 como entrada

}

void loop() {
 pulsador = digitalRead(3); //lee si el botón está pulsado
 
 if((pulsador==HIGH)&&(pulsadorAnt==LOW)){  //si el boton es pulsado y antes no lo estaba
   estado=1-estado;
   delay(200);               //pausa de 40 ms
 }
 pulsadorAnt=pulsador;      //actualiza el nuevo estado del boton        
 
 if(estado==1) {            //si el estado es 1
   digitalWrite(2, HIGH);   //se enciende el led
 }
 else{                      //si el estado es 0
   digitalWrite(2, LOW);    //se apaga el led
  
 }
}

alguien podria decirme como usar mas reles y botones?
Gracias de antemano.

Mal publicado, por eso lo acabo de mover al lugar que corresponde.
Pero a ti te toca leer las normas del foro y editar tu mensaje.

Este parece un código y un problema que ya he contestado anteriormente.
Y lo plantearon igual que tu. Que lo tienes resuelto para 1 pulsador y no sabes como hacerlo con los demas.

Esta es mi ayuda porque esto SI ES PRACTICA PARA EL COLEGIO!!!

Si tienes esto para un pulsador

int pulsador=0;              //almacena el estado del botón
int estado=0;                //0=led apagado, 1=led encendido
int pulsadorAnt=0;           //almacena el estado anterior del boton

dime que harías para un segundo pulsador?

Por cierto, cómo cuesta postear bien!!

int pulsador=0;              //almacena el estado del botón
int estado=0;                //0=led apagado, 1=led encendido
int pulsadorAnt=0;           //almacena el estado anterior del boton

//** Programa **//
void setup() {
  pinMode(2, OUTPUT);        //declaramos el pin 2 como salida
  pinMode(3, INPUT);         //declaramos el pin 4 como entrada
}

void loop() {
  pulsador = digitalRead(3); //lee si el botón está pulsado
  
  if((pulsador==HIGH)&&(pulsadorAnt==LOW)){  //si el boton es pulsado y antes no lo estaba
    estado=1-estado;
    delay(200);               //pausa de 200 ms
  }
  pulsadorAnt=pulsador;      //actualiza el nuevo estado del boton        
  
  if(estado==1) {            //si el estado es 1
    digitalWrite(2, HIGH);   //se enciende el led
  }
  else {                     //si el estado no es 1
    digitalWrite(2, LOW);    //se apaga el led
   }
}

Ya me he leído las normas del foro, :frowning: :frowning: , mil disculpas.

Explico un poco, he intentado declarar las entradas de los botones y las salidas de los reles, no se si correctamente o no:

int pulsador=0;              //almacena el estado del botón
int estado=0;                //0=led apagado, 1=led encendido
int pulsadorAnt=0;           //almacena el estado anterior del boton
int pulsador1=0;              //almacena el estado del botón
int estado1=0;                //0=led apagado, 1=led encendido
int pulsadorAnt1=0;           //almacena el estado anterior del boton

//** Programa **//

void setup() {
  pinMode(2, OUTPUT);        //declaramos el pin 2 como salida
  pinMode(3, INPUT);         //declaramos el pin 3 como entrada
  pinMode(4, OUTPUT);        //declaramos el pin 4 como salida
  pinMode(5, INPUT);         //declaramos el pin 5 como entrada

ya no se que mas debo hacer, al intentar modificar el loop, me da error compilando.
se que al igual es una pregunta de ignorante pero ........ estoy empezando, y por mas que leo veo tutoriales y busco por internet, no consigo nada.
Gracias de antemano y saludos.

Hay alguien como tu que planteó lo mismo y se lo resolví. Buscalo esta en este mismo foro y no fue hace mas de 1 o 2 meses.
Busca temas parecidos.
No me pidas que lo busque yo.

Hola he encontrado la solución buscando en el foro, no se si sera la misma pero por lo menos lo he resuelto y un poco lo he modificado como yo quería.
Explico un poco lo que estoy intentando es para quitar los mandos de la luces de mi coche ya que cuestan una fortuna y colocarlo por botones, he modificado lo de encender todo, por un simple motivo, si enciendo posición enciende pero al apagar apaga cruce si esta esta encendida, y si enciendo cruce esta me enciende posición si me he despistado, es decir simula el mando del coche.

Tengo varias preguntas que he intentado resolver pero no lo consigo:

1 no se como hacer que los intermitentes me parpadeen en intervalos de 400/450 mili, he intentado delay me da error de compilacion, he visto por google Blink WithOut Delay pero no se como como agregarlo a esta galeria sin que me de error.

2 en una entrada que destine para los cuatro intermitentes tampoco se como declararla.

Gracias de antemano.

#include <Bounce2.h>

// Variables estáticas
const byte pinBoton1 = 2;      // Declaramos la variable pin del Botón cruce
const byte pinBoton2 = 3;      // Declaramos la variable pin del Botón posicion
const byte pinBoton3 = 4;      // Declaramos la variable pin del Botón larga
const byte pinBoton4 = 5;      // Declaramos la variable pin del Botón intermitente derecho
const byte pinBoton5 = 6;      // Declaramos la variable pin del Botón intermitente izquierdo
const byte pinBoton6 = 7;      // Declaramos la variable pin del Botón limpiaparabrisas
const byte pinBoton7 = 8;      // Declaramos la variable pin del Botón Ventiladores
const byte pinBoton8 = 9;      // Declaramos la variable pin del Botón paro limpiaparabrisas
const byte pinBoton9 = 10;     // Declaramos la variable pin del Botón 4 intermitentes

const byte srele1    = 22;     // Declaramos la variable pin para relé cruce
const byte srele2    = 24;     // Declaramos la variable pin para relé posicion
const byte srele3    = 26;     // Declaramos la variable pin para relé larga
const byte srele4    = 28;     // Declaramos la variable pin para relé intermitente derecho
const byte srele5    = 30;     // Declaramos la variable pin para relé intermitente izquierdo
const byte srele6    = 32;     // Declaramos la variable pin para relé limpaparabrisas
const byte srele7    = 34;     // Declaramos la variable pin para relé ventiladores


Bounce debouncer1 = Bounce(); 
Bounce debouncer2 = Bounce(); 
Bounce debouncer3 = Bounce(); 
Bounce debouncer4 = Bounce(); 
Bounce debouncer5 = Bounce(); 
Bounce debouncer6 = Bounce(); 
Bounce debouncer7 = Bounce(); 
Bounce debouncer8 = Bounce(); 
Bounce debouncer9 = Bounce();

// Variables dinámicas
bool statusBtn1 = false, statusBtn2 = false, statusBtn3 = false, statusBtn4 = false,
     statusBtn5 = false, statusBtn6 = false, statusBtn7 = false, statusBtn8 = false,
     statusBtn9 = false; 
bool posicruceActivados = false;
int contador = 0;

void setup() {
  // Inicializa el pin del LED como salida:
  pinMode(srele1, OUTPUT);
  pinMode(srele2, OUTPUT);
  pinMode(srele3, OUTPUT);
  pinMode(srele4, OUTPUT);
  pinMode(srele5, OUTPUT);
  pinMode(srele6, OUTPUT);
  pinMode(srele7, OUTPUT);

  // Inicializa el pin del botón como entrada:
  pinMode(pinBoton1, INPUT_PULLUP);
  pinMode(pinBoton2, INPUT_PULLUP);
  pinMode(pinBoton3, INPUT_PULLUP);
  pinMode(pinBoton4, INPUT_PULLUP);
  pinMode(pinBoton5, INPUT_PULLUP);
  pinMode(pinBoton6, INPUT_PULLUP);
  pinMode(pinBoton7, INPUT_PULLUP);
  pinMode(pinBoton8, INPUT_PULLUP);
  pinMode(pinBoton9, INPUT_PULLUP);
  digitalWrite( pinBoton1 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton2 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton3 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton4 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton5 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton6 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton7 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton8 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton9 ,HIGH);   // activar PULL UP interno

  Serial.begin(9600);

  // After setting up the button, setup the Bounce instance :
  debouncer1.attach(pinBoton1);
  debouncer1.interval(20); // interval in ms
  debouncer2.attach(pinBoton2);
  debouncer2.interval(20); // interval in ms
  debouncer3.attach(pinBoton3);
  debouncer3.interval(20); // interval in ms
  debouncer4.attach(pinBoton4);
  debouncer4.interval(20); // interval in ms
  debouncer5.attach(pinBoton5);
  debouncer5.interval(20); // interval in ms
  debouncer6.attach(pinBoton6);
  debouncer6.interval(20); // interval in ms
  debouncer7.attach(pinBoton7);
  debouncer7.interval(20); // interval in ms
  debouncer8.attach(pinBoton8);
  debouncer8.interval(20); // interval in ms
  debouncer9.attach(pinBoton9);
  debouncer9.interval(20); // interval in ms
}

void loop(){

    // Update the Bounce instance :
    debouncer1.update();

    // Chequea si el botón está pulsado:
    if (debouncer1.fell()) {
       
       statusBtn1 = !statusBtn1;
       Serial.print("Status Btn1:");
       Serial.print(statusBtn1);
       Serial.print("cuenta:");
       Serial.println(contador++);
       posicruceActivados = true;   
    }
    
   
    if (statusBtn1 && posicruceActivados) {
       digitalWrite(srele1, HIGH);
       digitalWrite(srele2, HIGH);
       
       Serial.println("Todos activados");
       posicruceActivados = false;
    }
    
    if (!statusBtn1 && posicruceActivados) {
       digitalWrite(srele1, LOW);
       
       Serial.println("Todos desactivados");
       posicruceActivados = false;
    }

   // Update the Bounce instance :
    debouncer2.update();

    // Chequea si el botón está pulsado:
    if (debouncer2.fell()) {
       
       statusBtn2 = !statusBtn2;
       Serial.print("Status Btn2:");
       Serial.print(statusBtn2);
       Serial.print("cuenta:");
       Serial.println(contador++);
       posicruceActivados = true;   
    }
    
   
    if (statusBtn2 && posicruceActivados) {
       digitalWrite(srele2, HIGH);
       
       Serial.println("Todos activados");
       posicruceActivados = false;
    }
    
    if (!statusBtn2 && posicruceActivados) {
       digitalWrite(srele1, LOW);
       digitalWrite(srele2, LOW);
       
       Serial.println("Todos desactivados");
       posicruceActivados = false;
    }

    debouncer3.update();
    // Chequea si el botón está pulsado:
    if (debouncer3.fell()) {
       statusBtn3 = !statusBtn3;
       Serial.print("Status Btn3:");
       Serial.println(statusBtn3);

       if (statusBtn3)
          digitalWrite(srele3, HIGH);
       else 
          digitalWrite(srele3, LOW);
    }
    
    debouncer4.update();
    // Chequea si el botón está pulsado:
    if (debouncer4.fell()) {
       statusBtn4 = !statusBtn4;
       Serial.print("Status Btn4:");
       Serial.println(statusBtn4);

       if (statusBtn4)
          digitalWrite(srele4, HIGH);
       else 
          digitalWrite(srele4, LOW);
    }
    debouncer5.update();
    // Chequea si el botón está pulsado:
    if (debouncer5.fell()) {
       statusBtn5 = !statusBtn5;
       Serial.print("Status Btn5:");
       Serial.println(statusBtn5);

       if (statusBtn5)
          digitalWrite(srele5, HIGH);
       else 
          digitalWrite(srele5, LOW);
    }
    debouncer6.update();
    // Chequea si el botón está pulsado:
    if (debouncer6.fell()) {
       statusBtn6 = !statusBtn6;
       Serial.print("Status Btn6:");
       Serial.println(statusBtn6);

       if (statusBtn6)
          digitalWrite(srele6, HIGH);
       else 
          digitalWrite(srele6, LOW);
    }
    debouncer7.update();
    // Chequea si el botón está pulsado:
    if (debouncer7.fell()) {
       statusBtn7 = !statusBtn7;
       Serial.print("Status Btn7:");
       Serial.println(statusBtn7);

       if (statusBtn7)
          digitalWrite(srele7, HIGH);
       else 
          digitalWrite(srele7, LOW);
    }
}

Asi logro que me parpadee pero no se como declararlo para que funcione con el boton.

Saludos

#include <Bounce2.h>

// Variables estáticas
const byte pinBoton1 = 2;      // Declaramos la variable pin del Botón cruce
const byte pinBoton2 = 3;      // Declaramos la variable pin del Botón posicion
const byte pinBoton3 = 4;      // Declaramos la variable pin del Botón larga
const byte pinBoton4 = 5;      // Declaramos la variable pin del Botón intermitente derecho
const byte pinBoton5 = 6;      // Declaramos la variable pin del Botón intermitente izquierdo
const byte pinBoton6 = 7;      // Declaramos la variable pin del Botón limpiaparabrisas
const byte pinBoton7 = 8;      // Declaramos la variable pin del Botón Ventiladores
const byte pinBoton8 = 9;      // Declaramos la variable pin del Botón paro limpiaparabrisas
const byte pinBoton9 = 10;     // Declaramos la variable pin del Botón 4 intermitentes

const byte srele1    = 22;     // Declaramos la variable pin para relé cruce
const byte srele2    = 24;     // Declaramos la variable pin para relé posicion
const byte srele3    = 26;     // Declaramos la variable pin para relé larga
const byte srele4    = 28;     // Declaramos la variable pin para relé intermitente derecho
const byte srele5    = 30;     // Declaramos la variable pin para relé intermitente izquierdo
const byte srele6    = 32;     // Declaramos la variable pin para relé limpaparabrisas
const byte srele7    = 34;     // Declaramos la variable pin para relé ventiladores

int ledState = LOW;   
long previousMillis = 0; 
long interval = 450;   

Bounce debouncer1 = Bounce(); 
Bounce debouncer2 = Bounce(); 
Bounce debouncer3 = Bounce(); 
Bounce debouncer4 = Bounce(); 
Bounce debouncer5 = Bounce(); 
Bounce debouncer6 = Bounce(); 
Bounce debouncer7 = Bounce(); 
Bounce debouncer8 = Bounce(); 
Bounce debouncer9 = Bounce();

// Variables dinámicas
bool statusBtn1 = false, statusBtn2 = false, statusBtn3 = false, statusBtn4 = false,
     statusBtn5 = false, statusBtn6 = false, statusBtn7 = false, statusBtn8 = false,
     statusBtn9 = false; 
bool posicruceActivados = false;
int contador = 0;

void setup() {
  // Inicializa el pin del LED como salida:
  pinMode(srele1, OUTPUT);
  pinMode(srele2, OUTPUT);
  pinMode(srele3, OUTPUT);
  pinMode(srele4, OUTPUT);
  pinMode(srele5, OUTPUT);
  pinMode(srele6, OUTPUT);
  pinMode(srele7, OUTPUT);

  // Inicializa el pin del botón como entrada:

  pinMode(pinBoton1, INPUT_PULLUP);
  pinMode(pinBoton2, INPUT_PULLUP);
  pinMode(pinBoton3, INPUT_PULLUP);
  pinMode(pinBoton4, INPUT_PULLUP);
  pinMode(pinBoton5, INPUT_PULLUP);
  pinMode(pinBoton6, INPUT_PULLUP);
  pinMode(pinBoton7, INPUT_PULLUP);
  pinMode(pinBoton8, INPUT_PULLUP);
  pinMode(pinBoton9, INPUT_PULLUP);
  digitalWrite( pinBoton1 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton2 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton3 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton4 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton5 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton6 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton7 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton8 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton9 ,HIGH);   // activar PULL UP interno

  Serial.begin(9600);

  // After setting up the button, setup the Bounce instance :
  debouncer1.attach(pinBoton1);
  debouncer1.interval(20); // interval in ms
  debouncer2.attach(pinBoton2);
  debouncer2.interval(20); // interval in ms
  debouncer3.attach(pinBoton3);
  debouncer3.interval(20); // interval in ms
  debouncer4.attach(pinBoton4);
  debouncer4.interval(20); // interval in ms
  debouncer5.attach(pinBoton5);
  debouncer5.interval(20); // interval in ms
  debouncer6.attach(pinBoton6);
  debouncer6.interval(20); // interval in ms
  debouncer7.attach(pinBoton7);
  debouncer7.interval(20); // interval in ms
  debouncer8.attach(pinBoton8);
  debouncer8.interval(20); // interval in ms
  debouncer9.attach(pinBoton9);
  debouncer9.interval(20); // interval in ms
}

void loop(){

    // Update the Bounce instance :
    debouncer1.update();

    // Chequea si el botón está pulsado:
    if (debouncer1.fell()) {
       
       statusBtn1 = !statusBtn1;
       Serial.print("Status Btn1:");
       Serial.print(statusBtn1);
       Serial.print("cuenta:");
       Serial.println(contador++);
       posicruceActivados = true;   
    }
    
   
    if (statusBtn1 && posicruceActivados) {
       digitalWrite(srele1, HIGH);
       digitalWrite(srele2, HIGH);
       
       Serial.println("Todos activados");
       posicruceActivados = false;
    }
    
    if (!statusBtn1 && posicruceActivados) {
       digitalWrite(srele1, LOW);
       
       Serial.println("Todos desactivados");
       posicruceActivados = false;
    }

   // Update the Bounce instance :
    debouncer2.update();

    // Chequea si el botón está pulsado:
    if (debouncer2.fell()) {
       
       statusBtn2 = !statusBtn2;
       Serial.print("Status Btn2:");
       Serial.print(statusBtn2);
       Serial.print("cuenta:");
       Serial.println(contador++);
       posicruceActivados = true;   
    }
    
   
    if (statusBtn2 && posicruceActivados) {
       digitalWrite(srele2, HIGH);
       
       Serial.println("Todos activados");
       posicruceActivados = false;
    }
    
    if (!statusBtn2 && posicruceActivados) {
       digitalWrite(srele1, LOW);
       digitalWrite(srele2, LOW);
       
       Serial.println("Todos desactivados");
       posicruceActivados = false;
    }

    debouncer3.update();
    // Chequea si el botón está pulsado:
    if (debouncer3.fell()) {
       statusBtn3 = !statusBtn3;
       Serial.print("Status Btn3:");
       Serial.println(statusBtn3);

       if (statusBtn3)
          digitalWrite(srele3, HIGH);
       else 
          digitalWrite(srele3, LOW);
    }
    
    debouncer4.update();
    // Chequea si el botón está pulsado:
    if (debouncer4.fell()) {
       statusBtn4 = !statusBtn4;
       Serial.print("Status Btn4:");
       Serial.println(statusBtn4);

       if (statusBtn4)
          digitalWrite(srele4, HIGH);
       else
          digitalWrite(srele4, LOW);
    }
    debouncer5.update();
    // Chequea si el botón está pulsado:
    if (debouncer5.fell()) {
       statusBtn5 = !statusBtn5;
       Serial.print("Status Btn5:");
       Serial.println(statusBtn5);

       if (statusBtn5)
          digitalWrite(srele5, HIGH);
       else 
          digitalWrite(srele5, LOW);
    }
    debouncer6.update();
    // Chequea si el botón está pulsado:
    if (debouncer6.fell()) {
       statusBtn6 = !statusBtn6;
       Serial.print("Status Btn6:");
       Serial.println(statusBtn6);

       if (statusBtn6)
          digitalWrite(srele6, HIGH);
       else 
          digitalWrite(srele6, LOW);
    }
    debouncer7.update();
    // Chequea si el botón está pulsado:
    if (debouncer7.fell()) {
       statusBtn7 = !statusBtn7;
       Serial.print("Status Btn7:");
       Serial.println(statusBtn7);

       if (statusBtn7)
          digitalWrite(srele7, HIGH);
       else 
          digitalWrite(srele7, LOW);
    }

    
unsigned long currentMillis = millis();    // Se toma el tiempo actual

if (currentMillis - previousMillis > interval){

previousMillis = currentMillis;

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

digitalWrite(srele4, ledState);
}
}

Nada que lo consigo > :frowning: > :frowning: lo he intentado ya de varias maneras incluso asi

 debouncer3.update();
    // Chequea si el botón está pulsado:
    if (debouncer3.fell()) {
       statusBtn3 = !statusBtn3;
       Serial.print("Status Btn3:");
       Serial.println(statusBtn3);

       if (statusBtn3)
          digitalWrite(srele3, estadoled);
       else 
          digitalWrite(srele3, LOW);

activar los cuatro creo que si es posible de la misma manera que botón 1 y 2 activa los dos a la vez. Pero que parpadeen no veo como hacerlo.

Bueno!! Aplausos para un forero que se esfuerza. No es muy común en estos días. Sinceramente que hayas buscado e intentado de todas las maneras me motiva en ayudarte pero antes una consulta porque no entiendo.
Tu escribiste

1 no se como hacer que los intermitentes me parpadeen en intervalos de 400/450 mili, he intentado delay me da error de compilacion, he visto por google Blink WithOut Delay pero no se como como agregarlo a esta galeria sin que me de error.
2 en una entrada que destine para los cuatro intermitentes tampoco se como declararla.

dime que pines quieres que sean intermitentes y cuales son los del grupo?

Hola surbyte y gracias por ayudarme.
lospines que quiero que parpadeen son srele4 (salida 28) y srele5 (salida 30) de una Mega 2560.
el boton Nº 10 es el que quiero que active también los dos reles a la vez en parpadeo.
de nuevo gracias.

Una cosa que no entiendo, si yo programo asi:

unsigned long tiempoActual = millis();
  //Si la diferencia es mayor que el intervalo de //tiempo de parpadeo es cuando actualizamos el //estado del led
  if(tiempoActual - tiempoPrevio >= intervalo) {
    //Guardamos el instante de tiempo
    tiempoPrevio = tiempoActual; 
    //Si el led esta encendido lo apagamos y //viceversa
    if (estadorele == LOW)
      estadorele = HIGH;
    else
      estadorele = LOW;
    // actualizamos el led ditalw
  }

y el rele parpadea porque así no?:

debouncer3.update();
    // Chequea si el botón está pulsado:
    if (debouncer3.fell()) {
       statusBtn3 = !statusBtn3;
       Serial.print("Status Btn3:");
       Serial.println(statusBtn3);

       if (statusBtn3)
          digitalWrite(srele3, estadoled);
       else 
          digitalWrite(srele3, LOW);

la verdad es que no se porque, y empiezo a estar un poco desesperado, por mas que busco en google sigo sin entenderlo por ahí lo hacen parecido y les funciona.

El primero lo hace parpadear automáticamente. El segundo lo hace hasta que se presione cierto botón.
Tienes que "combinar" ambos para activar/desactivar el parpadeo con ese botón.

Eso entiendo yo pero no se porque no me funciona, lo he programado de varias maneras pero no lo consigo.
Ahora mismo el código esta así:

#include <Bounce2.h>

// Variables estáticas
const byte pinBoton1 = 2;      // Declaramos la variable pin del Botón Posicion
const byte pinBoton2 = 3;      // Declaramos la variable pin del Botón Cruce
const byte pinBoton3 = 4;      // Declaramos la variable pin del Botón larga
const byte pinBoton4 = 5;      // Declaramos la variable pin del Botón intermitente derecho
const byte pinBoton5 = 6;      // Declaramos la variable pin del Botón intermitente izquierdo
const byte pinBoton6 = 7;      // Declaramos la variable pin del Botón limpiaparabrisas
const byte pinBoton7 = 8;      // Declaramos la variable pin del Botón Ventiladores
const byte pinBoton8 = 9;      // Declaramos la variable pin del Botón paro limpiaparabrisas
const byte pinBoton9 = 10;     // Declaramos la variable pin del Botón 4 intermitentes

const byte srele1    = 22;     // Declaramos la variable pin para relé posicion
const byte srele2    = 24;     // Declaramos la variable pin para relé cruce
const byte srele3    = 26;     // Declaramos la variable pin para relé larga
const byte srele4    = 28;     // Declaramos la variable pin para relé intermitente derecho
const byte srele5    = 30;     // Declaramos la variable pin para relé intermitente izquierdo
const byte srele6    = 32;     // Declaramos la variable pin para relé limpaparabrisas
const byte srele7    = 34;     // Declaramos la variable pin para relé ventiladores
 

Bounce debouncer1 = Bounce(); 
Bounce debouncer2 = Bounce(); 
Bounce debouncer3 = Bounce(); 
Bounce debouncer4 = Bounce(); 
Bounce debouncer5 = Bounce(); 
Bounce debouncer6 = Bounce(); 
Bounce debouncer7 = Bounce(); 
Bounce debouncer8 = Bounce(); 
Bounce debouncer9 = Bounce();

// Variables dinámicas
bool statusBtn1 = false, statusBtn2 = false, statusBtn3 = false, statusBtn4 = false,
     statusBtn5 = false, statusBtn6 = false, statusBtn7 = false, statusBtn8 = false,
     statusBtn9 = false; 
bool posicruceActivados = false;
int contador = 0;

int estadorele = LOW;
unsigned long tiempoPrevio = 0;       
const long intervalo = 400;

void setup() {
  // Inicializa el pin del LED como salida:
  pinMode(srele1, OUTPUT);
  pinMode(srele2, OUTPUT);
  pinMode(srele3, OUTPUT);
  pinMode(srele4, OUTPUT);
  pinMode(srele5, OUTPUT);
  pinMode(srele6, OUTPUT);
  pinMode(srele7, OUTPUT);
  
  // Inicializa el pin del botón como entrada:

  pinMode(pinBoton1, INPUT_PULLUP);
  pinMode(pinBoton2, INPUT_PULLUP);
  pinMode(pinBoton3, INPUT_PULLUP);
  pinMode(pinBoton4, INPUT_PULLUP);
  pinMode(pinBoton5, INPUT_PULLUP);
  pinMode(pinBoton6, INPUT_PULLUP);
  pinMode(pinBoton7, INPUT_PULLUP);
  pinMode(pinBoton8, INPUT_PULLUP);
  pinMode(pinBoton9, INPUT_PULLUP);
  digitalWrite( pinBoton1 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton2 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton3 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton4 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton5 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton6 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton7 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton8 ,HIGH);   // activar PULL UP interno
  digitalWrite( pinBoton9 ,HIGH);   // activar PULL UP interno

  Serial.begin(9600);

  // After setting up the button, setup the Bounce instance :
  debouncer1.attach(pinBoton1);
  debouncer1.interval(20); // interval in ms
  debouncer2.attach(pinBoton2);
  debouncer2.interval(20); // interval in ms
  debouncer3.attach(pinBoton3);
  debouncer3.interval(20); // interval in ms
  debouncer4.attach(pinBoton4);
  debouncer4.interval(20); // interval in ms
  debouncer5.attach(pinBoton5);
  debouncer5.interval(20); // interval in ms
  debouncer6.attach(pinBoton6);
  debouncer6.interval(20); // interval in ms
  debouncer7.attach(pinBoton7);
  debouncer7.interval(20); // interval in ms
  debouncer8.attach(pinBoton8);
  debouncer8.interval(20); // interval in ms
  debouncer9.attach(pinBoton9);
  debouncer9.interval(20); // interval in ms
}

void loop(){

    // Update the Bounce instance :
    debouncer1.update();

    // Chequea si el botón está pulsado:
    if (debouncer1.fell()) {
       
       statusBtn1 = !statusBtn1;
       Serial.print("Status Btn1:");
       Serial.print(statusBtn1);
       Serial.print("cuenta:");
       Serial.println(contador++);
       posicruceActivados = true;   
    }
    
   
    if (statusBtn1 && posicruceActivados) {
       digitalWrite(srele1, HIGH);
       estadorele = !estadorele;
       
       Serial.println("Todos activados");
       posicruceActivados = false;
    }
    
    if (!statusBtn1 && posicruceActivados) {
       digitalWrite(srele1, LOW);
       digitalWrite(srele2, LOW);
       digitalWrite(srele3, LOW);
       
       Serial.println("Todos desactivados");
       posicruceActivados = false;
    }

   // Update the Bounce instance :
    debouncer2.update();

    // Chequea si el botón está pulsado:
    if (debouncer2.fell()) {
       
       statusBtn2 = !statusBtn2;
       Serial.print("Status Btn2:");
       Serial.print(statusBtn2);
       Serial.print("cuenta:");
       Serial.println(contador++);
       posicruceActivados = true;   
    }
    
   
    if (statusBtn2 && posicruceActivados) {
       digitalWrite(srele1, HIGH);
       digitalWrite(srele2, HIGH);
       
       Serial.println("Todos activados");
       posicruceActivados = false;
    }
    
    if (!statusBtn2 && posicruceActivados) {
       digitalWrite(srele2, LOW);
       digitalWrite(srele3, LOW);
       
       Serial.println("Todos desactivados");
       posicruceActivados = false;
    }
 // Update the Bounce instance :
    debouncer3.update();

    // Chequea si el botón está pulsado:
    if (debouncer3.fell()) {
       
       statusBtn3 = !statusBtn3;
       Serial.print("Status Btn3:");
       Serial.print(statusBtn2);
       Serial.print("cuenta:");
       Serial.println(contador++);
       posicruceActivados = true;   
    }
    
   
    if (statusBtn3 && posicruceActivados) {
       digitalWrite(srele1, HIGH);
       digitalWrite(srele2, HIGH);
       digitalWrite(srele3, HIGH);
       
       Serial.println("Todos activados");
       posicruceActivados = false;
    }
    
    if (!statusBtn3 && posicruceActivados) {
       digitalWrite(srele3, LOW);
       
       Serial.println("Todos desactivados");
       posicruceActivados = false;
    }
   
    
    debouncer4.update();
    // Chequea si el botón está pulsado:
    if (debouncer4.fell()) {
       statusBtn4 = !statusBtn4;
       Serial.print("Status Btn4:");
       Serial.println(statusBtn4);

       if (statusBtn4)
          digitalWrite(srele4, HIGH);
       else
          digitalWrite(srele4, LOW);
          estadorele = !estadorele;
    }
    
    debouncer5.update();
    // Chequea si el botón está pulsado:
    if (debouncer5.fell()) {
       statusBtn5 = !statusBtn5;
       Serial.print("Status Btn5:");
       Serial.println(statusBtn5);

       if (statusBtn5)
          digitalWrite(srele5, HIGH);
       else 
          digitalWrite(srele5, LOW);
    }
    debouncer6.update();
    // Chequea si el botón está pulsado:
    if (debouncer6.fell()) {
       statusBtn6 = !statusBtn6;
       Serial.print("Status Btn6:");
       Serial.println(statusBtn6);

       if (statusBtn6)
          digitalWrite(srele6, HIGH);
       else 
          digitalWrite(srele6, LOW);
    }
    debouncer7.update();
    // Chequea si el botón está pulsado:
    if (debouncer7.fell()) {
       statusBtn7 = !statusBtn7;
       Serial.print("Status Btn7:");
       Serial.println(statusBtn7);

       if (statusBtn7)
          digitalWrite(srele7, HIGH);
       else 
          digitalWrite(srele7, LOW);
    }

  unsigned long tiempoActual = millis();
  //Si la diferencia es mayor que el intervalo de //tiempo de parpadeo es cuando actualizamos el //estado del led
  if(tiempoActual - tiempoPrevio >= intervalo) {
    //Guardamos el instante de tiempo
    tiempoPrevio = tiempoActual; 
    //Si el led esta encendido lo apagamos y //viceversa
    if (estadorele == LOW)
      estadorele = HIGH;
    else
      estadorele = LOW;
    // actualizamos el led ditalw
  }
    
}

si pulso el primer boton se enciende el rele 1.
si pulso el segundo boton se enciende el rele 2 y el 1 si no lo he encendido.
si pulso el tercero se enciende el rele 3, 2 y 1 igual que el anterior.
al apagarlos es al contrario.
si pulso el tercero se apaga solo el tres.
el segundo apaga el dos y el tres.
y el primero apaga el 1, 2 y tres
el resto son dependientes.
donde viene el problema es hacer que el botón 4 y 5 activen el rele 4 y 5 parpadeando en intervalos de 400 / 450 milisegundos, u el boton Nº 10 que me enciendan los reles 4 y 5 a la vez y parpadeando.
Es para intermitente derecho intermitente izquierdo y cuatro intermitentes.
Ahí es donde estoy ahora sin suerte para mi.

Lo único que hiciste, fue poner ambos trozos en el mismo código.
Cuando me refería a "combinar", era que que, por ejemplo, al presionar cierto botón, se cambiaba el estado la respectiva variable.
Luego, si esa variable es igual a true, entonces que ejecute el parpadeo.
Si se vuelve a presionar ese botón, el estado de la variable cambia a false, y por consiguiente, el parpadeo dejaría de ejecutarse.

Lo que acabo de decir en un ejemplo de código:

if (debouncer1.fell()) {
       
       statusBtn1 = !statusBtn1;
       Serial.print("Status Btn1:");
       Serial.print(statusBtn1);
       Serial.print("cuenta:");
       Serial.println(contador++); 
    }

//Si la diferencia es mayor que el intervalo de //tiempo de parpadeo es cuando actualizamos el //estado del led
  if ((tiempoActual - tiempoPrevio >= intervalo) && statusBtn1){
    //Guardamos el instante de tiempo
    tiempoPrevio = tiempoActual; 
    //Si el led esta encendido lo apagamos y //viceversa
    estadorele = !estadorele;
    digitalWrite(elPin, estadorele);
    // actualizamos el led ditalw
  }

Ten en cuenta que tendrás que crear variables como "estadorele" y "tiempoPrevio" para cada relé.
Y si hay alguno que parpadee a diferente "ritmo", también tendrás que crear variables (en realidad son constantes) "intervalo" para cada variedad de "ritmos".

No sé si me explicado bien. ::slight_smile:

Ah y una cosa más, si sientes que el código se te empieza a hacer demasiado largo... creo que ya sería hora de que vayas aprendiendo a usar "arrays".

Si tiene problemas con este código imagina con arrays.
Que domine esto primero y luego puede pensar en cosas mas complicadas.

surbyte:
Si tiene problemas con este código imagina con arrays.
Que domine esto primero y luego puede pensar en cosas mas complicadas.

Una vez más te doy la razón. Un problema a la vez!

santatu, perdóname si te hice creer que te estaba pidiendo demasiado... :sweat_smile:

No tengo nada que disculpar, solo agradecer la ayuda de todos los que se unen a ayudar a los que no sabemos .
No se si lo he entendido bien pero...... esta tarde lo intentaré a ver que me sale.
Gracias.

Buenas tardes, no se si sera asi lo que me intentaste explicar pero......... no me va enciende y no parpadea.

  debouncer7.update();
     
   if (debouncer7.fell()) {
       
       statusBtn7 = !statusBtn7;
       Serial.print("Status Btn7:");
       Serial.print(statusBtn7);
       Serial.print("cuenta:");
       Serial.println(contador++);
       intermitentesActivados = true; 
    }

//Si la diferencia es mayor que el intervalo de //tiempo de parpadeo es cuando actualizamos el //estado del led
  if ((tiempoActual - tiempoPrevio >= intervalo) && statusBtn7)
    //Guardamos el instante de tiempo
    tiempoPrevio = tiempoActual; 
    //Si el led esta encendido lo apagamos y //viceversa
    estadorele = !estadorele;
    if (statusBtn7 && intermitentesActivados) {
       digitalWrite(srele4, estadorele);
       
       Serial.println("Todos activados");
       intermitentesActivados = false;
    }
    
    if (!statusBtn7 && intermitentesActivados) {
       digitalWrite(srele4, LOW);
       
       Serial.println("Todos desactivados");
       intermitentesActivados = false;
    }

También lo he hecho de esta manera e igual el rele se activa pero no parpadea, siento dar tanto la lata pero es que no se en que estoy fallando de verdad.

debouncer7.update();
     
   if (debouncer7.fell()) {
       
       statusBtn7 = !statusBtn7;
       Serial.print("Status Btn7:");
       Serial.print(statusBtn7);
       Serial.print("cuenta:");
       Serial.println(contador++);
       intermitentesActivados = true; {
    }

//Si la diferencia es mayor que el intervalo de //tiempo de parpadeo es cuando actualizamos el //estado del led
  if ((tiempoActual - tiempoPrevio >= intervalo) && statusBtn7)
    //Guardamos el instante de tiempo
    tiempoPrevio = tiempoActual; 
    //Si el led esta encendido lo apagamos y //viceversa
    estadorele = !estadorele;
   
   digitalWrite(srele4, estadorele);
   }

Te falta una llave o lo copiaste mal
Prueba esto

	debouncer7.update();
     
   	if (debouncer7.fell()) {
       statusBtn7 = !statusBtn7;
       Serial.print("Status Btn7:");
       Serial.print(statusBtn7);
       Serial.print("cuenta:");
       Serial.println(contador++);
       intermitentesActivados = true; {
    }

	//Si la diferencia es mayor que el intervalo de //tiempo de parpadeo es cuando actualizamos el //estado del led
  	if ((tiempoActual - tiempoPrevio >= intervalo) && statusBtn7) {
	    tiempoPrevio = tiempoActual; 					//Guardamos el instante de tiempo
	    estadorele = !estadorele;						//Si el led esta encendido lo apagamos y //viceversa
	    digitalWrite(srele4, estadorele);
    }

En ambos códigos no pones al final la llave

if ((tiempoActual - tiempoPrevio >= intervalo) && statusBtn7)