A led ! (Problème de sortie de boucle ?)

Bonjour a tous, je vient vous voir car j'ai un petit problème.

J'ai fait un montage a base de servomoteur et de 3 Leds et 2 boutons. Le but du jeu étant :

Repos : Led verte allumée.

Appuie sur le bouton 1 : Rotation du servo de 180° plus allumage des 3 Leds synchronisé.

Appuie sur le bouton 2 : Clignotement des Leds selon le schéma suivant ( Led verte / Led rouge)(Led jaune - Led jaune)( Led verte / Led rouge).

Pour la partie 1 pas de problème, mon servo fait son boulot, les leds aussi
Par contre dès que j'appuis sur le bouton 2, le clignotement ce fait, mais je ne peut pas le couper, plus rien ne ce passe.
Je vous joint une petite vidéo du problème (Arduino - YouTube)

#include <Servo.h> 
 
Servo servo; 
            
int pos = 0;    
const int bouton = 2;
const int bouton2 = 3;
const int ledVert = 6;
const int ledJaune = 5;
const int ledRouge = 4;

int etatBouton;


void setup() 
{ 
  pinMode(bouton, INPUT);
  pinMode(bouton2, INPUT);
  pinMode(ledVert, OUTPUT);
  pinMode(ledJaune, OUTPUT);
  pinMode(ledRouge, OUTPUT);
  digitalWrite(ledVert, HIGH);
  digitalWrite(ledJaune, HIGH);
  digitalWrite(ledRouge, HIGH);
  
  etatBouton = HIGH;
  servo.attach(9);  // Servo sur pin 9
  servo.write(0);  // Servo en position 0
  
  
}
 
void loop() 
{
     etatBouton = digitalRead(bouton2);
       while(etatBouton == HIGH) // Tant que le bouton est pressé...
         {
           digitalWrite(ledVert, LOW);
           digitalWrite(ledRouge, LOW);
           delay(100);
           digitalWrite(ledVert, HIGH);
           digitalWrite(ledRouge, HIGH);
           delay(100);
           digitalWrite(ledJaune, LOW);
           delay(100);
           digitalWrite(ledJaune, HIGH);
           delay(100);
           digitalWrite(ledJaune, LOW);
           delay(100);
           digitalWrite(ledJaune, HIGH);
           delay(100);
         }
          digitalWrite(ledVert, LOW); // Bouton 2 relâcher (repos)
        
   
   
   etatBouton = digitalRead(bouton);
     if(etatBouton == HIGH) // Si bouton actif alors clignotement led selon schéma
     {
       digitalWrite(ledVert, LOW);
       digitalWrite(ledJaune, LOW);
       digitalWrite(ledRouge, LOW);
       delay(5);
       digitalWrite(ledVert, HIGH);
       digitalWrite(ledJaune, HIGH);
       digitalWrite(ledRouge, HIGH);
       servo.write(167);
     }
     else // sinon servo retourne a la position 0
     {
     servo.write(0);
     }
}

Bonjour,

etatBouton n'est pas changée dans la boucle while, donc la condition est toujours vraie.
Il faut lire l'état du bouton dans la boucle while aussi, pour vérifier qu'il change d'état.

C'est a dire ?

Un truc du genre :

while(etatBouton == HIGH) // Tant que le bouton est pressé...
         {
           if(etatBouton == HIGH)
          {
           digitalWrite(ledVert, LOW);
           digitalWrite(ledRouge, LOW);
           delay(100);
          ....
          }
          else
         {
          digitalWrite(ledVert, LOW);
         }
}

Edit : Je vient d'essayer, ça ne marche pas.
Pire, même en collant mon premier code je n'ai plus les leds qui clignote a l'appuie du bouton 1 (servo) mais elle reste fixe o_o

non.

Je veux dire: c'est dans la boucle que tu mentionnes qu'il faut relire l'état du bouton, sinon la variable ne change pas de valeur et tu restes dans la boucle while

XavierMiller:
Je veux dire: c'est dans la boucle que tu mentionnes qu'il faut relire l'état du bouton, sinon la variable ne change pas de valeur et tu restes dans la boucle while

Je ne comprend pas trop, je commence ma boucle :

etatBouton = digitalRead(bouton2);
       while(etatBouton == HIGH) // Tant que le bouton est pressé...
         {
           digitalWrite(ledVert, LOW);
           digitalWrite(ledRouge, LOW);
           delay(100);
...

Donc la, je lis : -Tant que l'état du bouton est haut

  • J'exécute ce qui est entre crochet

Ou alors je peut laisser while vide ?

etatBouton = digitalRead(bouton2);
       while() // Tant que le bouton est pressé...
         {
           etatBouton == HIGH;
           digitalWrite(ledVert, LOW);
           digitalWrite(ledRouge, LOW);
           delay(100);

non, ton while vérifie "tant que la variable contenant un état de bouton a toujous la même valeur".
Il faut faire un digitalRead() dans ta boucle...

Essaie avec ce code:

#include <Servo.h> 
 
Servo servo; 
            
int pos = 0;    
const int bouton1 = 2;
const int bouton2 = 3;
const int ledVert = 6;
const int ledJaune = 5;
const int ledRouge = 4;

int etatBouton1 = HIGH;
int etatBouton2 = HIGH;


void setup() 
{ 
  pinMode(bouton1, INPUT);
  pinMode(bouton2, INPUT);
  pinMode(ledVert, OUTPUT);
  pinMode(ledJaune, OUTPUT);
  pinMode(ledRouge, OUTPUT);
  digitalWrite(ledVert, HIGH);
  digitalWrite(ledJaune, HIGH);
  digitalWrite(ledRouge, HIGH);
  
  servo.attach(9);  // Servo sur pin 9
  delay(10);
  servo.write(0);  // Servo en position 0
  
  delay(200); // Laisse le temps au servo de se positionner en position 0
  
}
 
void loop() 
{
  
     etatBouton1 = digitalRead(bouton1);
     etatBouton2 = digitalRead(bouton2);
    
       
       switch (bouton2){
        case HIGH: // Tant que le bouton est pressé...
           digitalWrite(ledVert, LOW);
           digitalWrite(ledRouge, LOW);
           delay(100);
           digitalWrite(ledVert, HIGH);
           digitalWrite(ledRouge, HIGH);
           delay(100);
           digitalWrite(ledJaune, LOW);
           delay(100);
           digitalWrite(ledJaune, HIGH);
           delay(100);
           digitalWrite(ledJaune, LOW);
           delay(100);
           digitalWrite(ledJaune, HIGH);
           delay(100);
          break; 
          
        default:
           digitalWrite(ledVert, LOW); // Bouton 2 relâcher (repos)
          break;  
       }

      switch (bouton1){
        case HIGH: // Si bouton actif alors clignotement led selon schéma
          digitalWrite(ledVert, LOW);
          digitalWrite(ledJaune, LOW);
          digitalWrite(ledRouge, LOW);
          delay(5);
          digitalWrite(ledVert, HIGH);
          digitalWrite(ledJaune, HIGH);
          digitalWrite(ledRouge, HIGH);
          servo.write(167);
         break; 
          
        default:
            servo.write(0); // sinon servo retourne a la position 0
          break;  
       }
}

Tiens, maintenant que j'y pense : le code ici fait l'un ou l'autre. Faut-il que les actions des boutons 1 et 2 soient simultanées ?

Dans ce cas, les 2 codes mentionnés ne fonctionneront pas.

XavierMiller:
Tiens, maintenant que j'y pense : le code ici fait l'un ou l'autre. Faut-il que les actions des boutons 1 et 2 soient simultanées ?

Dans ce cas, les 2 codes mentionnés ne fonctionneront pas.

Non les deux actions sont différentes, soit bouton, soit bouton1.

john_lenfr:
Essaie avec ce code:

#include <Servo.h>

Rien ne fonctionne, aucune réponse, ni les leds, ni le servo :cold_sweat:

J'ai eu l'idée avant de lire le code ci-dessus de rajouter des variables :

int etatBouton;
int etatBouton2;
void loop() 
{
etatBouton = digitalRead(bouton);
etatBouton2 = digitalRead(bouton2);

Je vais continuer a suivre cette piste :slight_smile:

Bon, j'ai pas trouver :roll_eyes:

De plus dans le void setup() mes leds ne clignote pas.

Je voulais faire un petit clignotement au branchement, mais ça reste allumé tout simplement.

Peut-on avoir le code complet que tu utilises au final?

Mon code avec le Switch ne fonctionne pas? ça me parait bizare.

Pour faire clignoter les leds dans le setup il faut que tu mettes une temporisation entre chaque changement d'état (delay(200) au minimum pour que ce soit visible)
N'oublies pas que le delay() est en millisecondes donc 200 = 0.2s !

Pour le coup, j'ai tellement toucher a plein de truc que je me suis embrouillé dans mon code, je suis donc repartis a 0 en rajoutant les leds d'initialisation, grace au delay() ça fonctionne, merci :grin: par contre j'ai toujours pas de piste pour mon while, j'ai beau lire des trucs sur ça je vois pas :roll_eyes:

#include <Servo.h> 
 
Servo servo; 
            
int pos = 0;    
const int bouton = 2;
const int bouton2 = 3;
const int ledVert = 6;
const int ledJaune = 5;
const int ledRouge = 4;

int etatBouton;


void setup() 
{ 
  pinMode(bouton, INPUT);
  pinMode(bouton2, INPUT);
  pinMode(ledVert, OUTPUT);
  pinMode(ledJaune, OUTPUT);
  pinMode(ledRouge, OUTPUT);
  digitalWrite(ledVert, HIGH); // initialisation
  digitalWrite(ledJaune, HIGH);
  digitalWrite(ledRouge, HIGH);
  delay(300);
  digitalWrite(ledVert, LOW);
  digitalWrite(ledJaune, LOW);
  digitalWrite(ledRouge, LOW);
  delay(300);
  digitalWrite(ledVert, HIGH);
  digitalWrite(ledJaune, HIGH);
  digitalWrite(ledRouge, HIGH);
  delay(300);
  digitalWrite(ledVert, LOW);
  digitalWrite(ledJaune, LOW);
  digitalWrite(ledRouge, LOW);
  
  etatBouton = HIGH;
  servo.attach(9);  // Servo sur pin 9
  servo.write(0);  // Servo en position 0
  
  
}
 
void loop() 
{
     etatBouton = digitalRead(bouton2);
       while(etatBouton == HIGH) // Tant que le bouton est pressé...
         {
           digitalWrite(ledVert, LOW);
           digitalWrite(ledRouge, LOW);
           delay(100);
           digitalWrite(ledVert, HIGH);
           digitalWrite(ledRouge, HIGH);
           delay(100);
           digitalWrite(ledJaune, LOW);
           delay(100);
           digitalWrite(ledJaune, HIGH);
           delay(100);
           digitalWrite(ledJaune, LOW);
           delay(100);
           digitalWrite(ledJaune, HIGH);
           delay(100);
         }

   etatBouton = digitalRead(bouton);
     if(etatBouton == HIGH) // Si bouton actif alors clignotement led selon schéma
     {
       servo.write(67); // servo actionné avant les leds
       digitalWrite(ledVert, LOW);
       digitalWrite(ledJaune, LOW);
       digitalWrite(ledRouge, LOW);
       delay(100);
       digitalWrite(ledVert, HIGH);
       digitalWrite(ledJaune, HIGH);
       digitalWrite(ledRouge, HIGH);
       delay(100);      
     }
     else // sinon servo retourne a la position 0
     {
     servo.write(0);
     }
}

ajoute "etatBouton = digitalRead(bouton2);" dans ton while, sinon la variable etatBouton ne bouge plus une fois entré dans la boucle.

     etatBouton = digitalRead(bouton2);
       while(etatBouton == HIGH) // Tant que le bouton est pressé...
         {
           digitalWrite(ledVert, LOW);
           digitalWrite(ledRouge, LOW);
           delay(100);
          ........
         digitalWrite(ledJaune, HIGH);
           delay(100);
         }

Ce morceau de code, c'est une boucle infinie si etatBouton est à l'état haut.
Tu entres dans la boucle et tu ne mets jamais à jour etatBouton à l'intérieur de celle-ci. Donc etatBouton reste à l'état haut et tu restes dans le while jusqu'à ce que l'alimentation soit coupée.
Il faut faire ça:

     etatBouton = digitalRead(bouton2);
       while(etatBouton == HIGH) // Tant que le bouton est pressé...
         {
           digitalWrite(ledVert, LOW);
           digitalWrite(ledRouge, LOW);
           delay(100);
          ........
         digitalWrite(ledJaune, HIGH);
           delay(100);
        etatBouton = digitalRead(bouton2);
         }

ou ça qui est encore plus simple

     while(digitalRead(bouton2) == HIGH) // Tant que le bouton est pressé...
         {
           digitalWrite(ledVert, LOW);
           digitalWrite(ledRouge, LOW);
           delay(100);
          ........
         digitalWrite(ledJaune, HIGH);
           delay(100);
         }

Comme dit plus haut, quand le premier bouton est à l'état HIGH tu rentres dans la première boucle while sans en ressortir car tu ne change pas l'état de étatbouton quand tu es dedans.
Comme le test while(etatBouton == HIGH) est toujours vrai tu ne sors jamais de la première boucle.

Et pour ton test il vaut mieux passer par un switch que par un while.
Le programme principal void loop() est déjà une boucle donc pas la peine d'en refaire une par dessus.

Je ne testais pas la bonne variable dans mon précédent code, essaie donc avec ce nouveau code:

#include <Servo.h> 
 
Servo servo; 
            
int pos = 0;    
const int bouton1 = 2;
const int bouton2 = 3;
const int ledVert = 6;
const int ledJaune = 5;
const int ledRouge = 4;

int etatBouton1 = HIGH;
int etatBouton2 = HIGH;


void setup() 
{ 
  pinMode(bouton1, INPUT);
  pinMode(bouton2, INPUT);
  pinMode(ledVert, OUTPUT);
  pinMode(ledJaune, OUTPUT);
  pinMode(ledRouge, OUTPUT);
  digitalWrite(ledVert, HIGH);
  digitalWrite(ledJaune, HIGH);
  digitalWrite(ledRouge, HIGH);
  
  servo.attach(9);  // Servo sur pin 9
  delay(10);
  servo.write(0);  // Servo en position 0
  
  delay(200); // Laisse le temps au servo de se positionner en position 0
  
}
 
void loop() 
{
  
     etatBouton1 = digitalRead(bouton1);
     etatBouton2 = digitalRead(bouton2);
 
 switch ( etatBouton1){
        case HIGH: // Si bouton actif alors clignotement led selon schéma
          digitalWrite(ledVert, LOW);
          digitalWrite(ledJaune, LOW);
          digitalWrite(ledRouge, LOW);
          delay(5);
          digitalWrite(ledVert, HIGH);
          digitalWrite(ledJaune, HIGH);
          digitalWrite(ledRouge, HIGH);
          servo.write(167);
         break; 

        default:
            servo.write(0); // sinon servo retourne a la position 0
          break;  
       }


 switch (etatBouton2){
        case HIGH: // Tant que le bouton est pressé...
           digitalWrite(ledVert, LOW);
           digitalWrite(ledRouge, LOW);
           delay(100);
           digitalWrite(ledVert, HIGH);
           digitalWrite(ledRouge, HIGH);
           delay(100);
           digitalWrite(ledJaune, LOW);
           delay(100);
           digitalWrite(ledJaune, HIGH);
           delay(100);
           digitalWrite(ledJaune, LOW);
           delay(100);
           digitalWrite(ledJaune, HIGH);
           delay(100);
          break; 
          
        default:
           digitalWrite(ledVert, LOW); // Bouton 2 relâcher (repos)
          break;  
       }
}

Yes tout fonctionne, je vous remercie, je vais me pencher sur switch :smiley: :wink: