problème de mot de passe menu

Bonjour, j'ai un problème au niveau du code, je veux faire en sorte que aprés avoir selectionner le menu settings l'arduino demande un mot de passe : si c'et bon il affiche le sous menu sinon il redemande le mot de passe.

vous pouvez m'aidez et me donner une piste ,voici mon programme:

#include<SPI.h>
#include <LiquidCrystal.h>

#include<Keypad.h>

#include "Menu.h"

#define passwordLength 5

char data[passwordLength];
char master[passwordLength] = "1234";
byte dataCount = 0, masterCount = 0;
char customKey;
bool passIsGood;

const byte ROWS = 4;
const byte COLS = 3;

char keys[ROWS][COLS] ={
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

byte rowPins[ROWS] = {8,7,6,5};
byte colPins[COLS] = {4,3,2};

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

static LiquidCrystal lcd(9);

void doMainMenuAction(byte selectedMenuItem);
void doSettingsMenuAction(byte selectedMenuItem);

static const char* MAIN_MENU_ITEMS[]={
  "Begin Dosing",
  "Advance/Reverse",
  "Settings"
};

static const Menu_t MAIN_MENU={
  "Your Choice ?",
  MAIN_MENU_ITEMS,
  3,
  &doMainMenuAction
};

static const char* SETTINGS_MENU_ITEMS[]={
  "Edit <STEPS> ",
  "Edit <SPEED> ",
  "Add Reference"
};

static const Menu_t SETTINGS_MENU={
  "Your Choice ?",
  SETTINGS_MENU_ITEMS,
  3,
  &doSettingsMenuAction
};

void setup() {
  // put your setup code here, to run once:
lcd.begin(16,2);
}

void loop() {
  // put your main code here, to run repeatedly:
displayMenu(MAIN_MENU);
lcd.clear();
lcd.print(F("------END-------"));
delay (2000);
}

Button_t readPushButton(void){
  unsigned int val =analogRead(0);
  if (val >1000) return BP_NONE;
  if (val <50) return BP_RIGHT;
  if (val <195) return BP_UP;
  if (val <380) return BP_DOWN;
  if (val <555) return BP_LEFT;
  if (val <790) return BP_SELECT;
  return BP_NONE;
}

void doMainMenuAction(byte selectedMenuItem){
  if (selectedMenuItem == 2){
    displayMenu(SETTINGS_MENU);
  }
  else{
    displayChoice(selectedMenuItem,MAIN_MENU_ITEMS);
  }
}

void doSettingsMenuAction(byte selectedMenuItem){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Enter Password:");

  customKey = customKeypad.getKey();
  if (customKey){
    data[dataCount] = customKey; 
    lcd.setCursor(dataCount,1); 
    lcd.print(data[dataCount]); 
    dataCount++; 
    }

  if(dataCount == passwordLength-1){
    lcd.clear();
    if(!strcmp(data, master)){
      lcd.print("Valid");
      passIsGood=true;
      }
    else{
      lcd.print("Incorrect");
      passIsGood =false;
      delay(1000);
      }
    
    lcd.clear();
    clearData();  
  }
  displayChoice(selectedMenuItem,SETTINGS_MENU_ITEMS);
}

void displayChoice(byte selectedMenuItem,const char** items){
  lcd.clear();
  lcd.print(F("CHOIX"));
  lcd.setCursor(0,1);
  lcd.print(items[selectedMenuItem]);
  byte buttonPressed;

  do {
    buttonPressed=readPushButton();
  }
  while (buttonPressed!=BP_LEFT && buttonPressed!=BP_SELECT);
}

void displayMenu (const Menu_t &menu){
  byte selectedMenuItem =0;
  byte shouldExitMenu =false;
  Button_t buttonPressed;

  while (!shouldExitMenu){
    lcd.clear();
    lcd.print(menu.prompt);
    lcd.setCursor(0,1);
    lcd.print(menu.items[selectedMenuItem]);

    while (readPushButton() != BP_NONE);
    while ((buttonPressed =readPushButton()) == BP_NONE);
    delay(30);
    while (readPushButton()!=BP_NONE);
    switch (buttonPressed){
      case BP_UP:
      if (selectedMenuItem >0){
        selectedMenuItem--;
      }
      break;

      case BP_DOWN:
      if (selectedMenuItem <menu.nbItems-1){
        selectedMenuItem++;
      }
      break;

      case BP_LEFT:
      shouldExitMenu = true;
      break;

      case BP_SELECT:
      case BP_RIGHT:
      menu.callBackFnct(selectedMenuItem);
      break;
    }
  }
}

Le code n'est pas simple. Je pense que c'est ici qu'il faut ajouter une demande de mot de passe :

void doMainMenuAction(byte selectedMenuItem){
  if (selectedMenuItem == 2){

    demandeMotDePasse ();  // <-- ICI
 
    displayMenu(SETTINGS_MENU);
  }
  else{
    displayChoice(selectedMenuItem,MAIN_MENU_ITEMS);
  }
}

Il faut créer une fonction, par exemple demandeMotDePasse () qui va demander le mot de passe. Tu dois pouvoir trouver ça sur Internet si tu ne veux pas l'écrire toi-même.

j'ai mis une fonction mot de passe qui marche en dehors du programme mais si je la met dans mon programme principale : c'est comme si elle n'existe pas
voici le code avec la fonction mot de passe qui est "passwordEntry"

#include<SPI.h>
#include <LiquidCrystal.h>

#include<Keypad.h>

#include "Menu.h"

#define passwordLength 5

char data[passwordLength];
char master[passwordLength] = "1234";
byte dataCount = 0, masterCount = 0;
char customKey;
bool passIsGood;

const byte ROWS = 4;
const byte COLS = 3;

char keys[ROWS][COLS] ={
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

byte rowPins[ROWS] = {8,7,6,5};
byte colPins[COLS] = {4,3,2};

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

static LiquidCrystal lcd(9);

void doMainMenuAction(byte selectedMenuItem);
void doSettingsMenuAction(byte selectedMenuItem);

static const char* MAIN_MENU_ITEMS[]={
  "Begin Dosing",
  "Advance/Reverse",
  "Settings"
};

static const Menu_t MAIN_MENU={
  "Your Choice ?",
  MAIN_MENU_ITEMS,
  3,
  &doMainMenuAction
};

static const char* SETTINGS_MENU_ITEMS[]={
  "Edit <STEPS> ",
  "Edit <SPEED> ",
  "Add Reference"
};

static const Menu_t SETTINGS_MENU={
  "Your Choice ?",
  SETTINGS_MENU_ITEMS,
  3,
  &doSettingsMenuAction
};

void setup() {
  // put your setup code here, to run once:
lcd.begin(16,2);
}

void loop() {
  // put your main code here, to run repeatedly:
displayMenu(MAIN_MENU);
lcd.clear();
lcd.print(F("------END-------"));
delay (2000);
}

Button_t readPushButton(void){
  unsigned int val =analogRead(0);
  if (val >1000) return BP_NONE;
  if (val <50) return BP_RIGHT;
  if (val <195) return BP_UP;
  if (val <380) return BP_DOWN;
  if (val <555) return BP_LEFT;
  if (val <790) return BP_SELECT;
  return BP_NONE;
}

void doMainMenuAction(byte selectedMenuItem){
  if (selectedMenuItem == 2){
    passwordEntry();
    displayMenu(SETTINGS_MENU);
  }
  else{
    displayChoice(selectedMenuItem,MAIN_MENU_ITEMS);
  }
}

void doSettingsMenuAction(byte selectedMenuItem){
  displayChoice(selectedMenuItem,SETTINGS_MENU_ITEMS);
}

void displayChoice(byte selectedMenuItem,const char** items){
  lcd.clear();
  lcd.print(F("CHOIX"));
  lcd.setCursor(0,1);
  lcd.print(items[selectedMenuItem]);
  byte buttonPressed;

  do {
    buttonPressed=readPushButton();
  }
  while (buttonPressed!=BP_LEFT && buttonPressed!=BP_SELECT);
}

void displayMenu (const Menu_t &menu){
  byte selectedMenuItem =0;
  byte shouldExitMenu =false;
  Button_t buttonPressed;

  while (!shouldExitMenu){
    lcd.clear();
    lcd.print(menu.prompt);
    lcd.setCursor(0,1);
    lcd.print(menu.items[selectedMenuItem]);

    while (readPushButton() != BP_NONE);
    while ((buttonPressed =readPushButton()) == BP_NONE);
    delay(30);
    while (readPushButton()!=BP_NONE);
    switch (buttonPressed){
      case BP_UP:
      if (selectedMenuItem >0){
        selectedMenuItem--;
      }
      break;

      case BP_DOWN:
      if (selectedMenuItem <menu.nbItems-1){
        selectedMenuItem++;
      }
      break;

      case BP_LEFT:
      shouldExitMenu = true;
      break;

      case BP_SELECT:
      case BP_RIGHT:
      menu.callBackFnct(selectedMenuItem);
      break;
    }
  }
}

void passwordEntry(){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Enter Password:");

  customKey = customKeypad.getKey();
  if (customKey){
    data[dataCount] = customKey; 
    lcd.setCursor(dataCount,1); 
    lcd.print(data[dataCount]); 
    dataCount++; 
    }

  if(dataCount == passwordLength-1){
    lcd.clear();
    if(!strcmp(data, master)){
      lcd.print("Valid");
      passIsGood =true;
      }
    else{
      lcd.print("Incorrect");
      passIsGood =false;
      delay(1000);
      }
    
    lcd.clear();
    clearData();  
  }
}

void clearData(){
  while(dataCount !=0){
    data[dataCount--] = 0; 
  }
  return;
}

Je dirais qu'il faut l'appeler comme ceci :
  while (!passIsGood) passwordEntry();et initialise dans l'entête :

bool passIsGood = false;

Ça a marché en quelque sorte, il me demande le mot de passe qu'une seule fois, je dois appuyer sur reset pour qu'il me redemande le mot de passe.

et il'ya comme un bug d'affichage: je ne sais pas à quoi il est du je ne vois pas les chiffre que j'entre avec le keypad

sef13:
Ça a marché en quelque sorte, il me demande le mot de passe qu'une seule fois, je dois appuyer sur reset pour qu'il me redemande le mot de passe.

Alors tu ajoutes
passIsGood = false;après la ligne

while (!passIsGood) passwordEntry();

L'affichage du mot de passe se fait ici ?

  customKey = customKeypad.getKey();
  if (customKey){
    data[dataCount] = customKey; 
    lcd.setCursor(dataCount,1); 
    lcd.print(data[dataCount]); 
    dataCount++; 
    }

Essaye de vérifier la valeur de dataCount :

  customKey = customKeypad.getKey();
  if (customKey){
    data[dataCount] = customKey; 
    lcd.setCursor(dataCount,1); 
    Serial.println(dataCount); // <--- 
    Serial.println(data[dataCount]); // <--- 
    lcd.print(data[dataCount]); 
    dataCount++; 
    }

c'est réglé maintenant il me demande le mot de passe à chaque fois,

pour le deuxième problème il persiste :

j'ai vérifié avec le Serial les valeurs sont justes, la fonction passwordEntry fonctionne très bien comme je l'ai dit en dehors du programme principale

Tu peux copier ce qui apparaît sur la console ? Un code qui marche puis ne marche plus lorsqu'il est intégré dans un autre, ça fait penser à un dépassement de tableau : c'est dur à trouver...

voice les valeurs qui me sont apparus

Capture.JPG