[Résolu] Empêcher de tomber dans un if

Bonjour, mon titre n'est peut-être explicite alors je m'explique

Je programme sur un Arduino, plus particulièrement sur un Afficheur LCD

Mon programme consiste à déplacer un curseur sur l'afficheur.

On peut se déplacer de gauche à droite et prendre que 3 positions précises. Voici une photo pour mieux comprendre:

http://image.noelshack.com/fichiers/2016/42/1477243831-20161023-192458-1.jpg

On est soit devant les heures, soit devant les minutes, soit devant les secondes.

Mon programme est construit de telle sorte que lorsque le sélecteur > est devant les heures (colonne 0), et qu'on appuie sur le bouton de droite, "colonne" passe à 5, le sélecteur allant devant les minutes.

Le problème est que dès lors qu'on appuie sur le bouton de droite, la valeur de "colonne" passe à 5, le sélecteur va à 5, mais on tombe dans le if suivant qui dit que si on est devant les minutes (colonne 5) et qu'on appuie sur le bouton de droite, on va aux secondes.

Ainsi en étant aux heures, j'appuie sur le bouton de droite, et le sélecteur fait n'importe quoi.

Comment faire pour qu'en étant devant les heures et qu'on appuie sur le bouton de droite, on déplace le sélecteur à colonne = 5 mais sans "enclancher" le if suivant et aller à colonne = 10 ?...

Voici mon code:

 lcd.setCursor(colonne, 1); //On met le curseur à 0,1

/* -----------------------------------
* |     SI ON EST AUX HEURES          |
*  ----------------------------------- */

  if (colonne == 0) 
  {
      lcd.print(">");
      if (buttons & BUTTON_RIGHT) //Si on est aux heures et qu'on appuie sur le bouton droite
      {
        lcd.setCursor(colonne, 1); //On se met en 0,1
        lcd.print(" "); //On efface le >
        colonne = 5;
        lcd.setCursor(colonne, 1); //On va aux minutes
        lcd.print(">"); //On remet le >
      }

      else if (buttons & BUTTON_LEFT) //Sinon si on est aux heures et qu'on appuie sur le bouton gauche
      {
        lcd.setCursor(colonne, 1);
        lcd.print(" ");
        colonne = 10;
        lcd.setCursor(colonne, 1);
        lcd.print(">");
      }
     
   }
 
  
/* -----------------------------------
* |     SI ON EST AUX MINUTES         |
*  ----------------------------------- */

  else if (colonne == 5)
  {
    if (buttons & BUTTON_RIGHT) //Si on est aux minutes et qu'on appuie sur le bouton droite
      {
        lcd.setCursor(colonne, 1); //On se met en 5,1
        lcd.print(" "); //On efface le >
        colonne = 10;
        lcd.setCursor(colonne, 1); //On va aux secondes
        lcd.print(">"); //On remet le >
      }

      else if (buttons & BUTTON_LEFT) //Sinon si on est aux minutes et qu'on appuie sur le bouton gauche
      {
        lcd.setCursor(colonne, 1);
        lcd.print(" ");
        colonne = 0;
        lcd.setCursor(colonne, 1);
        lcd.print(">");
      }
     
  }


/* -----------------------------------
* |     SI ON EST AUX SECONDES        |
*  ----------------------------------- */

  else if (colonne == 10)
  {
    if (buttons & BUTTON_RIGHT) //Si on est aux secondes et qu'on appuie sur le bouton droite
      {
        lcd.setCursor(colonne, 1); //On se met en 10,1
        lcd.print(" "); //On efface le >
        colonne = 0;
        lcd.setCursor(colonne, 1); //On va aux heures
        lcd.print(">"); //On remet le >
      }

      else if (buttons & BUTTON_LEFT) //Sinon si on est aux secondes et qu'on appuie sur le bouton gauche
      {
        lcd.setCursor(colonne, 1);
        lcd.print(" ");
        colonne = 5;
        lcd.setCursor(colonne, 1);
        lcd.print(">");
      }      
  }

En réalité pour tomber dans le deucième if il faudrait qu'on soit à colonne = 5 ET qu'on appuie sur un bouton, ce qu'on ne fait pas, pourtant il comprend que si...

Merci de votre aide.

Je reste à disposition si quelque chose n'est pas clair.

avant de sortir de ton if, tu attends d'avoir relâche le bouton
if (xxx)
{

bla bla bla

delay(20); //anti rebonds
while (buttons & BUTTON_RIGHT){}; //attends que le BP soit relaché
}

Solution toute simple à laquelle je n'avais pas pensé, merci beaucoup !

Cependant il reste un soucis. Quand je suis en position 1 et que je veux aller à 2 ou 3, pas de soucis.
Mais ensuite impossible de redéplacer le curseur, comme si je n'entrais pas dans les "else if"...

Aurais-tu une idée de l'origine du pb ?

bonjour,
tu te prends un peu la tête pour rien à mon avis en faisant tous ces if else if

deux if suffisent je pense, je ne reprends pas la solution de dfgh qui est valide, la flemme :slight_smile:

int colonne =0;
blabla

     if (buttons & BUTTON_RIGHT) //Si on est aux heures et qu'on appuie sur le bouton droite
      {
        lcd.setCursor(colonne, 1); //On se met en 0,1
        lcd.print(" "); //On efface le >
        colonne  += 5;
             if (colonne > 10) colonne=10;
        lcd.setCursor(colonne, 1); //On va aux minutes
        lcd.print(">"); //On remet le >

      }

      if (buttons & BUTTON_LEFT) //Sinon si on est aux heures et qu'on appuie sur le bouton gauche
      {
        lcd.setCursor(colonne, 1);
        lcd.print(" ");
        colonne -= 5;
            if (colonne < 0) colonne=0;
        lcd.setCursor(colonne, 1);
        lcd.print(">");
      }

Tu as raison, j’ai simplifié le code :slight_smile:

Cependant avec les while à la fin de mes boucles, même soucis; je ne peux déplacer le sélecteur qu’une seule fois… Sans le while je peux le déplacer autant que je veux mais il prend des positions aléatoires j’ai l’impression. :frowning:

Par je ne sais quel miracle j'ai trouvé la solution en mettant un delay de 500ms et en enlevant le while, ce qui revient je pense à juste attendre que le bouton soit relâché avant de sortir du if :slight_smile:

Je vous remercie pour votre aide !
Je passe le topic en résolu.

les 500ms font une sorte d'antirebond
le principal étant que ton soucis soit résolu :wink: