come controllare più relè uguali con pulsanti diversi?

Salve a tutti. Ho da poco iniziato a fare esperimenti con arduino e mi sono imbattuto in un progetto che sembrava facile ma non riesco a farlo funzionare.
In pratica dovrei comdandare N° 4 relè con N° 2 pulsanti.
Cioè vorrei che i relè 1 - 3 -4 si azionerebbero alla pressione del pultante N° 1 e ritornerebbero al loro stato iniziale rilasciando il pulsante N°1 (e qui ci siamo funziona)
poi
vorrei che i relè 2-3-4 si azionerebbero alla pressione del pulsante N° 2 e ritornerebbero al loro stato iniziale rilasciando il pulsante N°2 (qui invece ai relè sembra che arrivi poca corrente, accende il led corrispondente debolmente ma non scatta)

ecco lo sketch:

  int pulsanterossoPin = 8;               
  int pulsanteneroPin = 9;                   
  int pulsanterossoState = 0;                   
  int pulsanteneroState = 0;                       

void setup()
{
pinMode(2, OUTPUT); 
digitalWrite(2, HIGH);
pinMode(3, OUTPUT);
digitalWrite(3, HIGH);
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
pinMode(5, OUTPUT);
digitalWrite(5, HIGH);
pinMode(pulsanterossoPin, INPUT);     
pinMode(pulsanteneroPin, INPUT);       
}

void loop()
{
    pulsanterossoState = digitalRead(pulsanterossoPin);  
    pulsanteneroState = digitalRead(pulsanteneroPin);    
    
    if (pulsanterossoState == HIGH) {  
      digitalWrite(2, LOW);   
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);        
      }
    else {  
      digitalWrite(2, HIGH); 
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);  
      }
    if (pulsanteneroState == HIGH) {  
      digitalWrite(3, LOW);  
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);        
    }   
    else {  
      digitalWrite(3, HIGH); 
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);        
    }
}

devo creare uno scambio tra il relè 1 e 2 mentre gli altri devono accendersi sia con un pulsante che con l'altro.
Mi sapete spiegare il motivo di questo strano evento e dove sbaglio?
Grazie

Non funziona perché Tu usi il ELSE.

Se pulsanterosso premuto metti HIGH 2,4 e 5 ma contemporaneamente se pulsante nero non é premuto metti 3,4e 5 LOW. Stai accendendo e spegnendo velocemente le uscite 4 e 5.

Devi considerare tutte le 4 combinazioni dei 2 pulsanti premuti o non premuti.

Ciao Uwe

grazie per la risposta. ma non riesco a risolvere. scusami sono un principiante. il problema è proprio quello delle uscite 4 e 5 che sono comuni ai 2 pulsanti.

ho provato così ma è uguale se non peggio:

{
    pulsanterossoState = digitalRead(pulsanterossoPin);  
    pulsanteneroState = digitalRead(pulsanteneroPin);    
    
    if (pulsanterossoState == HIGH) {  
      digitalWrite(2, LOW);  
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);        
      }
    if (pulsanterossoState == LOW) {  
      digitalWrite(2, HIGH);  
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);        
      }
    if (pulsanteneroState == HIGH) {  
      digitalWrite(3, LOW);  
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);        
    }  
    if (pulsanteneroState == LOW) {  
      digitalWrite(3, HIGH);  
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);        
    }

Te l'ha detto quegli else creano il problema e considerare le 4 condizioni con un AND

cosa dovrei utilizzare apposto degli IF ELSE

Prima di tutto fammi capire una cosa, perchè quando premi il pulsante i relè vanno a low?
com'è lo stato iniziale dei relay? tutti high?
o hai una scheda con logica invertita?

if (pulsanterossoState == 1 && pulsanteneroState == 1) { 
        fai qualcosa
 }
 
if (pulsanterossoState == 1 && pulsanteneroState == 0) { 
        fai qualcosa
 }

if (pulsanterossoState == 0 && pulsanteneroState == 1) { 
      fai qualcosa  
 }

if (pulsanterossoState == 0 && pulsanteneroState == 0) { 
      fai qualcosa
 }

si lo stato iniziale è HIGH. Ho comprato dei relè per arduino e stranamente si comportano al contrario quindi ho impostato i pin iniziali come HIGH in modo che quando invio la corrente ad arduino i relè rimangono come se fossero staccati.

più elegante

if (pulsanterossoState && pulsanteneroState) { //1-1
        fai qualcosa
 }
 
if (pulsanterossoState && !pulsanteneroState) { //1-0
        fai qualcosa
 }

if (!pulsanterossoState && pulsanteneroState) { //0-1
        fai qualcosa 
 }

if (!pulsanterossoState && !pulsanteneroState) { //0-0
        fai qualcosa
 }

@bean_1: in conformità al regolamento (... che dovresti aver letto), punto 7, edita (in basso a destra del post, bottone More -> Modify) i tuoi post e racchiudi il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra). Grazie.

Guglielmo

grazie a tutti per l'aiuto.
Ho risolto con i vostri suggerimenti.
:wink:

Sketch?
Ciao Uwe

ecco:

    int pulsanterossoPin = 8;              
    int pulsanteneroPin = 9;                   
    int pulsanterossoState = 0;             
    int pulsanteneroState = 0;         

void setup()
{
  pinMode(2, OUTPUT); 
  digitalWrite(2, HIGH);
  pinMode(3, OUTPUT);
  digitalWrite(3, HIGH);
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);
  pinMode(pulsanterossoPin, INPUT);      
  pinMode(pulsanteneroPin, INPUT);       
}

void loop()
{        
   {
     pulsanterossoState = digitalRead(pulsanterossoPin);  
     pulsanteneroState = digitalRead(pulsanteneroPin);    
     
     if (pulsanterossoState == 1 && pulsanteneroState == 1) {  
       digitalWrite(2, HIGH);  
       digitalWrite(3, HIGH);         
       digitalWrite(4, HIGH);
       digitalWrite(5, HIGH);        
       }
     if (pulsanterossoState == 1 && pulsanteneroState == 0) {  
       digitalWrite(2, LOW);  
       digitalWrite(3, HIGH);         
       digitalWrite(4, LOW);
       digitalWrite(5, LOW);         
       }
     if (pulsanterossoState == 0 && pulsanteneroState == 1) {  
       digitalWrite(2, HIGH);  
       digitalWrite(3, LOW);         
       digitalWrite(4, LOW);
       digitalWrite(5, LOW);            
     }  
     if (pulsanterossoState == 0 && pulsanteneroState == 0) {  
       digitalWrite(2, HIGH);  
       digitalWrite(3, HIGH);         
       digitalWrite(4, HIGH);
       digitalWrite(5, HIGH);        
     }  
}
}

Gut.
Jetzt solltest Du noch etwas Komentar reinschreiben damit Du später weißt was was macht ohne den ganzen Sketch analysieren zu müssen.

zB:

     if (pulsanterossoState == 1 && pulsanteneroState == 1) {  // schaltet alle Relais aus
       digitalWrite(2, HIGH); 
       digitalWrite(3, HIGH);         
       digitalWrite(4, HIGH);
       digitalWrite(5, HIGH);       
       }

Grüße Uwe

Non ho capito l'ultima parola :o

@Uwe: ... capisco che era tardi ... ma sei nella sezione Italiana :smiley: :grin: :smiley: :grin:

@altri: ...
"Bene. Ora sarebbe necessario inserire qualche commento per rendere più chiaro il programma senza dover leggerlo tutto per capire cosa fa.

es.
if (pulsanterossoState == 1 && pulsanteneroState == 1) { // disattiva tutti i relè

Saluti Uwe"

Guglielmo