Allumer des phares à l'aide d'un joystick ...

Pour mon projet terminale où on "équipe" un vélo, je suis amené à coder en Arduino. En fait, j'ai ajouté entre autres un écran LCD 20x4, un joystick, ainsi qu'un module horloge.
Grace à l'horloge, quand il fait nuit (en fonction de l'heure et du mois), une LED (qui sera remplacée par un phare LED) s'allume automatiquement. De ce côté là, pas de problème. Le petit problème étant avec le joystick.
En fait, je veux aussi actionner le même phare avec le switch du joystick.
Voici donc mon problème: j'ai réussi à transformer le bouton poussoir du joystick en interrupteur, mais lorsque je reste appuyé un peu trop longtemps, la LED clignote en même temps.
J'ai alors pensé à rajouter une boucle while pour dire tant que le bouton n'est pas lâché, on ne sort pas de la boucle, mais cette fonction fait que (je ne sais pas pourquoi) le programme freeze !...
Voici une partie de mon code:

///////////////ALLUMAGE MANUEL DES LED AVEC LE SWITCH DU JOYSTICK///////////////
{

//Mise en place de l'étât du bouton du Joystick
buttonState = digitalRead(SW);
 
//Si l'étât du bouton a changé
  if (buttonState != lastButtonState) 
  {
//Et que le bouton est pressé
    if (buttonState==LOW) 
    { 
      //On change l'étât de la LED si il est à 1
      if(ledStatemanu==LOW) 
      {
        while(buttonState==1){};
        ledStatemanu=HIGH;
        buttonState=0;
        lastButtonState == buttonState;
        
        if(ledStateauto==HIGH)
        {
          lcd.clear();
          lcd.setCursor(1,1);
          lcd.print("Il fait nuit !");
          lcd.setCursor(1,2);
          lcd.print("Ne pas eteindre");
          lcd.setCursor(1,3);
          lcd.print("la lumiere !");
          delay(2000);
        }
      }
    else if(ledStatemanu==HIGH)
      {
        while(buttonState==0){};
        ledStatemanu=LOW;
        buttonState=1;
        lastButtonState == buttonState;
      }
      
    }
  }
  delay(50);
}

Merci beaucoup d'avance! Bonne soirée à tous.

Ben oui... ça s’appelle une boucle infinie si vous rentrez dedans

 while(buttonState==1){};
...
while(buttonState==0){};

vous pensez pas qu’il faudrait relire l’état du bouton? :slight_smile:

Sinon en ne postant qu’un bout de code on ne peut pas vous dire s’il y a des chances que ça fonctionne globalement - mais en tout cas ce petit bout n’est pas bon (et pour votre rapport de stage vaut mieux éviter l’accent circonflexe sur état)

La première, il ne rentre jamais dedans, puisqu'elle est dans un if qui lui est incompatible:
if (buttonState==LOW)mais la seconde en effet...

Effectivement!!

Bonjour iFrostizz

Le problème vient du fait que dans tes

while(buttonState==1){};
while(buttonState==0){};

buttonState ne change pas du fait que le bouton a été lu au départ

buttonState = digitalRead(SW);

La solution, lire le bouton en permanence, dans la boucle.

while(buttonState==1){buttonState = digitalRead(SW);}
while(buttonState==0){buttonState = digitalRead(SW);}

Dans le premier while, je ne suis pas sûre que buttonState==1, buttonState==0 ne serait pas plus juste?

Bonne bricole
Cordialement
jpbbricole

Bonjour, merci @jpbbricole ! :slight_smile: Ca fonctionne, j'ai juste du mettre

while(buttonState==0){buttonState = digitalRead(SW);}

Pour les deux conditions, car il faut attendre que le bouton ne soit plus pressé...
Désolé pour la faute d'orthographe, j'ai du taper un peu rapidement hier soir.
Bonne journée à tous !