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;
}
}
}