Fonction ET avec boutons poussoirs

Je veux faire un petit jeu tout simple dont le but est de réussir à allumer toutes les dels.

Le montage: 8 dels et 8 boutons poussoirs.

J'essaie d'intégrer la fonction ET mais elle ne fonctionne pas.

J'aimerais que vous m'indiquiez ou se trouve mon erreur.

Merci pour votre aide,

Voici le code:

int pinLeda, pinLedb, pinLedc, pinLedd, pinLede, pinLedf, pinLedg, pinLedh;
int bouton1, bouton2, bouton3, bouton4, bouton5, bouton6, bouton7, bouton8;


void setup() 
{
  //initialisation des variables
  pinLeda=3;
  pinLedb=4;
  pinLedc=5;
  pinLedd=6;
  pinLede=7;
  pinLedf=8; 
  pinLedg=9;
  pinLedh=10;
  

  bouton1=11;
  bouton2=12;
  bouton3=A0;
  bouton4=A1;
  bouton5=A2;
  bouton6=A3;
  bouton7=A4;
  bouton8=A5;
  
  
  //initialisation des modes
  pinMode(pinLeda, OUTPUT);
  pinMode(pinLedb, OUTPUT);
  pinMode(pinLedc, OUTPUT);
  pinMode(pinLedd, OUTPUT);
  pinMode(pinLede, OUTPUT);
  pinMode(pinLedf, OUTPUT);
  pinMode(pinLedg, OUTPUT);
  pinMode(pinLedh, OUTPUT);
  
  
  pinMode(bouton1, INPUT);
  pinMode(bouton2, INPUT);
  pinMode(bouton3, INPUT);
  pinMode(bouton4, INPUT);
  pinMode(bouton5, INPUT);
  pinMode(bouton6, INPUT);
  pinMode(bouton7, INPUT);
  pinMode(bouton8, INPUT);
  
  
  //mise a 0V de chaque pin
  digitalWrite(pinLeda, LOW);
  digitalWrite(pinLedb, LOW);
  digitalWrite(pinLedc, LOW);
  digitalWrite(pinLedd, LOW);
  digitalWrite(pinLede, LOW);
  digitalWrite(pinLedf, LOW);
  digitalWrite(pinLedg, LOW);
  digitalWrite(pinLedh, LOW);

   //test allumage des leds
  digitalWrite(pinLeda, HIGH);
  digitalWrite(pinLedb, HIGH);
  digitalWrite(pinLedc, HIGH);
  digitalWrite(pinLedd, HIGH);
  digitalWrite(pinLede, HIGH);
  digitalWrite(pinLedf, HIGH);
  digitalWrite(pinLedg, HIGH);
  digitalWrite(pinLedh, HIGH);
  delay(500);
  
  //on eteint tout
  digitalWrite(pinLeda, LOW);
  digitalWrite(pinLedb, LOW);
  digitalWrite(pinLedc, LOW);
  digitalWrite(pinLedd, LOW);
  digitalWrite(pinLede, LOW);
  digitalWrite(pinLedf, LOW);
  digitalWrite(pinLedg, LOW);
  digitalWrite(pinLedh, LOW);
  delay(500);

}



void loop() 
{
 
    //lecture de l'etat des boutons et stockage dans etatBouton
    boolean etatBouton1=digitalRead(bouton1);
    boolean etatBouton2=digitalRead(bouton2);
    boolean etatBouton3=digitalRead(bouton3);
    boolean etatBouton4=digitalRead(bouton4);
    boolean etatBouton5=digitalRead(bouton5);
    boolean etatBouton6=digitalRead(bouton6);
    boolean etatBouton7=digitalRead(bouton7);
    boolean etatBouton8=digitalRead(bouton8);
   
    
    //test des conditions
    if (etatBouton1==HIGH)
    {
      digitalWrite(pinLeda, HIGH);
      digitalWrite(pinLedg, HIGH);
    }
    else if (etatBouton2==HIGH)
    {
    digitalWrite(pinLedb, HIGH);
    digitalWrite(pinLedh, HIGH);
    }
    else if(etatBouton3==HIGH)
    {
    digitalWrite(pinLedc, HIGH);
    digitalWrite(pinLedf, HIGH);
    digitalWrite(pinLeda, LOW);
    digitalWrite(pinLedb, LOW);
    
    }
    else if(etatBouton4==HIGH)
    {
    digitalWrite(pinLedd, HIGH);
    digitalWrite(pinLeda, LOW);
    digitalWrite(pinLedb, LOW);
    } 
    else if((etatBouton1==HIGH) && (etatBouton2==HIGH))
    {
     digitalWrite(pinLedd, LOW);
    }
   
    else if(etatBouton5==HIGH)
    {
     digitalWrite(pinLedb, LOW);
     digitalWrite(pinLedc, LOW);
     digitalWrite(pinLedd, LOW);
    }
    else if(etatBouton6==HIGH)
    {
     digitalWrite(pinLede, HIGH);
      
    }
    else if(etatBouton7==HIGH)
    {
     digitalWrite(pinLeda, LOW);
     digitalWrite(pinLedc, LOW);
     digitalWrite(pinLede, LOW);
      
    }
    else if(etatBouton8==HIGH)
    {
     digitalWrite(pinLeda, HIGH);
     digitalWrite(pinLedb, HIGH);
     digitalWrite(pinLedc, HIGH);
     digitalWrite(pinLedd, HIGH);
     digitalWrite(pinLede, LOW);
     digitalWrite(pinLedf, LOW);
     digitalWrite(pinLedg, HIGH);
     digitalWrite(pinLedh, HIGH);
    }
    

    delay(100);
}

C'est bien lourd tous tes else imbriqués.

Je remarque que tu écris

else if((etatBouton1==HIGH) && (etatBouton2==HIGH))

à l'intérieur d'un else suivant if (etatBouton1==HIGH)

C'est donc une condition qui ne sera jamais réalisée.

Oui soucis s’enchaînement des if/else - I’m va falloir bâtir un gros tableau d’état et bien définir les conditions à tester

Faudrait mettre pour simplifier toutes les déclarations de pins en const byte en global et leur affecter leur valeur là... et quand du code contient des variables avec des numéros qui vont au delà de 2 (genre byte v1,v2,v3;) c’est généralement le bon moment de passer à un tableau (genre byte v[3];)

Comment sont câblés les boutons ? (Pull down / anti rebond ?)

Il faut appuyer les boutons dans un certain ordre ?
Ou seulement les bons boutons, dans n'importe quel ordre?

Christian_R:
Il faut appuyer les boutons dans un certain ordre ?
Ou seulement les bons boutons, dans n'importe quel ordre?

tel que c'est codé ça a l'air d'indiquer que l'ordre compte puisque certaines combinaisons vont éteindre certaines LEDs (sinon suffirait de tout appuyer :)) )

Merci pour vos réponses.

J'ai sorti la fonction AND de la condition else if et lui ai fait une condition if à elle seule et maintenant ça fonctionne.

Merci encore

Si j'ai bien compris le besoin, les else if ne servent pas à grand chose.
Cela pourrait aussi bien être des if indépendants. Ce qui rendrait le code déjà un peu moins indigeste.

fdufnews:
Si j'ai bien compris le besoin, les else if ne servent pas à grand chose.
Cela pourrait aussi bien être des if indépendants. Ce qui rendrait le code déjà un peu moins indigeste.

ça génère d'autres types de contraintes dans l'écriture (il faut dire "si X et pas Y" au lieu de juste "si X" is plus tard on a un truc avec X et Y, à moins que l'on ne veuille gérer des prioritization)

J-M-L:
...à moins que l'on ne veuille gérer des prioritization

Tu voulais probablement dire "complexifications" ? :smiling_imp:

je voulais dire que c'est la zone :slight_smile:

Sur le même principe, je connais un petit casse tete amusant qui serait très adapté pour une mise en oeuvre niveau débutant sous arduino.

Cela nécessite 9 leds et 9 boutons, disposés en carré

1 2 3
4 5 6
7 8 9

Au départ, chacune des 9 leds a un état aléatoire allumé ou éteint.

Un appui sur un bouton provoque l'inversion de l'état de plusieurs leds.

bouton 1 => inversion des leds 1 2 4 5 (les 4 leds du même coin)
bouton 3 => inversion des leds 2 3 5 6
bouton 7 => inversion des leds 4 5 7 8
bouton 9 => inversion des leds 5 6 8 9

bouton 2 => inversion des leds 1 2 3 (les 3 leds du même bord)
bouton 4 => inversion des leds 1 4 7
bouton 6 => inversion des leds 3 6 9
bouton 8 => inversion des leds 7 8 9

bouton 5 => inversion des leds 2 4 5 6 8 (la croix centrale)

Le but est d'arriver à éteindre toutes les leds (ou de former n'importe quelle cible déterminée à l'avance, comme un O ou un X).

Ce casse tête n'est ni hyper simple ni hyper complexe, et peut occuper un bon moment un cerveau de tout age.