Controlar varios relés independientes.[solucionado]

Hola a todos!.
Queria controlar la salida de varios relés independientemente unos de otros mediante Arduino pero no lo consigo.
Se activan a través de un emisor 433 Mhz que tiene cuatro pulsadores, que funciona por pulsaciones ( la salida se activa mientras el pulsador este ON).
Es para controlar unas luces, asi que cuando pulsas el relé se debe de quedar enclavado hasta que vuelvas a pulsar el botón.
He probado haciendo lo siguiente:

// VARIABLES:

int buttonA = 2;
int buttonB = 3;
int buttonC = 4;
int buttonD = 5;
int releuno = 6;
int reledos = 7;
int reletres = 8;
int relecuatro = 9;
int estado_ReleUno;
int estado_ReleDos;
int estado_ReleTres;
int estado_ReleCuatro;

void setup() {
  
 
  
  // reles como salida:
  pinMode(releuno, OUTPUT); 
  pinMode(reledos, OUTPUT);
  pinMode(reletres, OUTPUT);
  pinMode(relecuatro, OUTPUT);
    
  // botones como entrada:
  pinMode(buttonA, INPUT);
  pinMode(buttonB, INPUT);
  pinMode(buttonC, INPUT);
  pinMode(buttonD, INPUT);

  {
  if(digitalRead(releuno)==HIGH)estado_ReleUno=1;
  else(estado_ReleUno=2);

  } 
  {
  if(digitalRead(reledos)==HIGH)estado_ReleDos=1;
  else(estado_ReleDos=2);
  } 
  {
  if(digitalRead(reletres)==HIGH)estado_ReleTres=1;
  else(estado_ReleTres=2);
  } 
  {
  if(digitalRead(relecuatro)==HIGH)estado_ReleCuatro=1;
  else(estado_ReleCuatro=2);
  } 
 
}

void loop(){
  if(estado_ReleUno==1) estado1(1);
  if(estado_ReleUno==2) estado2(1);
  if(estado_ReleDos==1) estado1(2);
  if(estado_ReleDos==2) estado2(2);
  if(estado_ReleTres==1) estado1(3);
  if(estado_ReleTres==2) estado2(3);
  if(estado_ReleCuatro==1) estado1(4);
  if(estado_ReleCuatro==2) estado2(4);
   
}

void estado1(int boton){

  switch(boton)
  {
    case 1:
      digitalWrite(releuno, LOW);
      while(digitalRead(buttonA)==LOW){}
      estado_ReleUno=2; 
    break;
    
    case 2:
      digitalWrite(reledos, LOW);
      while(digitalRead(buttonB)==LOW){}
      estado_ReleDos=2;
    break;
    
    case 3:
      digitalWrite(reletres, LOW);
      while(digitalRead(buttonC)==LOW){}
      estado_ReleTres=2;
    break;
    
    case 4:
      digitalWrite(relecuatro, LOW);
      while(digitalRead(buttonD)==LOW){}
      estado_ReleCuatro=2;
    break;
   
    default:
    break;
  }
  delay(500);

  } 
  
void estado2(int boton){

  switch(boton)
  {
    case 1:
      digitalWrite(releuno, HIGH);
      while(digitalRead(buttonA)==LOW){}
      estado_ReleUno=1;
    break;
    
    case 2:
      digitalWrite(reledos, HIGH);
      while(digitalRead(buttonB)==LOW){}
      estado_ReleDos=1; 
    break;
    
    case 3:
      digitalWrite(reletres, HIGH);
      while(digitalRead(buttonC)==LOW){}
      estado_ReleTres=1;
    break;
    
    case 4:
      digitalWrite(relecuatro, HIGH);
      while(digitalRead(buttonD)==LOW){}
      estado_ReleCuatro=1;
    break;
   
    default:
    break;
  }
  
   delay(500);

}

Pero me encuentro que al accionar un botón no avanza hacia las siguientes funciones, ya que se queda dentro de ese estado y deja de escuchar a los demás estados.
Hay alguna función o forma para poder hacer lo que quiero?.
Muchas gracias a todos.
Un saludo!

Para empezar, aquí
while(digitalRead(buttonA)==LOW){}
entras en un bucle (que no hace nada) y del que difícilmente podrás salir.

Y así todos.

Hazlo primero con un rele solo y lo mas importante, asigna el resultado de las pulsaciones a una variable y la depuras en la salida serial.

Jopapa
www.jopapa.me

Hola a todos!, después de varios dias, mucha lectura y un poco de ayuda lo he conseguido.
Copio el código por si le sirve a alguien alguna vez.

La idea es controlar 4 salidas I/O mediante 4 entradas I/0

// Controlar 4 salidas a rele segun estado 4 entradas.
// http://israelcasado.com


// VARIABLES:

int buttonA = 2;
int buttonB = 3;
int buttonC = 4;
int buttonD = 5;
int releuno = 6;
int reledos = 7;
int reletres = 8;
int relecuatro = 9;
int estado_ReleUno;
int estado_ReleDos;
int estado_ReleTres;
int estado_ReleCuatro;

char evento_ReleUno;
char evento_ReleDos;
char evento_ReleTres;
char evento_ReleCuatro;
boolean inicio=true;
void setup() {
  
  Serial.begin(9600);
  
  // reles como salida:
  pinMode(releuno, OUTPUT); 
  pinMode(reledos, OUTPUT);
  pinMode(reletres, OUTPUT);
  pinMode(relecuatro, OUTPUT);
    
  // botones como entrada:
  pinMode(buttonA, INPUT);
  pinMode(buttonB, INPUT);
  pinMode(buttonC, INPUT);
  pinMode(buttonD, INPUT);
  inicio=true;

  {
  if(digitalRead(releuno)==HIGH) evento_ReleUno='E';
  else evento_ReleUno='A';
  if(digitalRead(reledos)==HIGH) evento_ReleDos='E';
  else evento_ReleDos='A';
  if(digitalRead(reletres)==HIGH) evento_ReleTres='E';
  else evento_ReleTres='A';
  if(digitalRead(relecuatro)==HIGH) evento_ReleCuatro='E';
  else evento_ReleCuatro='A';
 
  } 
 
}

void loop(){
  if(!inicio)
  {
  comprobarEstado();
  }
  else
    delay(5000);
 
  //boton A 
  if(evento_ReleUno=='E') estadoEncender(1);
  if(evento_ReleUno=='A') estadoApagar(1);
 
  //boton B
  if(evento_ReleDos=='E') estadoEncender(2);
  if(evento_ReleDos=='A') estadoApagar(2);
  
  //boton C
  if(evento_ReleTres=='E') estadoEncender(3);
  if(evento_ReleTres=='A') estadoApagar(3);
  
  //boton D
  if(evento_ReleCuatro=='E') estadoEncender(4);
  if(evento_ReleCuatro=='A') estadoApagar(4);
  inicio=false;
}

void comprobarEstado()
{
  if(digitalRead(buttonA)==HIGH) 
  {
    if(estado_ReleUno==1)
   {
     Serial.println("Salida 1 encendida");
     evento_ReleUno='E';
   }
    else
    {
      Serial.println("Salida 1 apagada");
       evento_ReleUno='A';
    }  
  }
  else
  {
    //ponemos el evento en StandBy pues no se ha producido cambio alguno
    evento_ReleUno='S';
  }
  
  if(digitalRead(buttonB)==HIGH) 
  {
    if(estado_ReleDos==1)
   {
     Serial.println("Salida 2 encendida");
     evento_ReleDos='E';
   }
    else
    {
      Serial.println("Salida 2 apagada");
       evento_ReleDos='A';
    }  
  }
  else
  {
    //ponemos el evento en StandBy pues no se ha producido cambio alguno
    evento_ReleDos='S';
  }
  if(digitalRead(buttonC)==HIGH) 
  {
    if(estado_ReleTres==1)
   {
    Serial.println("Salida 3 encendida"); 
     evento_ReleTres='E';
   }
    else
    {
      Serial.println("Salida 3 apagada");
       evento_ReleTres='A';
    }  
  }
  else
  {
    //ponemos el evento en StandBy pues no se ha producido cambio alguno
    evento_ReleTres='S';
  }
  
  if(digitalRead(buttonD)==HIGH) 
  {
    if(estado_ReleCuatro==1)
   {
     Serial.println("Salida 4 encendida");
     evento_ReleCuatro='E';
   }
    else
    {
      Serial.println("Salida 4 apagada");
       evento_ReleCuatro='A';
    }  
  }
  else
  {
    //ponemos el evento en StandBy pues no se ha producido cambio alguno
    evento_ReleCuatro='S';
  }
  
}


void estadoEncender(int boton){
//0 encendido
//1 apagado

  switch(boton)
  {
    case 1:
      digitalWrite(releuno, LOW);
      estado_ReleUno=0;
    break;
  
    case 2:
      digitalWrite(reledos, LOW);
      estado_ReleDos=0;
    break;
   
    case 3:
      digitalWrite(reletres, LOW);
      estado_ReleTres=0;
    break;
    
    case 4:
      digitalWrite(relecuatro, LOW);
      estado_ReleCuatro=0;
    break;
   
    default:
    break;
  }
  if(!inicio) delay(500);

  } 
  
void estadoApagar(int boton){
  switch(boton)
  {
    case 1:
      digitalWrite(releuno, HIGH);
      estado_ReleUno=1;
    break;
   
    case 2:
      digitalWrite(reledos, HIGH);
      estado_ReleDos=1;
    break;
  
    case 3:
      digitalWrite(reletres, HIGH);
      estado_ReleTres=1;
    break;
    
    case 4:
      digitalWrite(relecuatro, HIGH);
      estado_ReleCuatro=1;
    break;
   
    default:
    break;
  }
   if(!inicio)  delay(500);
  }

Nota: No soy programador, estoy aprendiendo en este mundillo, así que el código seguramente tendrá basura a rebosar y se podrá depurar infinitamente mejor.
Saludos compañeros!

Felicidades Israc por [solucionado] en el título del post para que quede resaltado y así sirva para los demás

Excelente aporte amigo muchas gracias......

Gracias Israelc!!!! :wink: