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
}
