Skip d'une partie de mon programme InfraRouge

Bonsoir,

Je souhaite coder un petit jeu avec la télécommande IR d'un starter pack qui consiste à choisir entre 0 et 1 qui est choisi de manière aléatoire par la commande random de l'arduino.

Mon problème est le suivant :

Dans le bout de code ci-dessous, la partie while jusqu'à lcd.print("0 or 1") se fait effacer instantanément alors que je n'ai appuyé qu'une seule fois (j'ai oublié de préciser que je suis sur un menu d'un écran lcd au début avec plusieurs choix, cela explique le premier if...BUTON1). Ensuite, l'écran m'affiche juste mon score ou perdu en fonction du random.

if (results.value == BUTON1){
        
        while(results.value == !BUTON1){ 
        lcd.clear();
        a = 1;
        lcd.setCursor(6,0);
        lcd.print("GAME");
        lcd.setCursor(5,1);
        lcd.print("0 or 1");
        
        
        }
        
        randNumber = random(0, 2);
          Serial.println(randNumber);
        
          if((results.value == BUTON1) && randNumber == 1){
            
            score++;
            lcd.clear();
            lcd.print("Score = ");
            lcd.setCursor(9,0);
            lcd.print(score);
            delay(2000);
          }
            else{
              lcd.clear();
              lcd.print("PERDU !");
            }
          
       
        
        delay(2000);
        lcd.clear();

Ma question est donc la suivante : pourriez-vous m'aider à comprendre mon erreur svp, ça fait 1h que je teste des choses désespérément...

Merci de votre aide :slight_smile:

Si vous rentrez dans ce if la value vaut BUTON1. Zéro chance donc de rentrer dans le while qui d’autre part va boucler infiniment si vous y rentriez car rien ne viendrait modifier value.
.

 if (results.value == BUTON1){
        
        while(results.value == !BUTON1) { 
        lcd.clear();
        a = 1;
        lcd.setCursor(6,0);
        lcd.print("GAME");
        lcd.setCursor(5,1);
        lcd.print("0 or 1");
        
        }

donc ce while ne sert à rien. De plus j’imagine que value c’est le code de l’IR --> Pour tester si x est différent de y on n’écrit pas if (x == j’y) {…}Maisif ( x != y) {…}

vous allez donc direct à

        randNumber = random(0, 2);
          Serial.println(randNumber);
        
          if((results.value == BUTON1) && randNumber == 1){

et le results.value == BUTON1 sera toujours encore BUTON1 forcément donc vous ne testez que le résultat du tirage aléatoire.

Et si vous ne relisez pas l'IR correctement avant de revenir au test ça ne pas bien se passer.

Ensuite ne postez pas juste un bout de code ou vous pensez qu’il y a l’erreur, souvent ce sera ailleurs. Postez tout le code ou un exemple minimaliste qui reproduit votre problème et qu’on peut compiler

#include <IRremote.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int RECV_PIN = 8;
int score;




IRrecv irrecv(RECV_PIN); //pin du recepteur
decode_results results;

#define BUTON0 0xFF6897
#define BUTON1 0xFF30CF
#define BUTON2 0xFF18E7
#define minus 0xFFE01F
#define plus 0xFFA857 

long randNumber;

void setup() {
  
  Serial.begin(9600);
  irrecv.enableIRIn(); //initialisation du récepteur
  lcd.begin(16, 2);
  lcd.clear();
  Serial.begin(9600);
  score = 0;


  
}

void loop() {

 lcd.setCursor(0,0); //affichage de mon menu principal
 lcd.print("+. GAME");
 lcd.setCursor(0,1);
 lcd.print("-. SCORES");
 lcd.setCursor(15,0);
 lcd.print(">");
 lcd.setCursor(15,1);
 lcd.print(">");


 
  if (irrecv.decode(&results)){


        if (results.value == plus){ //si j'appuie sur le bouton plus
        
        lcd.clear();
        lcd.setCursor(6,0);
        lcd.print("GAME");
        lcd.setCursor(5,1);
        lcd.print("0 or 1"); //affiche 
        
        
        randNumber = random(0, 2); //l'arduino choisit une valeur comprise entre 0 et 1
          Serial.println(randNumber); //j'affiche sur mon moniteur mon résultat pour être sûr
        
        
         
            if (results.value == BUTON1){ //si j'appuie sur le bouton 1
          
            if(randNumber == 1){ /si ma valeur est égale à 1
            score++;
            lcd.clear();
            lcd.print("Score = "); //affichage du score
            lcd.setCursor(9,0);
            lcd.print(score);
            }
          
          
            else if (results.value == BUTON1 && randNumber == 0){ // sinon si j'appuie sur 1 mais que le 
                                                                                                    résultat est égal à 0

              lcd.clear();
              lcd.print("PERDU !"); //affiche perdu
            }
          }
        }
        
         
        delay(2000); //j'attends puis je retourne au menu principal
        lcd.clear();

   irrecv.resume(); //fin de la transmission IR
 }
}

Voici le code complet remplacé avec les modifications suggérées. Le problème est toujours le même : lorsque je suis sur mon écran d’accueil, je peux appuyer sur la touche 1 et le jeu s’exécute quand même alors que je ne suis pas rentré dans ma condition if buton1…

Deuxièmement, lorsque je rentre dans ma condition if plus, le programme m’affiche directement le résultat perdu ou gagné, je ne comprends vraiment pas pourquoi…

Si quelqu’un a une réponse à ma question cela m’intéresserait :smiley:

ce qui fait une lecture de la télécommande c'est le cycle

if (irrecv.decode(&results)) {
 ...
   irrecv.resume(); 
}

quand vous êtes dans ce if results contient des infos dont le code de la touche appuyée (results.value) ==> tant que vous n'avez pas rebouclé vous ne lisez pas le prochain appui sur la télécommande.

Comme vous faites un

        if (results.value == plus){ //si j'appuie sur le bouton plus

faut pas être surpris que la touche soit 'plus' pendant tout la durée de ce if

Vous pouvez régler cela en bâtissant une machine à états (cf mon tuto éventuellement)