Ouvrir un coffre avec une combinaison de bouton

Bonjour, pour un devoir je dois réalisé un code avec quatre leds rouge, une led verte et six boutons, tel que si j'appuie sur les boutons dans un ordre précis (j'ai choisi 4,5,3,6) je déverrouille mon coffre. A chaque fois que j'appuie sur le bon bouton une led rouge s'allume, quand les quatres sont allumés, la led verte s'allume pour montrer que le code est bon. Si l'ordre des boutons n'est pas respecté alors les leds rouges clignotes (3 fois) puis le code doit me renvoyer au début et je dois recommencer depuis le premier chiffre de la combinaison.

j'ai deux problèmes avec le code que j'ai rédigé: -la led verte est allumée en permanence.
-je ne sais pas comment faire pour que ma fonction attende que je clique sur un bouton pour passer à l'étape suivant.

Je débute sur Arduino donc mon code n'est pas très beau et je dois pouvoir le simplifier mais mon plus gros problème c'est de le faire fonctionner.

(pour qu'il soit plus court j'ai enlever une partie du code mais vue qu'il doit faire la même chose pour les leds 2, 3 et 4 je ne pense pas que ça soit un problème)

const int led1 = 13;
const int led2 = 12;
const int led3 = 11;
const int led4 = 10;
const int led5 = 9;

int etatLed1;
int etatLed2;
int etatLed3;
int etatLed4;
int etatLed5;

const int bouton1 = 7;
const int bouton2 = 6;
const int bouton3 = 5;
const int bouton4 = 4;
const int bouton5 = 3;
const int bouton6 = 2;

int etatBouton1; //variable qui enregistre l'état des boutons
int etatBouton2;
int etatBouton3;
int etatBouton4;
int etatBouton5;
int etatBouton6;

int i = 0;


void setup () {
  
  Serial.begin(9600);
  
  pinMode(led1, OUTPUT); //La led1 est déclarée comme une sortie
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  
  pinMode(bouton1, INPUT); //Le bouton1 est déclarée comme une sortie
  pinMode(bouton2, INPUT);
  pinMode(bouton3, INPUT);
  pinMode(bouton4, INPUT);
  pinMode(bouton5, INPUT);
  pinMode(bouton6, INPUT);
  
  digitalWrite(bouton1, HIGH); //Pullup interne sur le bouton
  digitalWrite(bouton2, HIGH);
  digitalWrite(bouton3, HIGH);
  digitalWrite(bouton4, HIGH);
  digitalWrite(bouton5, HIGH);
  digitalWrite(bouton6, HIGH);
  
  etatBouton1 = HIGH; //L'état du bouton1 est initialisé comme "relaché"
  etatBouton2 = HIGH;
  etatBouton3 = HIGH;
  etatBouton4 = HIGH;
  etatBouton5 = HIGH;
  etatBouton6 = HIGH;
  
  etatLed1 = LOW;
  etatLed2 = LOW;
  etatLed3 = LOW;
  etatLed4 = LOW;
  etatLed5 = LOW;
  
  
  Serial.println("Entrer le code de l'agence");
  
}
  

void loop() {
  
  while (i=0){
      if (etatBouton4 == LOW) {
        digitalWrite(led1, HIGH);
        etatLed1 = HIGH;
      }
      else {
        digitalWrite(led1, HIGH);
        digitalWrite(led2, HIGH);
        digitalWrite(led3, HIGH);
        digitalWrite(led4, HIGH);
        delay(700);
    
        digitalWrite(led1, LOW);
        digitalWrite(led2, LOW);
        digitalWrite(led3, LOW);
        digitalWrite(led4, LOW);
        delay(700);
    
        digitalWrite(led1, HIGH);
        digitalWrite(led2, HIGH);
        digitalWrite(led3, HIGH);
        digitalWrite(led4, HIGH);
        delay(700);
    
        digitalWrite(led1, LOW);
        digitalWrite(led2, LOW);
        digitalWrite(led3, LOW);
        digitalWrite(led4, LOW);
        delay(700);
    
        digitalWrite(led1, HIGH);
        digitalWrite(led2, HIGH);
        digitalWrite(led3, HIGH);
        digitalWrite(led4, HIGH);
        delay(700);
    
        digitalWrite(led1, LOW);
        digitalWrite(led2, LOW);
        digitalWrite(led3, LOW);
        digitalWrite(led4, LOW);
        delay(700);
      }
    }

  while(i=4){
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);
    digitalWrite(led5, HIGH);
    Serial.print("Niveau d'identification 1 valider");
  }
    
  
   
}

Merci beaucoup pour votre aide :slight_smile:

Cela aurait été bien d'indiquer comment sont banchés les boutons et les leds. Je suppose que les boutons sont entre les entrées et GND et que les leds sont entre VCC et les sorties avec une résistance en série.

Dans le programme la variable i n'est pas incrémentée lorsque le bon bouton est pressé. Du coup, on ne peut pas passer au chiffre suivant.

D'autre part while (i=0){ doit s'écrire while (i==0){. Avec un seul égal, c'est une affectation. i prend la valeur 0 et i=0 retourne 0 qui est compris comme faux. Cette partie n'est jamais exécutée. Les autres parties seront au contraire toujours exécutées.

A part cela, le programme décrit bien le cahier des charges. Plus tard, on pourrait mettre le clignotement en sous-programme, ce qui réduirait la longueur. Mais ce n'est pas indispensable, il y a de la place. C'est une chose à faire pour progresser en C++.

Tu aura sûrement aussi un problème avec ton while(i==4), qui restera indéfiniment dans la boucle, si tu ne modifie pas la valeur de i, dans la boucle.

En règle général, si ton programme ne fait pas du tout ce que tu attends, c'est que tu t'es planté sur les variables d'état qui définit les différentes étapes.
Dans ces cas, il est intéressant que tu affiche la valeur de tes variables à chaque étape.

Merci pour les corrections je les ai ajouté à mon code !
Malheureusement, j'ai toujours le problème car le code passe directement dans la boucle else sans attendre que je clique sur le bouton. Est-ce que déclarer les boutons comme des variables booléenne et ajouter un delay avant mon premier if pourrais m'aider à régler le problème ?

Poste ton code mis à jour.

const int led1 = 13;
const int led2 = 12;
const int led3 = 11;
const int led4 = 10;
const int led5 = 8;

int etatLed1;
int etatLed2;
int etatLed3;
int etatLed4;
int etatLed5;

const int bouton1 = 7;
const int bouton2 = 6;
const int bouton3 = 5;
const int bouton4 = 4;
const int bouton5 = 3;
const int bouton6 = 2;

int etatBouton1; //variable qui enregistre l'état des boutons
int etatBouton2;
int etatBouton3;
int etatBouton4;
int etatBouton5;
int etatBouton6;

int i = 0;


void setup () {
  
  Serial.begin(9600);
  
  pinMode(led1, OUTPUT); //La led1 est déclarée comme une sortie
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  
  pinMode(bouton1, INPUT); //Le bouton1 est déclarée comme une sortie
  pinMode(bouton2, INPUT);
  pinMode(bouton3, INPUT);
  pinMode(bouton4, INPUT);
  pinMode(bouton5, INPUT);
  pinMode(bouton6, INPUT);
  
  digitalWrite(bouton1, HIGH); //Pullup interne sur le bouton
  digitalWrite(bouton2, HIGH);
  digitalWrite(bouton3, HIGH);
  digitalWrite(bouton4, HIGH);
  digitalWrite(bouton5, HIGH);
  digitalWrite(bouton6, HIGH);
  
  etatBouton1 = HIGH; //L'état du bouton1 est initialisé comme "relaché"
  etatBouton2 = HIGH;
  etatBouton3 = HIGH;
  etatBouton4 = HIGH;
  etatBouton5 = HIGH;
  etatBouton6 = HIGH;
  
  digitalWrite(led1, HIGH); //Pullup interne sur les leds
  digitalWrite(led2, HIGH);
  digitalWrite(led3, HIGH);
  digitalWrite(led4, HIGH);
  digitalWrite(led5, HIGH);
  
  etatLed1 = HIGH;
  etatLed2 = HIGH;
  etatLed3 = HIGH;
  etatLed4 = HIGH;
  etatLed5 = HIGH;

  
  
  Serial.println("Entrer le code de l'agence");
  
}
  

void loop() {
  
  while (i==0){
    delay(1000);
      if (etatBouton4 == LOW) {
        digitalWrite(led1, HIGH);
        etatLed1 = HIGH;
        i = i+1;
      }
      else {
        digitalWrite(led1, HIGH);
        digitalWrite(led2, HIGH);
        digitalWrite(led3, HIGH);
        digitalWrite(led4, HIGH);
        delay(700);
    
        digitalWrite(led1, LOW);
        digitalWrite(led2, LOW);
        digitalWrite(led3, LOW);
        digitalWrite(led4, LOW);
        delay(700);
    
        digitalWrite(led1, HIGH);
        digitalWrite(led2, HIGH);
        digitalWrite(led3, HIGH);
        digitalWrite(led4, HIGH);
        delay(700);
    
        digitalWrite(led1, LOW);
        digitalWrite(led2, LOW);
        digitalWrite(led3, LOW);
        digitalWrite(led4, LOW);
        delay(700);
    
        digitalWrite(led1, HIGH);
        digitalWrite(led2, HIGH);
        digitalWrite(led3, HIGH);
        digitalWrite(led4, HIGH);
        delay(700);
    
        digitalWrite(led1, LOW);
        digitalWrite(led2, LOW);
        digitalWrite(led3, LOW);
        digitalWrite(led4, LOW);
        delay(700);
      }
    }
  
  while(i==4){
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);
    digitalWrite(led5, HIGH);
    Serial.print("Niveau d'identification 1 valider");
  }

J'ai posté mon code corrigé. Avec celui-ci le problème de la led verte qui restais allumé est corrigé et la variable i est initialisée correctement. Il faut encore que je trouve comment utilisé les boutons correctement et comment faire pour que le programme attende une entrée avant d'avance dans les boucles.

J'ai essayé d'initialiser les boutons comme des variables booléennes mais mon code ne prend toujours pas compte l'appui sur le bouton :frowning:
Auriez-vous des pistes pour améliorer mon code ?
Merci d'avance !

const int led1 = 13;
const int led2 = 12;
const int led3 = 11;
const int led4 = 10;
const int led5 = 8;

int etatLed1;
int etatLed2;
int etatLed3;
int etatLed4;
int etatLed5;

bool bouton1 = true;
bool bouton2 = true;
bool bouton3 = true;
bool bouton4 = true;
bool bouton5 = true;
bool bouton6 = true;

int i = 0;


void setup () {
  
  Serial.begin(9600);
  
  pinMode(led1, OUTPUT); //La led1 est déclarée comme une sortie
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  
  digitalWrite(led1, HIGH); //Pullup interne sur les leds
  digitalWrite(led2, HIGH);
  digitalWrite(led3, HIGH);
  digitalWrite(led4, HIGH);
  digitalWrite(led5, HIGH);
  
  etatLed1 = HIGH;
  etatLed2 = HIGH;
  etatLed3 = HIGH;
  etatLed4 = HIGH;
  etatLed5 = HIGH;
  
  pinMode(7, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(2, INPUT_PULLUP);
  
  
  
  Serial.println("Entrer le code de l'agence");
  
}
  

void loop() {
  
  while (i==0){
    delay(3000);
    digitalRead(bouton1);
      if (bouton4 == !bouton4) {
        digitalWrite(led1, HIGH);
        etatLed1 = HIGH;
        i = i+1;
      }
      else {
        digitalWrite(led1, HIGH);
        digitalWrite(led2, HIGH);
        digitalWrite(led3, HIGH);
        digitalWrite(led4, HIGH);
        delay(700);
    
        digitalWrite(led1, LOW);
        digitalWrite(led2, LOW);
        digitalWrite(led3, LOW);
        digitalWrite(led4, LOW);
        delay(700);
    
        digitalWrite(led1, HIGH);
        digitalWrite(led2, HIGH);
        digitalWrite(led3, HIGH);
        digitalWrite(led4, HIGH);
        delay(700);
    
        digitalWrite(led1, LOW);
        digitalWrite(led2, LOW);
        digitalWrite(led3, LOW);
        digitalWrite(led4, LOW);
        delay(700);
    
        digitalWrite(led1, HIGH);
        digitalWrite(led2, HIGH);
        digitalWrite(led3, HIGH);
        digitalWrite(led4, HIGH);
        delay(700);
    
        digitalWrite(led1, LOW);
        digitalWrite(led2, LOW);
        digitalWrite(led3, LOW);
        digitalWrite(led4, LOW);
        delay(700);
      }
    }
  

  
  while(i==4){
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);
    digitalWrite(led5, HIGH);
    Serial.print("Niveau d'identification 1 valider");
  }
    
  
   
}
 

ceci ne sert absolument à rien... le résultat de la lecture est mis aux oubliettes ?


La réponse de ce test est forcément "faux", un booléen ne peut pas être égal à son contraire...


jolie boucle infinie, i ne variant pas au sein de la boucle on est sûr si on rentre dedans de rester coincé...

  while(i==4){
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);
    digitalWrite(led5, HIGH);
    Serial.print("Niveau d'identification 1 valider");
  }

J'ai ajouté i=i+1 à la fin de la dernière boucle while, est-ce que cela fixe le problème ?

Pour vos autres remarques, auriez-vous des indications sur comment je peux utilisé correctement les variables booléennes ? Ou est ce que le code que j'ai écrit précédemment (où les boutons ne sont pas des variables booléennes mais des entiers) répond mieux a mon problème ?

Si bouton = true, que pense tu que la fonction digitalRead fasse?
Dit autrement comment la fonction peut savoir qu'il faut quel regarde la broche 7 pour connaitre l'état du bouton1.

De même si tu commence par un delay(3000) c'est à dire que tu mettes ton programme en pause pendant 3s, comment ton programme peut savoir sur quel bouton tu as appuyé pendant qu'il était en pause?

Donc enlève se delay, affecte à tes variable boutonX, le numéro de la broche sur laquelle ils sont raccordé.
Je me répète, utilise des Serial.print, pour afficher l'état de tes variables, lorsque l'on est débutant on ne peut pas programmer les yeux fermer.

la variable i est assez mal nommée, "i" ne signifie rien, il faudrait lui donner un nom plus utile, par exemple nombreDeTouchesBonnes par exemple.

léger problème d'algorithme: si on n'appuie pas sur une touche, il ne doit rien se passer. Ce n'est que si on appuie sur une touche que l'on doit faire quelque chose (passer au suivant ou signaler une erreur)

Petite question: l'erreur de code doit-elle être signalée immédiatement ou ne l'être que lorsque l'on a fini d'enter les 4 chiffres? Je m'explique: avec l'algorithme actuel un utilisateur va:
− appuyer sur le 1 (signalement d'erreur)
− appuyer sur le 2 (signalement d'erreur)
− appuyer sur le 3 (signalement d'erreur)
− appuyer sur le 4 (pas de signalement d'erreur)
--> on sait que le code commence par 4
− appuyer sur le 1 (signalement d'erreur)
− appuyer sur le 4 puis 2 (signalement d'erreur)
− appuyer sur le 4 puis 3 (signalement d'erreur)
− appuyer sur le 4 puis 4 (signalement d'erreur)
− appuyer sur le 4 puis 5 (pas de signalement d'erreur)
--> on sait que le code commence par 45
− appuyer sur le 1 (signalement d'erreur)
− appuyer sur le 4 puis 5 puis 1 (signalement d'erreur)
− appuyer sur le 4 puis 5 puis 2 (pas de signalement d'erreur)
--> on sait que le code commence par 452
− appuyer sur le 1 (signalement d'erreur)
− appuyer sur le 4 puis 5 puis 2 puis 1 (signalement d'erreur)
− appuyer sur le 4 puis 5 puis 2 puis 2 (signalement d'erreur)
− appuyer sur le 4 puis 5 puis 2 puis 3 (signalement d'erreur)
− appuyer sur le 4 puis 5 puis 2 puis 4 (signalement d'erreur)
− appuyer sur le 4 puis 5 puis 2 puis 5 (signalement d'erreur)
− appuyer sur le 4 puis 5 puis 2 puis 6 -> le code est bon
Pour l'instant, on va rester sur l'algorithme proposé.

 



  Je reprends la première version qui était finalement meilleure:
  etatBouton4 = HIGH;

...

void loop() {
  
  while (i=0){
      if (etatBouton4 == LOW) {
        digitalWrite(led1, HIGH);
        etatLed1 = HIGH;
      }
      else {

Avec le == et le i=i+1; (qui au passage s'écrit souvent i++;), le code devient:

  etatBouton4 = HIGH;

...

void loop() {
  
  while (i==0){
      if (etatBouton4 == LOW) {
        digitalWrite(led1, HIGH);
        etatLed1 = HIGH;
        i = i+1;
      }
      else {

Que faire du digitalRead(bouton1); qui manquait? Il faut bien lire l'état du bouton. Mais ce n'est pas l'état du bouton1 qui nous intéresse, c'est celui du bouton4! et ceci va permettre de mettre à jour la variable etatBouton4 dont on a besoin pour le test. Donc avant de tester

 if (etatBouton4 == LOW) { 

il faut mettre à jour etatBouton4 par

etatBouton4 = digitalRead(bouton4);

Cela ferait environ:

  etatBouton4 = HIGH;

...

void loop() {
  
  while (i==0){
      etatBouton4 = digitalRead(bouton4);
      if (etatBouton4 == LOW) {
        digitalWrite(led1, HIGH);
        etatLed1 = HIGH;
        i = i+1;
      }
      else {

Mais il y a un petit problème d'algorithme: ce n'est pas si le bouton est appuyé ou pas que l'on doit dire c'est bon ou pas, mais quand un bouton quelconque est appuyé.
Au lieu de
    tant que aucun chiffre n'est bon (i==0):
       si on appuie sur le 4 c'est bon
        sinon c'est mauvais
il faut:
    tant que aucun chiffre n'est bon (i==0):
       si on appuie sur un bouton
              si on appuie sur le 4 c'est bon
               sinon c'est mauvais
        sinon rien

On va être obligé de lire l'état de tous les boutons pour tester su un bouton est appuyé ou pas, genre

if( (etatBouton1 == LOW)  ||etatBouton2 == LOW)  ||etatBouton3 == LOW)  || (etatBouton4 == LOW) || (etatBouton5 == LOW)  || (etatBouton6 == LOW)) {

puis après seulement tester si c'est le bouton4 ou pas.

Que cela fonctionne ou pas, il faut redonner le code complet corrigé pour que l'on sache parfaitement où on en est. Il serait bon aussi d'avoir le câblage réalisé.

Merci beaucoup de votre réponse !
Effectivement l'erreur doit être signalée immédiatement dès qu'un chiffre est faux. (juste une petite précision le code est 4536 et pas 4526 mais bon c'est pas hyper important ici).

J'ai mis en pièce jointe une photo de mon montage.

Je vous met le code mis a jour dans lequel j'ai modifié: -le nom de la variable i
-simplifier avec une boule while le clignotement des leds quand le code est faux
-j'ai essayé d'ajouter des corrections par rapport à vos indications et j'ai essayé d'utilisé Serial.print.

// La led1 est connecté à la broche 13 de la carte Arduino
const int led1 = 13;
const int led2 = 12;
const int led3 = 11;
const int led4 = 10;
const int led5 = 8;

int etatLed1;
int etatLed2;
int etatLed3;
int etatLed4;
int etatLed5;

const int bouton1 = 7;
const int bouton2 = 6;
const int bouton3 = 5;
const int bouton4 = 4;
const int bouton5 = 3;
const int bouton6 = 2;

int etatBouton1; //variable qui enregistre l'état des boutons
int etatBouton2;
int etatBouton3;
int etatBouton4;
int etatBouton5;
int etatBouton6;

int nombreDeToucheCorrecte = 0;
int a = 0;
int b = 0;
int c = 0;
int d = 0;


void setup () {
  
  Serial.begin(9600);
  
  pinMode(led1, OUTPUT); //La led1 est déclarée comme une sortie
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  
  digitalWrite(led1, HIGH); //Pullup interne sur les leds
  digitalWrite(led2, HIGH);
  digitalWrite(led3, HIGH);
  digitalWrite(led4, HIGH);
  digitalWrite(led5, HIGH);
  
  etatLed1 = HIGH;
  etatLed2 = HIGH;
  etatLed3 = HIGH;
  etatLed4 = HIGH;
  etatLed5 = HIGH;
  
  pinMode(bouton1, INPUT); //Le bouton1 est déclarée comme une sortie
  pinMode(bouton2, INPUT);
  pinMode(bouton3, INPUT);
  pinMode(bouton4, INPUT);
  pinMode(bouton5, INPUT);
  pinMode(bouton6, INPUT);
  
  digitalWrite(bouton1, HIGH); //Pullup interne sur le bouton
  digitalWrite(bouton2, HIGH);
  digitalWrite(bouton3, HIGH);
  digitalWrite(bouton4, HIGH);
  digitalWrite(bouton5, HIGH);
  digitalWrite(bouton6, HIGH);
  
  etatBouton1 = HIGH; //L'état du bouton1 est initialisé comme "relaché"
  etatBouton2 = HIGH;
  etatBouton3 = HIGH;
  etatBouton4 = HIGH;
  etatBouton5 = HIGH;
  etatBouton6 = HIGH;
    
  Serial.println("Entrer le code de l'agence");
  
}
  

void loop() {
  
  Serial.println(etatBouton4);
  
  while (nombreDeToucheCorrecte==0){
    
    etatBouton1 = digitalRead(bouton1);
    etatBouton2 = digitalRead(bouton2);
    etatBouton3 = digitalRead(bouton4);
    etatBouton4 = digitalRead(bouton4);
    etatBouton5 = digitalRead(bouton5);
    etatBouton6 = digitalRead(bouton6);
    
    Serial.print(digitalRead(bouton4));
   
    if ((etatBouton1 == LOW)  || (etatBouton2 == LOW)  || (etatBouton3 == LOW)  || (etatBouton4 == LOW) || (etatBouton5 == LOW)  || (etatBouton6 == LOW)) {
      if (bouton4 == LOW) {
        digitalWrite(led1, HIGH);
        etatLed1 = HIGH;
        nombreDeToucheCorrecte = nombreDeToucheCorrecte+1;
        Serial.println("Etape Suivante");
      } else {
        while(a<=3){
          Serial.println("Erreur d'identhification");
          digitalWrite(led1, LOW);
          digitalWrite(led2, LOW);
          digitalWrite(led3, LOW);
          digitalWrite(led4, LOW);
          delay(700);
          
          digitalWrite(led1, HIGH);
          digitalWrite(led2, HIGH);
          digitalWrite(led3, HIGH);
          digitalWrite(led4, HIGH);
          delay(700);
          a=a+1;
        }
      }
    }
  }
    while(nombreDeToucheCorrecte==4){
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);
    digitalWrite(led5, HIGH);
    Serial.print("Niveau d'identification 1 valider");
    nombreDeToucheCorrecte = nombreDeToucheCorrecte+1;
  }
    
  
   
}

Grâce aux Serial.print je vois que je reste bloqué dans ma boucle while mais je ne sais pas quelles instcutions je peux ajouter pour en sortir.

ben c'est pas malin car c'est hyper simple de découvrir le code... Quand vous voulez protéger quelque chose, il ne faut pas donner d'indices vous laissez faire la saisie du code et sur la base soit de la longueur, soit d'une touche de validation, vous comparez ce qui a été proposé avec le code connu et seulement là vous dites OK ou pas.


ceci ne mets pas un pullup. ça met la broche à HIGH

  pinMode(led1, OUTPUT); //La led1 est déclarée comme une sortie
  digitalWrite(led1, HIGH); //Pullup interne sur les leds

telles qu'elles sont câblées vos LEDs sont alimentées et en mettant leur broche à HIGH il y a le "même" potentiel des deux côtés donc elles ne s'allument pas. en mettant la pin à LOW (GND) vous créez le circuit Vcc -- LED --- R ---- GND qui fait que la LED s'allume.

généralement on câble dans l'autre sens. Pin --- R --- LED --- GND et quand on met la pin à HIGH on allume.


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

Je suis d’accord mais bon ça fait partie des consignes que je dois respecter.

Je vais regarder ce que vous m'avez envoyer merci :slight_smile:

Je viens de voir que mes boutons n'étaient pas branchés correctement. Une fois corrigé je ne suis plus coincé dans la boucle while mais le code ne prend toujours pas en compte l'appuie sur le bouton 4. (les leds clignotent que j'appuie sur le bouton 4 ou non).

essayez un truc comme cela

j'ai mis des tableaux pour simplifier le code

pas bouton4 == LOW mais etatBouton4 == LOW

C'est mieux du coté des prints sur le port séries.
si tu veux aller plus loin, tu peux transformer ça
Serial.println("Etape Suivante");
en

Serial.print("Etape Suivante ");Serial.println(nombreDeToucheCorrecte, DEC);

Le DEC pour afficher en décimal est inutile, c’est le comportement par défaut