Problème d'attente entre la réponse du user et la réponse de l'arduino

Bonjour,

Je souhaite créer une petite machine qui demanderai un calcul et où l'utilisateur doit taper la réponse et cela ajouterai des points à l'utilisateur seulement je rencontre plusieurs problèmes depuis quelques semaines.

Mon problème est que le code n'attend pas la bonne réponse et donc affiche non stop de nouveau calcul et met tout le temps faux...

Voici ce que j'obtiens dans la console :

Voici des photos de ce que j'obtiens et de l'installation :



Voici le code commenté que j'utilise :

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <stdlib.h>
#include <time.h>


LiquidCrystal_I2C lcd(0x27, 16, 2); // Set the LCD I2C address

const byte ROWS = 4; // Four rows
const byte COLS = 4; // Three columns
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {9,8, 7, 6}; // Connect to the row pinouts of the keypad
byte colPins[COLS] = {5,4, 3, 2}; // Connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

int scrollPosition = 0;
int riddleIndex;
String userInput = "";

//Initialisation des constantes pour stocker les nombres aléatoires de la multiplication.
int fact1 = 0;
int fact2 = 0;

int answer = "";

int score = 0;


void setup() {
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();   
  randomSeed(analogRead(0));
}

void loop() {

  // Génère un nombre entre 0 (inclus) et 11 (exclus), donc entre 0 et 10
  int fact1 = random(0, 11);
  delay(5);
  int fact2 = random(0, 11);
  //Calcul la réponse que l'utilisateur doit rentrer à la fin pour avoir la bonne réponse.
  int respond = fact1*fact2;

  //Crée l'affichage de la question avec les nombres aléatoires dans le moniteur pour checker le fonctionnement des variables.
      Serial.print(fact1);
      Serial.print("x");  
      Serial.print(fact2);
      Serial.println("= ?");

 // Afficher la question sur l'écran LCD
  lcd.setCursor(0, 0);
  lcd.print(fact1);
  lcd.print("x");
  lcd.print(fact2);
  lcd.print("= ?");
  

  char key = keypad.getKey();

  //Attends que l'utilisateur rentre les 1,2 ou 3 chiffres et vérifie à chaque fois si ce que l'utilisateur à rentrer est la bonne réponse. Ils concatènent les nombres pour vérifier les chiffres.
 if (key){
    Serial.print(key);
    lcd.print(key);
    respond += key;
   //Les serial print sont là pour checker les valeurs qui sont encodées et comment elles sont calculées.
    Serial.println(key);
    Serial.print("+");
    Serial.print(respond);
  }
  //Si la réponse est juste, alors on affiche correct et on ajoute 1 points.
  if(respond == answer){
    lcd.print("Correct!");
    Serial.print("Correct!");
    score+=1;
    // On affiche le score pour l'utilisateur.
    lcd.print("Ton score est de :");
    lcd.print(score);
  }else{
    //Si c'est faux on le dit et on affiche la bonne réponse mais aucun point est gagné !
    lcd.print("Faux la bonne réponse était :");
    lcd.print(respond);
    // On affiche le score pour l'utilisateur.
    lcd.print("Ton score est de :");
    lcd.print(score);
  }}

Merci beaucoup d'avance !

Grégoire

Si vous voulez explorer comment bien écouter le port série (ou gérer un flux asynchrone genre keypad) vous pouvez jeter un oeil à mon petit tuto sur le sujet

Vous y trouverez un bout de code pour récupérer une entrée de l’utilisateur en mode asynchrone pour le keypad.

PS: joli boîtier !

Merci pour votre réponse.

Je viens de lire votre tuto mais je ne vois pas très bien comment ça pourrait m'aider et je ne comprends pas exactement ou inclure ce bout de code.

Merci !

ci ca peux t aider https://wokwi.com/projects/376776011625235457

Il y a un bout de code pour lire une réponse en asynchrone - c’est ce qui vous permettra de gérer ce que fait l’utilisateur.

Pour votre structure de code c’est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)