Buen dia
Antes que nada te invito a que te pases por las normas del foro y despues editar tu post, los codigos van entre etiquetas <> y no como texto plano.
En cuanto a tu codigo, si quieres que algo funcione bien, olvidate de los delay, tienes que usar millis() si o si.
Pasando a tu codigo ,veo que repites esto
pulsador = digitalRead(4);
if((pulsador==HIGH)&&(pulsadorAnt==LOW)){
estado=1-estado;
delay(60);
}
pulsadorAnt=pulsador;
if(estado==1) {
}
Eso no es necesario, para leer el estado del pulsador con una vez basta.
En tu caso no es necesario detectar el cambio de flanco, con solo leer el estado del pulsador es suficiente.
Y por ultimo esto:
switch(estado);
no sirve de nada
Debajo te dejo el código con los cambio que hice, pruebalo, tiene que funcionar
//2_rele_un_pulsador_que_alternan.ino
bool pulsador;
//int estado=0;
//int pulsadorAnt=0;
const byte relay1=5; //5
const byte relay2=2; //2
unsigned long millisActual;
unsigned long intervalo=300; //Tiempo entre cambio de relay
void setup() {
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
pinMode(4, INPUT); //pulsador
}
void loop() {
//switch(estado); Esto no tiene razon de ser, ASI no se usa un switch-case
pulsador = digitalRead(4);
if(pulsador)
alternarRelay();
else{
digitalWrite(relay1,LOW);
digitalWrite(relay2,LOW);
}
}
void alternarRelay(){
if(millis() - millisActual >= intervalo){
if(digitalRead(relay1))
digitalWrite(relay1, LOW);
else
digitalWrite(relay1, HIGH);
digitalWrite(relay2, !digitalRead(relay1));
millisActual=millis();
}
}
En el ide mira el ejemplo blink Whitout delay y veras que es muy parecido a lo que puse aqui arriba
En la seccion documentacion hay buenos tutoriales, te los recomiendo en especial los que tratan sobre millis()
Espero que te sirva, saludos
Edito: olvide cambiar el pin del relay2 yo puse el 13 y tu lo tenias en el 2, pero ya hice el cambio en el codigo, puedes probarlo como está.
y otra cosa: para cambiar la velocidad con que alternan los relay, modifica la variable intervalo