Have been working on a Button Menu for a while now and can't break thru to the 3rd level, which in theory would give access to levels 4/5/6/etc. It's layed out long hand, I'll neaten the code up after its working. Could you pls have a look and see if you can access level 3.... Also if there is an alternative for multi level menus, happy to look at those also, just after something that works, have tried dozens that i have found on the web.....either no sketch with the video(how i hate that) or sketch just doesn't work period. Thanks in advance Doug
/*
Description : Simple Menu function on LCD
Button Function:
Up/Down - change Menu Page
Select - enter page
Left - Exit
Link: http://youtu.be/cMqif5ICS5M
+++++++++++++++++++++++++++++++++++++++++++++++++++*/
*/
#include <LiquidCrystal_I2C.h> //from newliquidcrystal library
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address
int keypad_pin = A0;
int keypad_value = 0;
int keypad_value_old = 0;
bool menu2 = false;
char btn_push;
int selection1 = 0;
int selection2 = 0;
int mainMenuPage = 1;
int mainMenuPageOld = 1;
int mainMenuTotal = 4;
int levelMenuPage = 1;
int levelMenuPageOld = 1;
int levelMenuTotal = 4;
void setup()
{
Serial.begin(9600);
lcd.begin(20, 4); //Initialize a 2x16 type LCD
MainMenuDisplay();
delay(1000);
}
void loop()
{
MainmenuBtn();
if((btn_push == 'S')&&(menu2 == false))//enter selected menu
{
Serial.println("i'm here");
WaitBtnRelease();
switch (mainMenuPage)
{
case 1:
MenuA();
break;
case 2:
MenuB();
break;
case 3:
MenuC();
break;
case 4:
MenuD();
break;
}
MainMenuDisplay();
WaitBtnRelease();
}
else
{
if((btn_push == 'S')&&(menu2 == true))//enter selected menu
{
LevelmenuBtn();
WaitBtnRelease();
switch (levelMenuPage)
{
case 1:
MenuA2();
break;
case 2:
MenuB2();
break;
case 3:
MenuC2();
break;
case 4:
MenuD2();
break;
}
LevelMenuDisplay();
WaitBtnRelease();
}
delay(10);
}
}
//--------------- End of loop() loop ---------------------
void MainmenuBtn()
{
btn_push = ReadKeypad();
WaitBtnRelease();
if(btn_push == 'U')
{
mainMenuPage++;
if(mainMenuPage > mainMenuTotal)
mainMenuPage = 1;
Serial.println(mainMenuPage);
}
else if(btn_push == 'D')
{
mainMenuPage--;
Serial.print(mainMenuPage);
if(mainMenuPage == 0)
mainMenuPage = mainMenuTotal;
Serial.println(mainMenuPage);
}
if(mainMenuPage != mainMenuPageOld) //only update display when page change
{
MainMenuDisplay();
mainMenuPageOld = mainMenuPage;
}
}
void LevelmenuBtn()
{
btn_push = ReadKeypad();
WaitBtnRelease();
if(btn_push == 'U')
{
mainMenuPage++;
if(levelMenuPage > levelMenuTotal)
levelMenuPage = 1;
Serial.println(levelMenuPage);
}
else if(btn_push == 'D')
{
levelMenuPage--;
Serial.print(levelMenuPage);
if(levelMenuPage == 0)
levelMenuPage = levelMenuTotal;
Serial.println(levelMenuPage);
}
if(levelMenuPage != levelMenuPageOld) //only update display when page change
{
LevelMenuDisplay();
levelMenuPageOld = levelMenuPage;
}
}
void MainMenuDisplay()
{
lcd.clear();
lcd.setCursor(0,0);
switch (mainMenuPage)
{
case 1:
lcd.print("1. Menu A");
break;
case 2:
lcd.print("2. Menu B");
break;
case 3:
lcd.print("3. Menu C");
break;
case 4:
lcd.print("4. Menu D");
break;
}
}
void LevelMenuDisplay()
{
lcd.clear();
lcd.setCursor(0,0);
switch (levelMenuPage)
{
case 1:
lcd.print("1. Menu A2");
break;
case 2:
lcd.print("2. Menu B2");
break;
case 3:
lcd.print("3. Menu C2");
break;
case 4:
lcd.print("4. Menu D2");
break;
}
}
void MenuA()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Inside Menu A");
menu2 = true;
while(ReadKeypad()!= 'N')
{
//Insert Task for Menu A here
selection1=1;
Serial.print("Selection1=");
Serial.println(selection1);
}
}
void MenuA2()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Inside Menu A2");
menu2 = false;
while(ReadKeypad()!= 'N')
{
//Insert Task for Menu A here
selection2=1;
Serial.print("Selection2=");
Serial.println(selection2);
}
}
void MenuB()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Inside Menu B");
menu2 = true;
while(ReadKeypad()!= 'N')
{
//Insert Task for Menu B here
selection1=2;
Serial.print("Selection1=");
Serial.println(selection1);
}
}
void MenuB2()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Inside Menu B2");
menu2 = false;
while(ReadKeypad()!= 'N')
{
//Insert Task for Menu B here
selection2=2;
Serial.print("Selection2=");
Serial.println(selection2);
}
}
void MenuC()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Inside Menu C");
menu2 = true;
while(ReadKeypad()!= 'N')
{
//Insert Task for Menu C here
selection1=3;
Serial.print("Selection1=");
Serial.println(selection1);
}
}
void MenuC2()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Inside Menu C2");
menu2 = false;
while(ReadKeypad()!= 'N')
{
//Insert Task for Menu C here
selection2=3;
Serial.print("Selection2=");
Serial.println(selection2);
}
}
void MenuD()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Inside Menu D");
menu2 = true;
while(ReadKeypad()!= 'N')
{
//Insert Task for Menu D here
selection1=4;
Serial.print("Selection1=");
Serial.println(selection1);
}
}
void MenuD2()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Inside Menu D2");
menu2 = false;
while(ReadKeypad()!= 'N')
{
//Insert Task for Menu D here
selection2=4;
Serial.print("Selection2=");
Serial.println(selection2);
}
}
char ReadKeypad()
{
/* Keypad button analog Value
no button pressed 1023
nul <450
select <400
left <350
down <290
up <190
right <50
*/
keypad_value = analogRead(keypad_pin);
if(keypad_value < 50)
return 'R';
else if(keypad_value < 190)
return 'U';
else if(keypad_value < 290)
return 'D';
else if(keypad_value < 350)
return 'L';
else if(keypad_value < 400)
return 'S';
else if(keypad_value < 450)
return 'N';
}
void WaitBtnRelease()
{
while( analogRead(keypad_pin) < 600){}
}