Besoin d'aide pour utiliser un clavier 16 touches

Bonjour à tous,

Je travaille en ce moment sur un projet : je souhaite réaliser un appareil destiné aux enfants pour réviser ses tables de multiplication avec 3 niveaux (facile, moyen, difficile). Une fois le niveau réussi, une trappe commandée par un servomoteur va s'ouvrir sur le côté pour pouvoir récupérer une surprise laissé par les parents à l'intérieur de la boite (à l'aide d'un code ceux-ci peuvent ouvrir la trappe et ainsi y ranger la surprise). Pour cela je souhaite utiliser comme dit précédemment un servomoteur, un écran LCD 16X2 pour afficher les multiplications à effectuer par exemple, ainsi qu'un clavier 16 touches pour donner le résultat.
J'ai fait le programme mais le problème c'est que le résultat que je tape n'est pas pris en compte. Lorsque je teste le clavier avec un programme qui par exemple allume une LED quand le chiffre 1 est pressé, ça marche. Mais si je remplace 1 par 42 par exemple, ça ne marche plus. J'aimerais avoir de l'aide car ça fait un certain temps que je suis déjà bloqué dessus.
Voici le code (1ère partie, la deuxième en dessous)

#include <Servo.h>


#include <Keypad.h>

#include <LiquidCrystal.h>

Servo monServo;

const byte ROWS = 4; //nombre de lignes du clavier
const byte COLS = 4; //nombre de colonnes du clavier
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'},
};
byte rowPins[ROWS] = {52, 50, 48, 46};
byte colPins[COLS] = {47, 49, 51, 53};

Keypad keypad = Keypad ( makeKeymap (keys), rowPins, colPins, ROWS, COLS );
LiquidCrystal lcd(12,11,5,4,3,2);

void setup() {
  // put your setup code here, to run once:
lcd.begin(16, 2);
lcd.clear ();
lcd.setCursor (0,0) ;
lcd.print ("Initilisation") ;
lcd.setCursor (4,1) ;
lcd.print ("patientez SVP") ;
keypad.setDebounceTime(300);
monServo.attach(7) ;
monServo.write(0) ;  
}



void loop() {
  char key = keypad.getKey();
  lcd.clear () ;
  lcd.setCursor (0,0);
  lcd.print ("Sélectionne");
  lcd.setCursor (10,1);
  lcd.print ("un mode");

  if (key == '1234D') {
  monServo.write (90) ;
  lcd.setCursor (0,0) ;
  lcd.print ("porte") ;
  lcd.setCursor (10,1) ;
  lcd.print ("ouverte") ;
  digitalWrite (ledVerte1, HIGH) ;
  digitalWrite (ledVerte2, HIGH) ;
  digitalWrite (ledVerte3, HIGH) ;
  delay (8000) ;
  digitalWrite (ledVerte1, LOW) ;
  delay (1000) ;
  digitalWrite (ledVerte2, LOW) ;
  delay (1000) ;
  digitalWrite (ledVerte3, LOW) ;
  delay (1000) ;
  monServo.write (0) ;
  lcd.setCursor (0,0) ;
  lcd.print ("porte") ;
  lcd.setCursor (11,1) ;
  lcd.print ("fermée") ;
  delay (3000) ;
  lcd.setCursor (0,0) ;
  lcd.print ("Sélectionne") ;
  lcd.setCursor (0,1) ;
  lcd.print ("un mode") ;
}

  if (key == 'A'){
    lcd.setCursor (0,0);
    lcd.print ("FACILE");
    delay (4000);
    lcd.setCursor (0,0);
    lcd.print  ("2X3");
    if (key == '6D'){
    lcd.setCursor (0,0);
    lcd.print ("BRAVO !!!");
    delay (5000);
    lcd.setCursor (0,0);
    lcd.print ('3X6');
    if (key == '18D'){
    lcd.setCursor (0,0);
    lcd.print ("BRAVO !!!");
    delay (5000);
    lcd.setCursor (0,0);
    lcd.print ('4X7');
    if (key == '28D') {
      lcd.setCursor (0,0);
      lcd.print ("BRAVO !!!");
      delay (5000);
      lcd.setCursor (0,0);
      lcd.print ("5X6");
      if (key == '30D') {
        lcd.setCursor (0,0);
        lcd.print ("BRAVO !!!");
        delay (5000);
        lcd.setCursor (0,0);
        lcd.print ("6X8");
        if (key == '48D'){
          lcd.setCursor (0,0);
          lcd.print ("BRAVO !!!");
          delay (5000);
          lcd.setCursor (0,0);
          lcd.print ("3X9");
          if (key == '27D'){
            lcd.setCursor (0,0);
            lcd.print ("BRAVO !!!");
            delay (5000);
            lcd.setCursor (0,0);
            lcd.print ("5X8");
            if (key == '40D'){
              lcd.setCursor (0,0);
              lcd.print ("BRAVO !!!");
              delay (5000);
              lcd.setCursor (0,0);
              lcd.print ("4X9");
             if (key == '36D'){
              lcd.setCursor (0,0);
              lcd.print ("BRAVO, TU");
              lcd.setCursor (0,1);
              lcd.print ("GAGNES UN CADEAU !") ;
              monServo.write (90);
              delay (10000);
              monServo.write (0);
              lcd.setCursor (0,0);
              lcd.print ("Sélectionne");
              lcd.setCursor (0,1);
              lcd.print ("un mode");
              
                         
             }
            }
          }
        }
       } 
      }
    }
  }
}
if (key == 'B') {
  lcd.setCursor (0,0);
  lcd.print ("NORMAL");
  delay (4000) ;
  lcd.setCursor (0,0) ;
  lcd.print ("5X8") ;
  if (key == '40D') {
    lcd.setCursor (0,0) ;
    lcd.print ("BRAVO !!!");
    delay (5000);
    lcd.setCursor (0,0);
    lcd.print ("8X7");
    if (key == '56D') {
      lcd.setCursor (0,0);
      lcd.print ("BRAVO !!!");
      delay (5000) ;
      lcd.setCursor (0,0) ;
      lcd.print ("6X8") ;
      if (key == '48D'){
        lcd.setCursor (0,0) ;
        lcd.print ("BRAVO !!!");
        delay (5000) ;
        lcd.setCursor (0,0);
        lcd.print ("7X6");
        if (key == '42D') {
          lcd.setCursor (0,0);
          lcd.print ("BRAVO !!!");
          delay (5000) ;
          lcd.setCursor (0,0) ;
          lcd.print ("9X7");
          if (key == '63D'){
            lcd.setCursor (0,0);
            lcd.print ("BRAVO !!!") ;
            delay (5000) ;
            lcd.setCursor (0,0);
            lcd.print ("6X9");
            if (key == '54D') {
              lcd.setCursor (0,0) ;
              lcd.print ("BRAVO !!!") ;
              delay (5000) ;
              lcd.setCursor (0,0) ;
              lcd.print ("9X9") ;
              if (key == '81D') {

La deuxième partie du code :

                lcd.setCursor (0,0) ;
                lcd.print ("BRAVO !!!") ;
                delay (5000);
                lcd.setCursor (0,0) ;
                lcd.print ("9X5") ;
                if (key == '45D') {
                  lcd.setCursor (0,0) ;
                  lcd.print ("BRAVO !!!") ;
                  delay (5000) ;
                  lcd.setCursor (0,0);
                  lcd.print ("8X7") ;
                  if (key == '56D') {
                    lcd.setCursor (0,0);
                    lcd.print ("BRAVO !!!");
                    delay (5000) ;
                    lcd.setCursor (0,0);
                    lcd.print ("9X6");
                    if (key == '54D') {
                      lcd.setCursor (0,0) ;
                      lcd.print ("BRAVO !!!") ;
                      delay (5000) ;
                      lcd.setCursor (0,0) ;
                      lcd.print ("5X7") ;
                      if (key == '35D') {
                        lcd.setCursor (0,0) ;
                        lcd.print ("BRAVO !!!") ;
                        delay (5000) ;
                        lcd.setCursor (0,0) ;
                        lcd.print ("6X8") ;
                        if (key == '48D') {
                          lcd.setCursor (0,0) ;
                          lcd.print ("BRAVO !!!") ;
                          delay (5000);
                          lcd.setCursor (0,0) ;
                          lcd.print ("6X7") ;
                          if (key ==  '42D') {
                            lcd.setCursor (0,0);
              lcd.print ("BRAVO, TU");
              lcd.setCursor (0,1);
              lcd.print ("GAGNES UN CADEAU !") ;
              monServo.write (90);
              delay (10000);
              monServo.write (0);
              lcd.setCursor (0,0);
              lcd.print ("Sélectionne");
              lcd.setCursor (0,1);
              lcd.print ("un mode");
                          }
                        }
                      }
                    }
                  }
                  
                }
              }
            }
          }
        }
      }
    }
  }
  
}
if (key == 'C') {
  lcd.setCursor (0,0) ;
  lcd.print ("DIFFICILE");
  delay (4000) ;
  lcd.setCursor (0,0);
  lcd.print ("9X9") ;
  if (key == '81D'){
    lcd.setCursor (0,0) ;
    lcd.print ("BRAVO !!!") ;
    delay (5000) ;
    lcd.setCursor (0,0) ;
    lcd.print ("8X8") ;
    if (key == '64D') {
      lcd.setCursor (0,0);
      lcd.print ("BRAVO !!!") ;
      delay (5000) ;
      lcd.setCursor (0,0) ;
      lcd.print ("7X7") ;
      if (key == '49D'){
        lcd.setCursor (0,0) ;
        lcd.print ("BRAVO !!!") ;
        delay (5000) ;
        lcd.setCursor (0,0) ;
        lcd.print ("7X8") ;
        if (key == '56D') {
          lcd.setCursor (0,0);
          lcd.print ("BRAVO !!!") ;
          delay (5000) ;
          lcd.setCursor (0,0) ;
          lcd.print ("8X8") ;
          if  (key == '64D') {
            lcd.setCursor (0,0) ;
            lcd.print ("BRAVO !!!") ;
            delay (5000) ;
            lcd.setCursor (0,0) ;
            lcd.print ("9X8") ;
            if (key == '72D') {
              lcd.setCursor (0,0) ;
              lcd.print ("BRAVO !!!") ;
              delay (5000) ;
              lcd.setCursor (0,0) ;
              lcd.print ("9X7") ;
              if (key == '63D') {
                lcd.setCursor (0,0) ;
                lcd.print ("BRAVO !!!") ;
                delay (5000) ;
                lcd.setCursor (0,0) ;
                lcd.print ("8X7") ;
                if (key == '56D') {
                  lcd.setCursor (0,0) ;
                  lcd.print ("BRAVO !!!") ;
                  delay (5000) ;
                  lcd.setCursor (0,0);
                  lcd.print ("7X7") ;
                  if (key == '49D') {
                    lcd.setCursor (0,0) ;
                    lcd.print ("BRAVO !!!") ;
                    delay (5000) ;
                    lcd.setCursor (0,0);
                    lcd.print ("7X6") ;
                    if (key == '42D') {
                      lcd.setCursor (0,0) ;
                      lcd.print ("BRAVO !!!") ;
                      delay (5000) ;
                      lcd.setCursor (0,0) ;
                      lcd.print ("8X6") ;
                      if (key == '48D') {
                        lcd.setCursor (0,0) ;
                        lcd.print ("BRAVO !!!") ; 
                        delay (5000) ;
                        lcd.setCursor (0,0) ;
                        lcd.print ("9X6") ;
                        if (key == '54D') {
                          lcd.setCursor (0,0) ;
                          lcd.print ("BRAVO !!!") ;
                          delay (5000) ;
                          lcd.setCursor (0,0) ;
                          lcd.print ("9X5");
                          if (key == '45D') {
                            lcd.setCursor (0,0) ;
                            lcd.print ("BRAVO !!!") ;
                            delay (5000) ;
                            lcd.setCursor (0,0) ;
                            lcd.print ("8X5") ;
                            if (key == '40D') {
                              lcd.setCursor (0,0) ;
                              lcd.print ("BRAVO !!!") ;
                              delay (5000) ;
                              lcd.setCursor (0,0) ;
                              lcd.print ("7X5") ;
                              if (key == '35D') {
                                lcd.setCursor (0,0) ;
                                lcd.print ("BRAVO !!!") ;
                                delay (5000) ;
                                lcd.setCursor (0,0) ;
                                lcd.print ("7X4") ;
                                if (key == '28D') {
                                  lcd.setCursor (0,0) ;
                                  lcd.print ("BRAVO, TU");
              lcd.setCursor (0,1);
              lcd.print ("GAGNES UN CADEAU !") ;
              monServo.write (90);
              delay (10000);
              monServo.write (0);
              lcd.setCursor (0,0);
              lcd.print ("Sélectionne");
              lcd.setCursor (0,1);
              lcd.print ("un mode");
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    
  }
}

}

Si vous voyez d'autres erreurs n'hésitez pas à m'en parler, je suis encore débutant :grinning:

Merci de me répondre

Bonjour,

Ton clavier ne renvoi qu'un caractère donc si tu veux traiter une chaine de caractères, il faut que tu commences par la constituer en concaténant les caractères frappés sur le clavier.

De plus des comparaisons comme key == '1234D' ne riment à rien, un caractère c'est un caractère comme 'A', 'B' ...
A l'intérieur de tes 'if' il y a d'autres if qui sont contradictoires avec le précédent et qui donc ne seront jamais exécutés.

Bonjour Kamill, merci pour ta réponse.

Peux tu me dire comment faire pour mettre bout à bout les chaines de caractère ?

Et comment faire pour que les if marchent correctement ?

Merci d'avance :wink:

voilà un petit exemple tapé à la va vite et sans le tester qui remplit un tableau de caractères que j'appelle message:

(Mettre la console Arduino sur 115200!!)

#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'#', '0', '*'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {8, 7, 6}; //connect to the column pinouts of the keypad

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

const int MAXBUFFER = 20;
char message[MAXBUFFER];   // initialisé à '\0' par le compilateur
unsigned int messageIndex; // initialisé à 0 par le compilateur

void setup() {
  Serial.begin(115200); // Mettre la console Arduino sur 115200!!
}

void loop() {
  char key = keypad.getKey();

  if (key != NO_KEY) {
    Serial.print("J'ai reçu une nouvelle touche: '"); Serial.print(key);Serial.println("'");
    message[messageIndex++] = key;
    message[messageIndex] = '\0'; // pour toujours avoir un chaîne de caractère bien formée. attention à ne pas dépasser la fin de tableau. je traite cela à la fin de ce "if (key != NO_KEY)"
    Serial.print("le message est: ["); Serial.print(message);Serial.println("]");

    // ici vous savez que vous avez reçu une nouvelle touche
    // vous pouvez gérer la mise à jour de l'affichage et autres calculs

    if (!strcmp(message, "1234D")) {
      // le message continet "1234D"
    } else {
      // oops mauvaise réponse :-)
    }

    // bien sûr il faut faire attention de ne pas saturer le buffer
    // ici je le vide quand il est plein
    // mais vous pouvez décider de le vider quand vous avez reçu une réponse complete
    // par exemple si key vaut 'D' (à regarder ce que vous testiez, je pense que vous vouliez que l'enfant tape 'D' pour valider son entrée?).
    // ce serait bien aussi de prévoir une touche pour que l'enfant corrige ce qu'il tape, donc revenir en arrière dans le buffer.

    if (messageIndex >= MAXBUFFER - 1) {
      Serial.println("buffer plein, remise à zéro");
      messageIndex = 0;
      message[0] = '\0';
    }
  }

  // ici vous pouvez faire autre chose qui n'a rien à voir avec la saisie
  // clignoter une diode par exemple pour montrer le temps qui passe

}

Merci beaucoup J-M-L pour ta réponse.
En effet, j'aimerai aussi pouvoir avoir une touche (par exemple *) pour revenir en arrière pour corriger la saisie. Je ne l'avais pas fait ne sachant pas comment procéder.
Oui le D permet bien de valider la saisie.

Pour que je comprenne bien comment faire un tableau de caractère, pourrais-tu me le faire avec cette partie de code ?

  if (key == 'A'){
    lcd.setCursor (0,0);
    lcd.print ("FACILE");
    delay (4000);
    lcd.setCursor (0,0);
    lcd.print  ('2X3');
    if (key == '6D'){
    lcd.setCursor (0,0);
    lcd.print ("BRAVO !!!");
    delay (5000);
    lcd.setCursor (0,0);
    lcd.print ('3X6');
    if (key == '18D'){
    lcd.setCursor (0,0);
    lcd.print ("BRAVO !!!");
    delay (5000);
    lcd.setCursor (0,0);
    lcd.print ('4X7');
    if (key == '28D') {
      lcd.setCursor (0,0);
      lcd.print ("BRAVO !!!");
      delay (5000);
      lcd.setCursor (0,0);

Merci d'avance :wink:

Je veux bien aider mais pas tout coder sinon vous n'apprendrez rien...

La structure de votre code ne va pas.

Vous avez vu comment lire une chaîne de caractère sur le clavier. faites en une fonction attendreChaineDeCaractere()

et la structure de votre code (pour le moment - faudra améliorer cela) sera un truc du genre:

Un tableau des const char * devinette[] = {"2x3=?", "5x7=?", "13-4=?" ...};
Un tableau des const char * bonneReponse[]= {"6", "35", "9"...};

Un compteur pour savoir où on en est NoDevinette = 0;

dans l'absolu les devinettes pourraient être construites au hasard avec la fonction random si c'est que des maths.


Afficher la

devinette[NoDevinette]

attendreChaineDeCaractere() tapée au clavier et terminée par D (D pas stocké mais mettre '\0')
Comparer la chaîne de caractère reçue avec la

bonneReponse[NoDevinette]

Si bonne réponse félicitations, augmenter le compteur de bonne réponses, NoDevinette = NoDevinette+1; sinon réessayer

Si le Nb de bonnes réponse est < 3, passer la devinette suivante sinon on a 3 bonnes réponses, ouvrir la boîte à bonbons

Essayez, montez nous un bout de code et one vous aidera à améliorer

Merci J-M-L pour ta réponse. Je fais. (Enfin j'essaye) de faire la partie de code et je la poste.

Voila le code :

#include <Keypad.h>

const byte ROWS = 4;
const byte COLS = 4;
char keys [ROWS] [COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'},
};
byte rowPins [ROWS] = {5, 4, 3, 2};
byte colPins [COLS] = {11, 10, 9, 8};
Keypad keypad = Keypad ( makeKeymap (keys), rowPins, colPins, ROWS, COLS );
const int MAXBUFFER = 3;
char message [MAXBUFFER];
unsigned int messageIndex ;
  const char  devinette[devinette] = {"2x3=?", "3x6=?", "4x7=?", '\0'} ;
const char bonneReponse [bonneReponse] = {"6", "18", "28", '\0'} ;


void setup() {
  // put your setup code here, to run once:
Serial.begin (115200) ;
int NoDevinette = 0 ;
int BonneReponse = 0 ;
}

void loop() {
  // put your main code here, to run repeatedly:
char key = keypad.getKey();

Serial.print ("2x3") ;
if (!strcmp(devinette, "6")) {
  Serial.print ("BRAVO !") ;
  delay (2000) ; 
  int BonneReponse = 1 ;
    messageIndex = 0;
    message[0] = '\0' ;
    int NoDevinette = 1;
} else {
  if (!strcmp(devinette, "6") = FALSE) {
    Serial.print ("DOMMAGE ! 2x3=6") ;
    delay (2000) ;
    messageIndex = 0;
    message[0] = '\0' ;
    int NoDevinette = 1;
  }
  
}
if (NoDevinette = 1) {
  Serial.print ("3x6") ;
  if (!strcmp(devinette, "18")) {
    Serial.print ("BRAVO !") ;
    delay (2000) ;
    int BonneReponse = 2 ;
    messageIndex = 0;
    message[0] = '\0' ;
    int NoDevinette = 2;
  } else {
    if (!strcmp(devinette, "18") = FALSE) {
      Serial.print ("DOMMAGE ! 3x6=18") ;
      delay (2000) ;
      messageIndex = 0; 
      message[0] = '\0' ;
      int NoDevinette = 2 ;
    }
  }
}
if (NoDevinette = 2) {
  Serial.print ("4x7") ;
  if (!strcmp(devinette, "28")) {
    Serial.print ("BRAVO !") ;
    delay (2000) ;
    int BonneReponse = 3;
    messageIndex = 0;
    message[0] = '\0' ;
    int NoDevinette = 3 ;
  }
  else {
    if (!strcmp(devinette = "28") = FALSE) {
      Serial.print ("DOMMAGE ! 4x7=28") ;
      delay (2000) ;
      messageIndex = 0;
      message [0] = '\0' ;
      int NoDevinette = 3 ;
    }
  }
}
if (NoDevinette = 3) {
  if (BonneReponse = 33) {
    Serial.print ("BRAVO ! TU PEUX PRENDRE TON CADEAU !") ;
    delay (15000) ;
  }
}
}

J'y ai passé du temps et j'ai essayé de faire de mon mieux, mais je pense malheureusement qu'il y a encore des erreurs.

Merci de me corriger :smiley:

Non là ça ne va pas, vous n'avez rien pour lire le clavier une fois la devinette afficheée.

attention aussi quand vous écrivez int toto = 1; dans le code ça crée une variable temporaire à portée limitée. si toto est une variable globale, il faut juste faire toto = 1

tenez pour vous aider un peu (je n'ai pas testé) voilà à quoi pourrait ressembler la partie fonction de lecture d'une chaine (et affichage à chaque mise à jour) avec un petit exemple dans le setup

#include <Keypad.h>

const byte ROWS = 4;
const byte COLS = 4;
char keys [ROWS] [COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'},
};
byte rowPins [ROWS] = {5, 4, 3, 2};
byte colPins [COLS] = {11, 10, 9, 8};
Keypad keypad = Keypad ( makeKeymap (keys), rowPins, colPins, ROWS, COLS );

const int MAXBUFFER = 5;
char message [MAXBUFFER];

const char * devinette[] = {"2x3=?", "3x6=?", "4x7=?"} ;
const char * bonneReponse[] = {"6", "18", "28"} ;
int NoDevinette = 0 ;

void afficheReponseEnCours()
{
  // replacer par l'affichage au bon endroit du LCD avec effacement du message précédent
  Serial.print("le message est: ["); Serial.print(message); Serial.println("]");
}

void lireUneReponse()
{
  char key;
  boolean saisieEnCours = true;
  unsigned int messageIndex = 0;

  message[0] = '\0';

  while (saisieEnCours) {
    key = keypad.getKey();
    switch (key) {
      case NO_KEY: // on ne fait rien, on n'a rien reçu
        break;

      case '#': // effacer un caractère
        if (messageIndex > 0) {
          message[--messageIndex] = '\0';
          afficheReponseEnCours();
        }
        break;
      
      case '*': // valider l'entrée
        saisieEnCours = false;
        break;
      
      default:
        message[messageIndex++] = key;
        message[messageIndex] = '\0'; // pour toujours avoir un chaîne de caractère bien formée.
        afficheReponseEnCours();
        if (messageIndex >= MAXBUFFER - 1) {
          saisieEnCours = false; // l'entrée est validée car trop de caractères
        }
        break;
    } // fin du switch
  } // fin du while saisieEnCours
}


void setup() {
  Serial.begin(115200); // Mettre la console Arduino sur 115200!!
  NoDevinette = 0;

  // on affiche la première devinette
  Serial.println(devinette[NoDevinette]);

  // on attend une réponse
  lireUneReponse();

  // on comapre la réponse avec la solution
  if (!strcmp(bonneReponse[NoDevinette], message)) {
    Serial.println ("BRAVO !") ;
  } else {
    Serial.println ("DOMMAGE !") ;
  }
}

void loop() {}

dans ce code le caractère * valide l'entrée, la chaine saisie est dans le tableau message[] sans l'étoile à la fin. l'appui sur '#' efface le dernier caractère.

Merci beaucoup, je vais regarder ça et je vais essayer de corriger mon code.
Par contre je ne suis pas sur d'avoir fini ce soir, si je ne le poste pas ce soir ça sera demain. :slight_smile:

pas de soucis. j'ai tapé ça au kilomètre donc il se peut qu'il y ait des erreurs :slight_smile:

Voilà le code (désolé de le poster si tard) :confused: :

#include <Keypad.h>

const byte ROWS = 4;
const byte COLS = 4;
char keys [ROWS] [COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'},
};
byte rowPins [ROWS] = {5, 4, 3, 2};
byte colPins [COLS] = {11, 10, 9, 8};
Keypad keypad = Keypad ( makeKeymap (keys), rowPins, colPins, ROWS, COLS );

const int MAXBUFFER = 3;
char message [MAXBUFFER];

const char * devinette[] = {"2x3=?", "3x6=?", "4x7=?"} ;
const char * bonneReponse[] = {"6", "18", "28"} ;
int NoDevinette = 0 ;

void afficheReponseEnCours()
{
  // replacer par l'affichage au bon endroit du LCD avec effacement du message précédent
  Serial.print("le message est: ["); Serial.print(message); Serial.println("]");
}

void lireUneReponse()
{
  char key;
  boolean saisieEnCours = true;
  unsigned int messageIndex = 0;

  message[0] = '\0';

  while (saisieEnCours) {
    key = keypad.getKey();
    switch (key) {
      case NO_KEY: // on ne fait rien, on n'a rien reçu
        break;

      case '#': // effacer un caractère
        if (messageIndex > 0) {
          message[--messageIndex] = '\0';
          afficheReponseEnCours();
        }
        break;
      
      case '*': // valider l'entrée
        saisieEnCours = false;
        break;
      
      default:
        message[messageIndex++] = key;
        message[messageIndex] = '\0'; // pour toujours avoir un chaîne de caractère bien formée.
        afficheReponseEnCours();
        if (messageIndex >= MAXBUFFER - 1) {
          saisieEnCours = false; // l'entrée est validée car trop de caractères
        }
        break;
    } // fin du switch
  } // fin du while saisieEnCours
}


void setup() {
  Serial.begin(115200); // Mettre la console Arduino sur 115200!!
  NoDevinette = 0;

  // on affiche la première devinette
  Serial.println(devinette[NoDevinette]);

  // on attend une réponse
  lireUneReponse();

  // on comapre la réponse avec la solution
  if (!strcmp(bonneReponse[NoDevinette], message)) {
    Serial.println ("BRAVO !") ;
  } else {
    Serial.println ("DOMMAGE !") ;
  }

}

void loop() {
    int NombreDeBonnesReponses = 0 ;
  Serial.println ("2x3") ;
  afficheReponseEnCours() ;
if (!strcmp(bonneReponse[NoDevinette], message)) {
  Serial.println ("BRAVO !") ;
  NombreDeBonnesReponses = 1 ;
  NoDevinette = 1 ;
  unsigned int messageIndex = 0;
  message[0] = '\0';
  delay (2000) ;
} else {
  Serial.println ("DOMMAGE !") ;
  NoDevinette = 1 ;
  unsigned int messageIndex = 0;
  message[0] = '\0';
  delay (2000) ;
}
if (NoDevinette = 1) {
  Serial.println ("3x6") ;
  afficheReponseEnCours() ;
  if (!strcmp(bonneReponse[NoDevinette], message)) {
    Serial.println ("BRAVO !") ;
    NombreDeBonnesReponses = NombreDeBonnesReponses+1 ;
    NoDevinette = 2 ;
  unsigned int messageIndex = 0;
  message[0] = '\0';
  delay (2000) ;
  } else {
    Serial.println ("DOMMAGE !");
    NoDevinette = 2 ;
  unsigned int messageIndex = 0;
  message[0] = '\0'; 
  delay (2000) ;
  }
}
  if (NoDevinette = 2 ) {
    Serial.println ("4x7") ;
    afficheReponseEnCours() ;
    if (!strcmp(bonneReponse[NoDevinette], message)) {
      Serial.println ("BRAVO !") ;
      NombreDeBonnesReponses = NombreDeBonnesReponses+1 ;
      NoDevinette = 3 ;
  unsigned int messageIndex = 0;
  message[0] = '\0';
  delay (2000) ;
    }else{
      Serial.println ("DOMMAGE !") ;
      NoDevinette = 3 ;
      unsigned int messageIndex = 0 ;
      message[0] = '\0'; 
      delay (2000) ;
    }
  }
  if (NoDevinette = 3 ) {
    Serial.println ("BRAVO ! PRENDDS TON CADEAU !") ;
  }
}

J'ai essayé de faire de mon mieux, cependant je pense que je ne maîtrise pas encore très bien les chaines de caractères ainsi que la fonction lireUneReponse.

Bonne soirée ! :slight_smile:

Non c'est pas ça

Avez vous essayé mon code? Est-ce qu'il vous pose une seule question et attend votre réponse?

Essayez de regarder la structure à la fin du setup()

loulou24:
J'ai essayé de faire de mon mieux, cependant je pense que je ne maîtrise pas encore très bien les chaines de caractères ainsi que la fonction lireUneReponse.

OK, t'as fait de ton mieux, on demande qu'à te croire.

  • Le code compile?
  • Si non qu'elles sont les erreurs.
  • Si oui est-ce que programme tourne ou est-ce qu'il se plante?
  • Qu'elles sont les symptômes?
  • As-tu essayé de faire imprimer quelques variables sur la console avec serial pour voir ce qu'il se passe à l'exécution de ton code?

On veut bien aider mais il faut s'impliquer. Il faut apprendre à chercher les erreurs et les corriger.

fdufnews:
OK, t'as fait de ton mieux, on demande qu'à te croire.

  • Le code compile?
  • Si non qu'elles sont les erreurs.
  • Si oui est-ce que programme tourne ou est-ce qu'il se plante?
  • Qu'elles sont les symptômes?
  • As-tu essayé de faire imprimer quelques variables sur la console avec serial pour voir ce qu'il se passe à l'exécution de ton code?

On veut bien aider mais il faut s'impliquer. Il faut apprendre à chercher les erreurs et les corriger.

Ok Ok mais si je viens ici c'est parce que je suis débutant et que je suis bloqué sur mon programme, donc pour qu'on m'aide à voir où sont les erreurs et pour que l'on m'aide à les corriger !!!

J-M-L:
Non c'est pas ça

Avez vous essayé mon code? Est-ce qu'il vous pose une seule question et attend votre réponse?

Essayez de regarder la structure à la fin du setup()

Merci J-M-L pour cette réponse, j'ai testé le code et il attend bien ma réponse. Cependant il demande 2x3 et après avoir répondu (que la réponse soit bonne ou mauvaise) le reste des multiplications ne s'affiche pas.

Je vais essayer de trouver le problème

ben oui, regardez mon code à la fin du setup() est-ce que je lui demande d'afficher le quizz suivant?

  NoDevinette = 0;

  // on affiche la première devinette
  Serial.println(devinette[NoDevinette]);

  // on attend une réponse
  lireUneReponse();

  // on comapre la réponse avec la solution
  if (!strcmp(bonneReponse[NoDevinette], message)) {
    Serial.println ("BRAVO !") ;
  } else {
    Serial.println ("DOMMAGE !") ;
  }

c'était juste pour vous donner une idée de la structure de code à suivre pour proposer la devinette 0 à résoudre

bien sûr il ne faut pas mettre cela dans le setup() mais dans la boucle et ne pas le faire pour qu'une seule devinette mais pour plusieurs. donc quand l'utilisateur a trouvé (au niveau du BRAVO) il faut passer à la suivante par exemple, tester si toutes les devinettes ont été trouvées etc et au niveau du dommage, il faut prévoir soit de laisser l'utilisateur recommencer, soit lui faire perdre un point et décider par exemple que si 3 réponses sur 5 à la fin on été juste, alors ouvrir la boîte...

Merci beaucoup J-M-L,
Juste est ce que je pourrais savoir comment faire pour passer à la seconde devinette ?

Je suppose que ça commence par Serial.println(devinette[?]);

En faite plus exactement je ne sais pas quoi mettre la où j'ai mis un point d'interrogation pour passer à la seconde devinette

Merci d'avance

que pensez vous de quelque chose comme ça:

  NoDevinette = 0;

  while (NoDevinette < 3) {
    // on affiche la devinette
    Serial.println(devinette[NoDevinette]);

    // on attend une réponse
    lireUneReponse();

    // on comapre la réponse avec la solution
    if (!strcmp(bonneReponse[NoDevinette], message)) {
      Serial.println ("BRAVO !") ;
      NoDevinette++; // on passe à la devinette suivante. Si NoDevinette atteint 3 alors le while se termine
    } else {
      Serial.println ("DOMMAGE - recommence !") ; // on n'incréments pas NoDevinette, donc on représente la même devinette
    }
  }
  // ici les 3 devinettes ont été trouvées, ouvrir la boîte