else if

Bonjour

Dans mon code que je construis petit à petit j'imbrique des if puis des else if seulement le dernier
else if que j' ai imbriqué ne me renvois pas d'erreur mais il ne fonctionne pas non plus. Donc si quelqu'un pouvait m'orienter que je puisse corriger mon erreur ça serait sympa.

j' ai mis des //************************************************************

dans la partie du code que j'ai ajouté et sans ces parties la le code fonctionne très bien
même si c pas très propre ni optimisé.

void loop() {
randNumber =  random(3) ;

if (randNumber == 0)
{
lion();

  Serial.println("jouLion");
  do{
    
    buttonStateLion = digitalRead(buttonLion);
    buttonStateTigre = digitalRead(buttonTigre);//*******************************************************
}
while(buttonStateLion == 0) ; //tant que compteur est différent , on boucle

  Serial.println(buttonStateLion); 
     

if (buttonStateLion != lastButtonStateLion){
//***
   if (buttonStateLion == HIGH) {
      // si l'état actuel du bouton est HAUT
      // il est passé de BAS  à HAUT
     

      // affiche les messages sur le PC
      Serial.println("GAGNER");
    // si l'état du bouton poussoir a changé 
      digitalWrite(ledGagner, HIGH);  //on allume la diode gagner 
      delay(3*tempo);
      digitalWrite(ledGagner, LOW);  //on allume la diode gagner
   }
 }
 //  ici     mettre un sinon si condition  un seul des autre bouton es inverser a son
 //etat initial
 else  if (buttonStateTigre != lastButtonStateTigre)//************************************************************
 {                                                   //************************************************************
  Serial.println("PERDU");                           //************************************************************
    // si l'état du bouton poussoir a changé         //************************************************************
      digitalWrite(ledPerdu, HIGH);  //on allume la diode perdu //************************************************************
      delay(3*tempo);                                           //************************************************************
      digitalWrite(ledPerdu, LOW);  //on etiend la diode gagner  //************************************************************
 }
 
 Serial.println("depart");
 Serial.println(buttonStateLion);
bouttonStateTousAZero(); 
Serial.println(buttonStateLion);
Serial.println("arriver");
}

else if (randNumber == 1) 
{  
tigre();

  Serial.println("joutigre");
  do{
    
    buttonStateTigre = digitalRead(buttonTigre);
    
}
while(buttonStateTigre == 0) ; //tant que compteur est différent de 5, on boucle

  Serial.println(buttonStateTigre); 
     

if (buttonStateTigre != lastButtonStateTigre){
//***
   if (buttonStateTigre == HIGH) {
      // si l'état actuel du bouton est HAUT
      // il est passé de BAS  à HAUT
     

      // affiche les messages sur le PC
      Serial.println("GAGNER");
      

    // si l'état du bouton poussoir a changé 
      digitalWrite(ledGagner, HIGH);  //on allume la diode gagner 
      delay(3*tempo);
      digitalWrite(ledGagner, LOW);  //on allume la diode gagner
   }
       


 Serial.println("depart");
 Serial.println(buttonStateTigre);
bouttonStateTousAZero(); 
Serial.println(buttonStateTigre);
Serial.println("arriver");
}
}

else  if (randNumber == 2) 
{

tortue();
 Serial.println("jouTortue");
  do{
    
    buttonStateTortue = digitalRead(buttonTortue);
    
}
while(buttonStateTortue == 0) ; //tant que compteur est différent de 5, on boucle

  Serial.println(buttonStateTortue); 
     

 if (buttonStateTortue != lastButtonStateTortue){
//***
   if (buttonStateTortue == HIGH) {
      // si l'état actuel du bouton est HAUT
      // il est passé de BAS  à HAUT
     

      // affiche les messages sur le PC
      Serial.println("GAGNER");
      

    // si l'état du bouton poussoir a changé 
      digitalWrite(ledGagner, HIGH);  //on allume la diode gagner 
      delay(3*tempo);
      digitalWrite(ledGagner, LOW);  //on allume la diode gagner
   }
       

 }

 Serial.println("depart");
 Serial.println(buttonStateTortue);
bouttonStateTousAZero(); 
Serial.println(buttonStateTortue);
Serial.println("arriver");
}
}

Merci pour vos réponses.

Bonjour,

Indentes correctement ton code (Ctrl T dans l'ide arduino) et tu verras mieux.

Merci pour l'astuce.
Du coup j'ai pu corrigé mon erreur.

Bonsoir
Voila je n'arrive pas a écrire cette ligne.
(j'ai crié victoire trop vite.)

while (buttonStateLion== 0 || buttonStateTigre== 0 || buttonStateTortue== 0) ;

et si je fait
while (buttonStateLion || buttonStateTigre || buttonStateTortue== 0) ;

il n'y as que la dernière instruction qui fonctionne.

Merci pour vos réponses.

hello
peux tu tester:

while ((buttonStateLion== 0) || (buttonStateTigre== 0) || (buttonStateTortue== 0)) ;

snif snif plus aucun boutons ne répond.

while ((buttonStateLion== 0) || (buttonStateTigre== 0) || (buttonStateTortue== 0)) ;
Merci

Bonjour,

Tes boutons sont à LOW ou HIGH lorsque tu appuies dessus
Dans un cas comme dans l'autre ton while est bizarre. Qu'est ce que tu veux faire dans ce while ?

Bonjour Kamill

J'ai une led qui me donne un code morse aléatoire pour boutons 1,2 ou 3

Je veux que le while vérifie si l'un de ces boutons a été appuyer et si le code morse est 1 et que si j'appuie
sur 1 la led gagner (vert)s'allume mais si l'on appuit sur 2 ou 3 la led (rouge) s'allume.

while vérifie l'état des boutons et tant que aucun n'a changé d'état il boucle do pour lire l'état des boutons.

Si je ne mets qu'une seule condition dans while ça fonctionne.
bouton en LOW appuyé.

J'aurais bien mis mon code entier mais on est limité à 9000 caractères.

Pourquoi tu veux faire comme ça?
Ce que tu avais commencé à faire est suffisant

if (buttonStateLion != lastButtonStateLion){
//***
  if (buttonStateLion == HIGH) {

Si aucun bouton n'est appuyé aucune action ne sera faite

Je veux que si un autre bouton est appuyé il indique perdu
d'où le else if dans le code du haut du poste.

else if (buttonStateTigre != lastButtonStateTigre)
{
Serial.println("PERDU");

digitalWrite(ledPerdu, HIGH); //on allume la diode perdu
delay(3*tempo);
digitalWrite(ledPerdu, LOW); //on éteint la diode gagner
}

Pour chaque bouton, il faut que tu testes s'il a été appuyé comme tu l'as fait et tu attribues une valeur à une variable (par exemple boutonAppuye=0 pour le premier bouton).
Ensuite quand cette variable (que tu as initialisé par exemple à -1) est différente de sa valeur initiale tu fais le test if (boutonAppuye==randNumber) pour savoir si c'est gagné ou perdu.

J'ai honte, je comprends bien ce que tu me dis et la simplicité par rapport à ce que j'avais fait mais je n'arrive pas le transcrire en code. Peux-tu m'aider un peu plus ?
Merci.

Tu peux essayer ceci:

void loop() {
 static int randNumber=-1;
 static int boutonAppuye=-1;
 static byte lastButtonStateLion=LOW;
 static byte lastButtonStateTigre=LOW;
 static byte lastButtonStateTortue=LOW;

 byte buttonStateLion;
 byte buttonStateTigre;
 byte buttonStateTortue;

 if (randNumber==-1)
 {
   randNumber=random(3);
   switch (randNumber)
   {
     case 0:
       Serial.println("jouLion");
       break;
     case 1:
       Serial.println("jouTigre");
       break;
     case 2:
       Serial.println("jouTortue");
       break;
   }
   boutonAppuye=-1;      // on attend l'appui sur un bouton
 }

 buttonStateLion = digitalRead(buttonLion);
 if (buttonStateLion != lastButtonStateLion) {
     if (buttonStateLion == HIGH)
       boutonAppuye=0;
     lastButtonStateLion=buttonStateLion;
 }

 buttonStateTigre = digitalRead(buttonTigre);
 if (buttonStateTigre != lastButtonStateTigre) {
     if (buttonStateTigre == HIGH)
       boutonAppuye=1;
     lastButtonStateTigre=buttonStateTigre;
 }

 buttonStateTortue = digitalRead(buttonTortue);
 if (buttonStateTortue != lastButtonStateTortue) {
     if (buttonStateTortue == HIGH)
       boutonAppuye=2;
     lastButtonStateTortue=buttonStateTortue;
 }

 if (boutonAppuye!=-1)
 {
   // on a appuyé sur un bouton, on teste si c'est le bon
   if (boutonAppuye==randNumber)
   {
     // c'est gagné
     Serial.println("GAGNE");
   }
   else
   {
     // c'est perdu
     Serial.println("PERDU");
   }

   delay(3000);              // délai entre chaque jeu
   randNumber=-1;            // nouveau jeu
 }

 delay(20);                // pour l'anti rebond
}

Dans un premier temps on génère un nombre aléatoire
Ensuite on teste les boutons
Ensuite si un des boutons a été appuyé, on teste si c'est le bon

Comme la fonction loop est appelée cycliquement, il faut s'assurer de ne pas faire des actions qui sont déjà faites. On pourrait utiliser des flags, moi j'ai choisi d'utiliser la valeur particulière -1 (pour randNumber et boutonAppuye)

Merci ça fonctionne nickel maintenant.