questions reponses sur ecran lcd

salut a tous je débute sur arduino et je rencontre quelques obsacles…

pour commencer je voudrais faire une sorte de question réponse avec un écran LCD basique 16x2 et deux boutons poussoirs, ça donne ça :

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int vert = 7;     
const int rouge =9;

void setup() {
pinMode(vert, INPUT);
pinMode(rouge, INPUT);
lcd.begin(16, 2);
lcd.print("Question 1");

}

void loop() { 

if (digitalRead(vert) == HIGH) { 
delay(500);
lcd.clear();  
lcd.print("VRAI !");}
   
if (digitalRead(rouge) == HIGH){
delay(500);
lcd.clear();
lcd.print("FAUX !"); 
}}

jusque là tout marche parfaitement, maintenant je voudrais pouvoir faire pareil mais avec plusieurs question, d’apres ce que j’ai tenté de faire ce n’étais pas possible car le lcd lisais les questions en meme temps et les bouton poussoirs ne fonctionnent que pour les dernier choix de réponse.

bref j’ai essayer de chercher sur des tutos des blogs etc mais je ne trouve pas, je me demande donc si c’est possible, si il faut faire des dossier, utiliser une commande spéciale etc etc

merci bien pour l’aide :slight_smile:

c'est possible mais avant d'avoir de l'aide prenez le temps de lire les post épinglés en haut du forum et corrigez votre post ci dessus pour être en conformité.

ensuite on devrait pouvoir vous aider à y voir plus clair

d'accord c'est vrai que je n'y avais pas fait attention, j'ai donc balisé le code, tout est bon ?

li faudrait structurer le code un peu différemment non?

--> si vous voulez plusieurs questions, elle ne peut pas être affichée dans le set-up

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

la boucle doit donc

  • Si l'état et DEBUT afficher une question au hasard et mémoriser qu'une question est affichée puis passer en état = ATTENTE_REPONSE

  • si l'état est ATTENTE_REPONSE, vérifier les boutons

  • si un des boutons est appuyer, vérifier si c'est la bonne réponse, augmenter le score si c'est le cas, afficher un message de succès ou d'erreur, puis repasser en état DEBUT

il y à 36 possibilité de faire ce que tu veux, tu peux utiliser par exemple switch et case pour choisir une question si c’est bien ce que tu cherche à faire

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int vert = 7;    
const int rouge =9;
int q,mq; // q=numéro de la question, mq mémo pour affichage de la question

void setup() {
pinMode(vert, INPUT);
pinMode(rouge, INPUT);
lcd.begin(16, 2);
q=1; //poser la question 1

}

void loop() {

 switch (q) { 
  
    case 1: { // question 1
      if(q!=mq){ //si nouvelle question affiche le texte
        lcd.clear();
        lcd.print("Question 1");
        mq=q;
      }
      
      if (digitalRead(vert) ) {
        lcd.clear();  
        lcd.print("VRAI !");
        delay(2000);
        q=2; // passe a la question 2
      }
         
      if (digitalRead(rouge) ){
        lcd.clear();
        lcd.print("FAUX !");
        delay(2000);    
        q=2; // passe a la question 2
      }  
    break; } // end case 

    case 2: { // question 2
      if(q!=mq){ //si nouvelle question affiche le texte
        lcd.clear();
        lcd.print("Question 2");
        mq=q;
      }
      
      if (digitalRead(vert) ) {
        lcd.clear();  
        lcd.print("VRAI !");
        delay(2000);
        q=3; // passe a la question 3
      }
         
      if (digitalRead(rouge) ){
        lcd.clear();
        lcd.print("FAUX !");
        delay(2000);    
        q=3; // passe a la question 3
      }  
    break; } // end case 

//etc

    
 }  // end switch






} // end loop

fifi82:
il y à 36 possibilité de faire ce que tu veux, tu peux utiliser par exemple switch et case pour choisir une question si c’est bien ce que tu cherche à faire

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int vert = 7;   
const int rouge =9;
int q,mq; // q=numéro de la question, mq mémo pour affichage de la question

void setup() {
pinMode(vert, INPUT);
pinMode(rouge, INPUT);
lcd.begin(16, 2);
q=1; //poser la question 1

}

void loop() {

switch (q) {
 
    case 1: { // question 1
      if(q!=mq){ //si nouvelle question affiche le texte
        lcd.clear();
        lcd.print(“Question 1”);
        mq=q;
      }
     
      if (digitalRead(vert) ) {
        lcd.clear(); 
        lcd.print(“VRAI !”);
        delay(2000);
        q=2; // passe a la question 2
      }
       
      if (digitalRead(rouge) ){
        lcd.clear();
        lcd.print(“FAUX !”);
        delay(2000);   
        q=2; // passe a la question 2
      } 
    break; } // end case

case 2: { // question 2
      if(q!=mq){ //si nouvelle question affiche le texte
        lcd.clear();
        lcd.print(“Question 2”);
        mq=q;
      }
     
      if (digitalRead(vert) ) {
        lcd.clear(); 
        lcd.print(“VRAI !”);
        delay(2000);
        q=3; // passe a la question 3
      }
       
      if (digitalRead(rouge) ){
        lcd.clear();
        lcd.print(“FAUX !”);
        delay(2000);   
        q=3; // passe a la question 3
      } 
    break; } // end case

//etc

}  // end switch

} // end loop

quel horreur cette approche !! :slight_smile:

non l'approche de fifi82 n'est pas une horreur, son codage marche très bien et je vais pouvoir m'aider de celui-ci pour bien comprendre et continuer mon projet.

je pense pouvoir finir de compléter mon programme tout seul, merci a vous :slight_smile:

ça peut marcher très bien et être une horreur - c'est le cas ici... bon courage si vous voulez 100 questions

(quand on voit du code similaire répété de nombreuses fois, il faut tout de suite penser à des tableaux)

c'est juste pour monter une des solutions, perso j'utiliserai des tableaux pour mémoriser les questions et le choix des réponses

dans mon cas je comptais juste insérer une 10aine de question max,
après si comme vous dites un tableau permet de prendre en compte beaucoup plus de question et de mémoriser les réponses ça pourrais être encore plus intéressant

je ne connaissais pas les tableaux donc si vous pouvez me donner des astuces, conseil, ou comment utiliser je suis preneur :slight_smile:

je vais faire quelques recherches de mon coté, encore merci :slight_smile:

Tenez – disons que c’est encore Noël - voici un vieux bout de code que j’avais (les 2 boutons doivent être en INPUT_PULLUP, je vous laisse chercher ce que ça veut dire pour le câblage) et la console doit être à 115200 bauds

const byte pinBoutonRouge = 7; // le bouton pour répondre FAUX
const byte pinBoutonVert = 8; // le bouton pour répondre VRAI

struct question_t {
  const char * question;  // version avancée: utiliser PROGMEM pour les chaînes de caractère
  const char * explication;  // version avancée: utiliser PROGMEM pour les chaînes de caractère
  boolean reponse;
};

question_t listeDesQuestions[] = {
  {"Texte Question  1", "explication Reponse  1", false},
  {"Texte Question  2", "explication Reponse  2", true},
  {"Texte Question  3", "explication Reponse  3", false},
  {"Texte Question  4", "explication Reponse  4", false},
  {"Texte Question  5", "explication Reponse  5", true},
  {"Texte Question  6", "explication Reponse  5", false},
  {"Texte Question  7", "explication Reponse  7", true},
  {"Texte Question  8", "explication Reponse  8", true},
  {"Texte Question  9", "explication Reponse  9", false},
  {"Texte Question 10", "explication Reponse 10", false}
};

const byte nombreTotalDeQuestions = sizeof(listeDesQuestions) / sizeof(listeDesQuestions[0]);
byte questionEnCours;
byte score;

const byte maxQuestion = 5; // le nombre de questions à poser
byte questionNb; // le nombre de question déjà posées

enum : byte {DEBUT, QUESTION, REPONSE, FIN} etat;

void setup() {
  Serial.begin(115200);
  pinMode(pinBoutonRouge, INPUT_PULLUP);
  pinMode(pinBoutonVert, INPUT_PULLUP);
  randomSeed(analogRead(A0)); // initialise le générateur aléatoire
  etat = DEBUT;
}


void loop() {
  switch (etat) {
    case DEBUT:
      Serial.println(F("\n---- JEU DES QUESTIONS ---- \n"));
      score = 0;
      questionNb = 0;
      questionEnCours = random(0, nombreTotalDeQuestions); // on choisit la première question au hasard dans la liste
      etat = QUESTION;
      break;

    case QUESTION:
      // on attend le relâchement des boutons avant de poser la question
      while ((digitalRead(pinBoutonVert)  == LOW) || (digitalRead(pinBoutonRouge) == LOW)) delay(15);

      Serial.print(F("Q")); Serial.print(questionNb + 1);
      Serial.print(F(": ")); Serial.println(listeDesQuestions[questionEnCours].question);
      etat = REPONSE;
      break;

    case REPONSE:
      {
        byte rouge = digitalRead(pinBoutonRouge);
        byte vert  = digitalRead(pinBoutonVert);
        if ((rouge == LOW) || (vert == LOW)) {
          // on a un bouton qui a été appuyé
          if ((vert && listeDesQuestions[questionEnCours].reponse) || (rouge && !listeDesQuestions[questionEnCours].reponse)) {
            // on a donné la bonne réponse
            Serial.print(F("Bravo c'est VRAI"));
            score++;
          } else {
            // on a donné la mauvaise réponse
            Serial.print(F("Oh non, c'est FAUX"));
          }
          Serial.print(F(" -> ")); Serial.println(listeDesQuestions[questionEnCours].explication);
          delay(1000);

          if (++questionNb < maxQuestion) {
            questionEnCours = (questionEnCours + 1) % nombreTotalDeQuestions; // on passe à la question suivante
            etat = QUESTION;
          } else etat = FIN;
        }
      }
      break;

    case FIN:
      Serial.print(F("\n*** Score = ")); 
      Serial.print(score); Serial.print(F(" / ")); Serial.print(maxQuestion); 
      Serial.println(F(" ***"));
      delay(1000);
      etat = DEBUT;
      break;
  }
}

Génial ! c'est bon pour le câblage et pour les bauds je vais chercher ça, merci pour l'aide apporté, ça va m’être très utile !

Postez votre code final avec le LCD :slight_smile:

j'y penserais :slight_smile: