Hi
I have some problem with geting my code to work after a changed my LCD from a 16x2 to a 20x4 with I2C inteface.
If i try the sample code below the new LCD works:
#include <Wire.h> #include <LCD.h> #include <LiquidCrystal_I2C.h> #define I2C_ADDR 0x3F #define BACKLIGHT_PIN 3 #define En_pin 2 #define Rw_pin 1 #define Rs_pin 0 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7 int n = 1; LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin); void setup() { lcd.begin (20,4); // <<----- My LCD was 16x2 // Switch on the backlight lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.home (); // go home lcd.print("SainSmartI2C16x2"); } void loop() { // Backlight on/off every 3 seconds lcd.setCursor (0,1); // go to start of 2nd line lcd.print(n++,DEC); lcd.setBacklight(LOW); // Backlight off delay(3000); lcd.setBacklight(HIGH); // Backlight on delay(3000); }
But when I try to do it with my own code I just got 2 rows with "#"
I use this library:
LiquidCrystal_V1.2.1 - https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
MenuBackEnd V1.4 - http://www.arduino.cc/playground/uploads/Profiles/MenuBackend_1-4.zip
Here is my code that I can't get to work.
#include <Wire.h> #include <LCD.h> #include <LiquidCrystal_I2C.h> #include <MenuBackend.h> #define I2C_ADDR 0x3F #define BACKLIGHT_PIN 3 #define En_pin 2 #define Rw_pin 1 #define Rs_pin 0 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7 const int buttonPinLeft = 8; // pin for the Up button const int buttonPinRight = 9; // pin for the Down button const int buttonPinEsc = 10; // pin for the Esc button const int buttonPinEnter = 11; // pin for the Enter button int lastButtonPushed = 0; int lastButtonEnterState = LOW; // the previous reading from the Enter input pin int lastButtonEscState = LOW; // the previous reading from the Esc input pin int lastButtonLeftState = LOW; // the previous reading from the Left input pin int lastButtonRightState = LOW; // the previous reading from the Right input pin long lastEnterDebounceTime = 0; // the last time the output pin was toggled long lastEscDebounceTime = 0; // the last time the output pin was toggled long lastLeftDebounceTime = 0; // the last time the output pin was toggled long lastRightDebounceTime = 0; // the last time the output pin was toggled long debounceDelay = 500; // the debounce time int Motor1=1; int Motor2=0; int Backlight=255; String CWCCW, CWCCW2, TPD, TPD2; LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin); //Menu variables MenuBackend menu = MenuBackend(menuUsed,menuChanged); //initialize menuitems MenuItem Item1 = MenuItem("Item1"); //Motor 1 Settings MenuItem Item1Sub1 = MenuItem("Item1Sub1"); //TPD MenuItem Item1Sub1Sub1 = MenuItem("Item1Sub1Sub1"); //650 MenuItem Item1Sub1Sub2 = MenuItem("Item1Sub1Sub2"); //750 MenuItem Item1Sub1Sub3 = MenuItem("Item1Sub1Sub3"); //850 MenuItem Item1Sub1Sub4 = MenuItem("Item1Sub1Sub4"); //950 MenuItem Item1Sub2 = MenuItem("Item1Sub2"); MenuItem Item1Sub2Sub1 = MenuItem("Item1Sub2Sub1"); //CW MenuItem Item1Sub2Sub2 = MenuItem("Item1Sub2Sub2"); //CCW MenuItem Item1Sub2Sub3 = MenuItem("Item1Sub2Sub3"); //Both MenuItem Item1Sub3 = MenuItem("Item1Sub3"); MenuItem Item1Sub3Sub1 = MenuItem("Item1Sub3Sub1"); //Stop MenuItem Item1Sub3Sub2 = MenuItem("Item1Sub3Sub2"); //Start MenuItem Item2 = MenuItem("Item2"); //Motor 2 Settings MenuItem Item2Sub1 = MenuItem("Item2Sub1"); //TPD MenuItem Item2Sub1Sub1 = MenuItem("Item2Sub1Sub1"); //650 MenuItem Item2Sub1Sub2 = MenuItem("Item2Sub1Sub2"); //750 MenuItem Item2Sub1Sub3 = MenuItem("Item2Sub1Sub3"); //850 MenuItem Item2Sub1Sub4 = MenuItem("Item2Sub1Sub4"); //950 MenuItem Item2Sub2 = MenuItem("Item2Sub2"); MenuItem Item2Sub2Sub1 = MenuItem("Item2Sub2Sub1"); //CW MenuItem Item2Sub2Sub2 = MenuItem("Item2Sub2Sub2"); //CCW MenuItem Item2Sub2Sub3 = MenuItem("Item2Sub2Sub3"); //Both MenuItem Item2Sub3 = MenuItem("Item2Sub3"); MenuItem Item2Sub3Sub1 = MenuItem("Item2Sub3Sub1"); //Stop MenuItem Item2Sub3Sub2 = MenuItem("Item2Sub3Sub2"); //Start MenuItem Item3 = MenuItem("Item3"); //Backlight MenuItem Item3Sub1 = MenuItem("Item3Sub1"); //25% MenuItem Item3Sub2 = MenuItem("Item3Sub2"); //50% MenuItem Item3Sub3 = MenuItem("Item3Sub3"); //75% MenuItem Item3Sub4 = MenuItem("Item3Sub4"); //100% void setup() { lcd.begin (20,4); // <<----- My LCD was 16x2 // Switch on the backlight lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.home (); // go home lcd.print("SainSmart"); CWCCW = String("Both"); CWCCW2 = String(" CCW"); TPD = String("650"); TPD2 = String("850"); pinMode(buttonPinLeft, INPUT); pinMode(buttonPinRight, INPUT); pinMode(buttonPinEnter, INPUT); pinMode(buttonPinEsc, INPUT); //configure menu menu.getRoot().add(Item1); Item1.addRight(Item2).addRight(Item3); Item1.add(Item1Sub1).addRight(Item1Sub2).addRight(Item1Sub3); //Motor 1 Settings Item1Sub1.add(Item1Sub1Sub1).addRight(Item1Sub1Sub2).addRight(Item1Sub1Sub3).addRight(Item1Sub1Sub4); Item1Sub2.add(Item1Sub2Sub1).addRight(Item1Sub2Sub2).addRight(Item1Sub2Sub3); Item1Sub3.add(Item1Sub3Sub1).addRight(Item1Sub3Sub2); Item2.add(Item2Sub1).addRight(Item2Sub2).addRight(Item2Sub3); //Motor 2 Settings Item2Sub1.add(Item2Sub1Sub1).addRight(Item2Sub1Sub2).addRight(Item2Sub1Sub3).addRight(Item2Sub1Sub4); Item2Sub2.add(Item2Sub2Sub1).addRight(Item2Sub2Sub2).addRight(Item2Sub2Sub3); Item2Sub3.add(Item2Sub3Sub1).addRight(Item2Sub3Sub2); Item3.add(Item3Sub1).addRight(Item3Sub2).addRight(Item3Sub3).addRight(Item3Sub4); //Backlight menu.toRoot(); } void loop() { readButtons(); //I splitted button reading and navigation in two procedures because navigateMenus(); //in some situations I want to use the button for other purpose (eg. to change some settings) } void menuChanged(MenuChangeEvent changed){ MenuItem newMenuItem=changed.to; //get the destination menu if(newMenuItem.getName()==menu.getRoot()){ lcd.setCursor(6,0); lcd.print("23:00:00"); lcd.setCursor(5,1); lcd.print("2014/12/31"); lcd.setCursor(0,2); lcd.print(" "); lcd.setCursor(0,3); lcd.print(" "); if (Motor1==1){ lcd.setCursor(0,2); //set the start position for lcd printing to the second row lcd.print(TPD); lcd.setCursor(3,2); lcd.print("TPD"); lcd.setCursor(0,3); lcd.print(CWCCW); } else if (Motor1==0){ lcd.setCursor(0,2); //set the start position for lcd printing to the second row lcd.print("Not"); lcd.setCursor(0,3); lcd.print("Active"); } if (Motor2==1){ lcd.setCursor(14,2); //set the start position for lcd printing to the second row lcd.print(TPD2); lcd.setCursor(17,2); lcd.print("TPD"); lcd.setCursor(14,3); lcd.print(CWCCW2); } else if (Motor2==0){ lcd.setCursor(17,2); lcd.print("Not"); lcd.setCursor(14,3); lcd.print("Active"); lcd.setCursor(0,2); lcd.print("test"); } } else if(newMenuItem.getName()=="Item1"){ //Motor 1 Settings lcd.setCursor(0,3); lcd.print(" "); lcd.setCursor(0,2); lcd.print("Motor 1 Settings "); } else if(newMenuItem.getName()=="Item1Sub1"){ //M1 TPD lcd.setCursor(0,2); lcd.print("Motor 1 Settings "); lcd.setCursor(0,3); lcd.print("TPD "); } else if(newMenuItem.getName()=="Item1Sub1Sub1"){ //650 lcd.setCursor(0,2); lcd.print("Motor 1> TPD "); if(TPD=="650"){ lcd.setCursor(0,3); lcd.print("650 * "); }else{ lcd.setCursor(0,3); lcd.print("650 "); } } else if(newMenuItem.getName()=="Item1Sub1Sub2"){ //750 lcd.setCursor(0,2); lcd.print("Motor 1> TPD "); if(TPD=="750"){ lcd.setCursor(0,3); lcd.print("750 * "); }else{ lcd.setCursor(0,3); lcd.print("750 "); } } else if(newMenuItem.getName()=="Item1Sub1Sub3"){ //850 lcd.setCursor(0,2); lcd.print("Motor 1> TPD "); if(TPD=="850"){ lcd.setCursor(0,3); lcd.print("850 * "); }else{ lcd.setCursor(0,3); lcd.print("850 "); } } else if(newMenuItem.getName()=="Item1Sub1Sub4"){ //950 lcd.setCursor(0,2); lcd.print("Motor 1> TPD "); if(TPD=="950"){ lcd.setCursor(0,3); lcd.print("950 * "); }else{ lcd.setCursor(0,3); lcd.print("950 "); } } else if(newMenuItem.getName()=="Item1Sub2"){ //M1 Driection lcd.setCursor(0,2); lcd.print("Motor 1 Settings "); lcd.setCursor(0,3); lcd.print("Direction "); } else if(newMenuItem.getName()=="Item1Sub2Sub1"){ //CW lcd.setCursor(0,2); lcd.print("Motor 1> Direrection"); if(CWCCW=="CW"){ lcd.setCursor(0,3); lcd.print("CW * "); }else{ lcd.setCursor(0,3); lcd.print("CW "); } } else if(newMenuItem.getName()=="Item1Sub2Sub2"){ //CCW lcd.setCursor(0,2); lcd.print("Motor 1> Direrection"); if(CWCCW=="CCW"){ lcd.setCursor(0,3); lcd.print("CCW * "); }else{ lcd.setCursor(0,3); lcd.print("CCW "); } } else if(newMenuItem.getName()=="Item1Sub2Sub3"){ //Both lcd.setCursor(0,2); lcd.print("Motor 1> Direrection"); if(CWCCW=="CW/CCW"){ lcd.setCursor(0,3); lcd.print("Both * "); }else{ lcd.setCursor(0,3); lcd.print("Both "); } } else if(newMenuItem.getName()=="Item1Sub3"){ // M1 START/STOP lcd.setCursor(0,2); lcd.print("Motor 1 Settings "); lcd.setCursor(0,3); lcd.print("STOP/START "); } else if(newMenuItem.getName()=="Item1Sub3Sub1"){ lcd.setCursor(0,2); lcd.print("Motor 1> STOP/START "); lcd.setCursor(0,3); lcd.print("START "); } else if(newMenuItem.getName()=="Item1Sub3Sub2"){ lcd.setCursor(0,2); lcd.print("Motor 1> STOP/START "); lcd.setCursor(0,3); lcd.print("STOP "); } else if(newMenuItem.getName()=="Item2"){ //Motor2 settings lcd.setCursor(0,3); lcd.print(" "); lcd.setCursor(0,2); lcd.print("Motor 2 Settings "); } else if(newMenuItem.getName()=="Item2Sub1"){ //M2 TPD lcd.setCursor(0,2); lcd.print("Motor 2 Settings "); lcd.setCursor(0,3); lcd.print("TPD "); } else if(newMenuItem.getName()=="Item2Sub1Sub1"){ //650 lcd.setCursor(0,2); lcd.print("Motor 2> TPD "); if(TPD2=="650"){ lcd.setCursor(0,3); lcd.print("650 * "); }else{ lcd.setCursor(0,3); lcd.print("650 "); } } else if(newMenuItem.getName()=="Item2Sub1Sub2"){ //750 lcd.setCursor(0,2); lcd.print("Motor 2> TPD "); if(TPD2=="750"){ lcd.setCursor(0,3); lcd.print("750 * "); }else{ lcd.setCursor(0,3); lcd.print("750 "); } } else if(newMenuItem.getName()=="Item2Sub1Sub3"){ //850 lcd.setCursor(0,2); lcd.print("Motor 2> TPD "); if(TPD2=="850"){ lcd.setCursor(0,3); lcd.print("850 * "); }else{ lcd.setCursor(0,3); lcd.print("850 "); } } else if(newMenuItem.getName()=="Item2Sub1Sub4"){ //950 lcd.setCursor(0,2); lcd.print("Motor 2> TPD "); if(TPD=="950"){ lcd.setCursor(0,3); lcd.print("950 * "); }else{ lcd.setCursor(0,3); lcd.print("950 "); } } else if(newMenuItem.getName()=="Item2Sub2"){ //M2 Direction lcd.setCursor(0,2); lcd.print("Motor 2> Direction "); lcd.setCursor(0,3); lcd.print("Direction "); } else if(newMenuItem.getName()=="Item2Sub2Sub1"){ //CW lcd.setCursor(0,2); lcd.print("Motor 2> Direction "); if(CWCCW2==" CW"){ lcd.setCursor(0,3); lcd.print("CW * "); }else{ lcd.setCursor(0,3); lcd.print("CW "); } } else if(newMenuItem.getName()=="Item2Sub2Sub2"){ //CCW lcd.setCursor(0,2); lcd.print("Motor 2> Direction "); if(CWCCW2==" CCW"){ lcd.setCursor(0,3); lcd.print("CCW * "); }else{ lcd.setCursor(0,3); lcd.print("CCW "); } } else if(newMenuItem.getName()=="Item2Sub2Sub3"){ //Both lcd.setCursor(0,2); lcd.print("Motor 2> Direction "); if(CWCCW2=="CW/CCW"){ lcd.setCursor(0,3); lcd.print("Both * "); }else{ lcd.setCursor(0,3); lcd.print("Both "); } } else if(newMenuItem.getName()=="Item2Sub3"){ // M2 START/STOP lcd.setCursor(0,2); lcd.print("Motor 2 Settings "); lcd.setCursor(0,3); lcd.print("STOP/START "); } else if(newMenuItem.getName()=="Item2Sub3Sub1"){ lcd.setCursor(0,2); lcd.print("Motor 2> STOP/START "); lcd.setCursor(0,3); lcd.print("START "); } else if(newMenuItem.getName()=="Item2Sub3Sub2"){ lcd.setCursor(0,2); lcd.print("Motor 2> STOP/START "); lcd.setCursor(0,3); lcd.print("STOP "); } else if(newMenuItem.getName()=="Item3"){ //backlight lcd.setCursor(0,3); lcd.print(" "); lcd.setCursor(0,2); lcd.print("LCD Backlight "); } else if(newMenuItem.getName()=="Item3Sub1"){ //25% lcd.setCursor(0,2); lcd.print("LCD Backlight "); if(Backlight==64){ lcd.setCursor(0,3); lcd.print("25% * "); }else{ lcd.setCursor(0,3); lcd.print("25% "); } } else if(newMenuItem.getName()=="Item3Sub2"){ //50% lcd.setCursor(0,2); lcd.print("LCD Backlight "); if(Backlight==128){ lcd.setCursor(0,3); lcd.print("50% * "); }else{ lcd.setCursor(0,3); lcd.print("50% "); } } else if(newMenuItem.getName()=="Item3Sub3"){ //75% lcd.setCursor(0,2); lcd.print("LCD Backlight "); if(Backlight==192){ lcd.setCursor(0,3); lcd.print("75% * "); }else{ lcd.setCursor(0,3); lcd.print("75% "); } } else if(newMenuItem.getName()=="Item3Sub4"){ //100% lcd.setCursor(0,2); lcd.print("LCD Backlight "); if(Backlight==255){ lcd.setCursor(0,3); lcd.print("100% * "); }else{ lcd.setCursor(0,3); lcd.print("100% "); } } } // här sätter man vad som ska hända efter man har valt något void menuUsed(MenuUseEvent used){ if(used.item=="Item1Sub1Sub1"){ //sätter TPD 650 lcd.clear(); TPD = String("650"); lcd.setCursor(0,1); lcd.print("M1 TPD set to 650"); delay(3000); //delay to allow message reading lcd.clear(); menu.toRoot(); //back to Main } else if(used.item=="Item1Sub1Sub2"){ //sätter TPD 750 lcd.clear(); TPD = String("750"); lcd.setCursor(0,1); lcd.print("M1 TPD set to 750"); delay(3000); //delay to allow message reading lcd.clear(); menu.toRoot(); //back to Main } else if(used.item=="Item1Sub1Sub3"){ //sätter TPD 850 lcd.clear(); TPD = String("850"); lcd.setCursor(0,1); lcd.print("M1 TPD set to 850"); delay(3000); //delay to allow message reading lcd.clear(); menu.toRoot(); //back to Main } else if(used.item=="Item1Sub1Sub4"){ //sätter TPD 950 lcd.clear(); TPD = String("950"); lcd.setCursor(0,1); lcd.print("M1 TPD set to 950"); delay(3000); //delay to allow message reading lcd.clear(); menu.toRoot(); //back to Main } else if(used.item=="Item1Sub2Sub1"){ //sätter CW lcd.clear(); CWCCW = String("CW"); lcd.setCursor(0,1); lcd.print("M1 Direction = CW"); delay(3000); //delay to allow message reading lcd.clear(); menu.toRoot(); //back to Main } else if(used.item=="Item1Sub2Sub2"){ //sätter CCW lcd.clear(); CWCCW = String("CCW"); lcd.setCursor(0,1); lcd.print("M1 Direction = CCW"); delay(3000); //delay to allow message reading lcd.clear(); menu.toRoot(); //back to Main } else if(used.item=="Item1Sub2Sub3"){ //sätter CW&CCW lcd.clear(); CWCCW = String("CW/CCW"); //turnmode = 0; lcd.setCursor(0,1); lcd.print("M1 Direction = Both"); delay(3000); //delay to allow message reading lcd.clear(); menu.toRoot(); //back to Main } else if(used.item=="Item1Sub3Sub1"){ //Startar M1 lcd.clear(); lcd.setCursor(0,1); Motor1=1; lcd.print("Start Motor 1 "); delay(3000); //delay to allow message reading lcd.clear(); menu.toRoot(); //back to Main } else if(used.item=="Item1Sub3Sub2"){ //Stoppar M1 lcd.clear(); lcd.setCursor(0,1); Motor1=0; lcd.print("Stop Motor 1 "); delay(3000); //delay to allow message reading lcd.clear(); menu.toRoot(); //back to Main } else if(used.item=="Item2Sub1Sub1"){ //sätter TPD 650 lcd.clear(); TPD2 = String("650"); lcd.setCursor(0,1); lcd.print("M2 TPD set to 650"); delay(3000); //delay to allow message reading lcd.clear(); menu.toRoot(); //back to Main } else if(used.item=="Item2Sub1Sub2"){ //sätter TPD 750 lcd.clear(); TPD2 = String("750"); lcd.setCursor(0,1); lcd.print("M2 TPD set to 750"); delay(3000); //delay to allow message reading lcd.clear(); menu.toRoot(); //back to Main } else if(used.item=="Item2Sub1Sub3"){ //sätter TPD 850 lcd.clear(); TPD2 = String("850"); lcd.setCursor(0,1); lcd.print("M2 TPD set to 850"); delay(3000); //delay to allow message reading lcd.clear(); menu.toRoot(); //back to Main } else if(used.item=="Item2Sub1Sub4"){ //sätter TPD 950 lcd.clear(); TPD2 = String("950"); lcd.setCursor(0,1); lcd.print("M2 TPD set to 950"); delay(3000); //delay to allow message reading lcd.clear(); menu.toRoot(); //back to Main } else if(used.item=="Item2Sub2Sub1"){ //sätter CW lcd.clear(); CWCCW2 = String(" CW"); lcd.setCursor(0,1); lcd.print("M2 Direction = CW"); delay(3000); //delay to allow message reading lcd.clear(); menu.toRoot(); //back to Main } else if(used.item=="Item2Sub2Sub2"){ //sätter CCW lcd.clear(); CWCCW2 = String(" CCW"); lcd.setCursor(0,1); lcd.print("M2 Direction = CCW"); delay(3000); //delay to allow message reading lcd.clear(); menu.toRoot(); //back to Main } else if(used.item=="Item2Sub2Sub3"){ //sätter CW&CCW lcd.clear(); CWCCW2 = String("CW/CCW"); lcd.setCursor(0,1); lcd.print("M2 Direction = Both"); delay(3000); //delay to allow message reading lcd.clear(); menu.toRoot(); //back to Main } else if(used.item=="Item2Sub3Sub1"){ //Startar M1 lcd.clear(); lcd.setCursor(0,1); Motor2=1; lcd.print("Start Motor 2 "); delay(3000); //delay to allow message reading lcd.clear(); menu.toRoot(); //back to Main } else if(used.item=="Item2Sub3Sub2"){ //Stoppar M1 lcd.clear(); lcd.setCursor(0,1); Motor2=0; lcd.print("Stop Motor 2 "); delay(3000); //delay to allow message reading lcd.clear(); menu.toRoot(); //back to Main } else if(used.item=="Item3Sub1"){ //Blacklight 25% lcd.clear(); Backlight=64; lcd.setBacklight(64); lcd.setCursor(0,1); lcd.print("Backlight = 25% "); delay(3000); //delay to allow message reading lcd.clear(); menu.toRoot(); //back to Main } else if(used.item=="Item3Sub2"){ //Blacklight 50% lcd.clear(); Backlight=128; lcd.setBacklight(128); lcd.setCursor(0,1); lcd.print("Backlight = 50% "); delay(3000); //delay to allow message reading lcd.clear(); menu.toRoot(); //back to Main } else if(used.item=="Item3Sub3"){ //Blacklight 75% lcd.clear(); Backlight=192; lcd.setBacklight(192); lcd.setCursor(0,1); lcd.print("Backlight = 75% "); delay(3000); //delay to allow message reading lcd.clear(); menu.toRoot(); //back to Main } else if(used.item=="Item3Sub4"){ //Blacklight 100% lcd.clear(); Backlight=255; lcd.setBacklight(255); lcd.setCursor(0,1); lcd.print("Backlight = 100%"); delay(3000); //delay to allow message reading lcd.clear(); menu.toRoot(); //back to Main } } void readButtons(){ //read buttons status int reading; int buttonEnterState=LOW; // the current reading from the Enter input pin int buttonEscState=LOW; // the current reading from the input pin int buttonLeftState=LOW; // the current reading from the input pin int buttonRightState=LOW; // the current reading from the input pin //Enter button // read the state of the switch into a local variable: reading = digitalRead(buttonPinEnter); // check to see if you just pressed the enter button // (i.e. the input went from LOW to HIGH), and you've waited // long enough since the last press to ignore any noise: // If the switch changed, due to noise or pressing: if (reading != lastButtonEnterState) { // reset the debouncing timer lastEnterDebounceTime = millis(); } if ((millis() - lastEnterDebounceTime) > debounceDelay) { // whatever the reading is at, it's been there for longer // than the debounce delay, so take it as the actual current state: buttonEnterState=reading; lastEnterDebounceTime=millis(); } // save the reading. Next time through the loop, // it'll be the lastButtonState: lastButtonEnterState = reading; //Esc button // read the state of the switch into a local variable: reading = digitalRead(buttonPinEsc); // check to see if you just pressed the Down button // (i.e. the input went from LOW to HIGH), and you've waited // long enough since the last press to ignore any noise: // If the switch changed, due to noise or pressing: if (reading != lastButtonEscState) { // reset the debouncing timer lastEscDebounceTime = millis(); } if ((millis() - lastEscDebounceTime) > debounceDelay) { // whatever the reading is at, it's been there for longer // than the debounce delay, so take it as the actual current state: buttonEscState = reading; lastEscDebounceTime=millis(); } // save the reading. Next time through the loop, // it'll be the lastButtonState: lastButtonEscState = reading; //Down button // read the state of the switch into a local variable: reading = digitalRead(buttonPinRight); // check to see if you just pressed the Down button // (i.e. the input went from LOW to HIGH), and you've waited // long enough since the last press to ignore any noise: // If the switch changed, due to noise or pressing: if (reading != lastButtonRightState) { // reset the debouncing timer lastRightDebounceTime = millis(); } if ((millis() - lastRightDebounceTime) > debounceDelay) { // whatever the reading is at, it's been there for longer // than the debounce delay, so take it as the actual current state: buttonRightState = reading; lastRightDebounceTime =millis(); } // save the reading. Next time through the loop, // it'll be the lastButtonState: lastButtonRightState = reading; //Up button // read the state of the switch into a local variable: reading = digitalRead(buttonPinLeft); // check to see if you just pressed the Down button // (i.e. the input went from LOW to HIGH), and you've waited // long enough since the last press to ignore any noise: // If the switch changed, due to noise or pressing: if (reading != lastButtonLeftState) { // reset the debouncing timer lastLeftDebounceTime = millis(); } if ((millis() - lastLeftDebounceTime) > debounceDelay) { // whatever the reading is at, it's been there for longer // than the debounce delay, so take it as the actual current state: buttonLeftState = reading; lastLeftDebounceTime=millis();; } // save the reading. Next time through the loop, // it'll be the lastButtonState: lastButtonLeftState = reading; //records which button has been pressed if (buttonEnterState==HIGH){ lastButtonPushed=buttonPinEnter; }else if(buttonEscState==HIGH){ lastButtonPushed=buttonPinEsc; }else if(buttonRightState==HIGH){ lastButtonPushed=buttonPinRight; }else if(buttonLeftState==HIGH){ lastButtonPushed=buttonPinLeft; }else{ lastButtonPushed=0; } } void navigateMenus() { MenuItem currentMenu=menu.getCurrent(); switch (lastButtonPushed){ case buttonPinEnter: if(!(currentMenu.moveDown())){ //if the current menu has a child and has been pressed enter then menu navigate to item below menu.use(); }else{ //otherwise, if menu has no child and has been pressed enter the current menu is used menu.moveDown(); } break; case buttonPinEsc: menu.toRoot(); //back to main break; case buttonPinRight: menu.moveRight(); break; case buttonPinLeft: menu.moveLeft(); break; } lastButtonPushed=0; //reset the lastButtonPushed variable }