Despues de probar varias libreria la que mas convencio fue esta, pero la puedo hacer funcionar parcialmente :0 :0 :0
Resulta que hise un ejemplo de encender dos led al elegir esa opcion en el menu y cuando la elijo (opcion Chequeo total) no me hace el void de chequeo sino que me vuelve al inicio del menu... :~ :~
Otra duda que tengo es que este menu va en un skecht el cual despliega informacion constante en el lcd y cuando apreto el boton enter ingresa al menu pero al apretar el exit vuelve al inicio del menu que eso me sirve mientras estoy navegando (aunque lo ideal seria que mientras estoy navegando no me haga un menu.toRoot(); , sino que solo me vuelva un paso atras) en el menu, pero me gustaria saber como se puede hace un "case" de que al MANTENER apretado el boton exit , salga totalmente del menu y vuelva al loop del programa y solo al apretarlo me vuelva al incio del menu o me vuelva un paso atras
Aca el codigo:
#include <MenuBackend.h>
#include <LiquidCrystal.h>
const int buttonPinLeft = 46;
const int buttonPinRight = 44;
const int buttonPinEsc = 42;
const int buttonPinEnter = 40;
int lastButtonPushed = 0;
int lastButtonEnterState = LOW;
int lastButtonEscState = LOW;
int lastButtonLeftState = LOW;
int lastButtonRightState = LOW;
long lastEnterDebounceTime = 0;
long lastEscDebounceTime = 0;
long lastLeftDebounceTime = 0;
long lastRightDebounceTime = 0;
long debounceDelay = 250;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
MenuBackend menu = MenuBackend(menuUsed,menuChanged);
MenuItem menu1Item1 = MenuItem("Item1");
MenuItem menuItem1SubItem1 = MenuItem("Item1SubItem1");
MenuItem menuItem1SubItem2 = MenuItem("Item1SubItem2");
MenuItem menu1Item2 = MenuItem("Item2");
MenuItem menuItem2SubItem1 = MenuItem("Item2SubItem1");
MenuItem menuItem2SubItem2 = MenuItem("Item2SubItem2");
MenuItem menuItem3SubItem3 = MenuItem("Item2SubItem3");
MenuItem menu1Item3 = MenuItem("Item3");
void setup()
{
pinMode(10, OUTPUT);
pinMode(9,OUTPUT);
pinMode(buttonPinLeft, INPUT);
pinMode(buttonPinRight, INPUT);
pinMode(buttonPinEnter, INPUT);
pinMode(buttonPinEsc, INPUT);
lcd.begin(20, 4);
menu.getRoot().add(menu1Item1);
menu1Item1.addRight(menu1Item2).addRight(menu1Item3);
menu1Item1.add(menuItem1SubItem1).addRight(menuItem1SubItem2);
menu1Item2.add(menuItem2SubItem1).addRight(menuItem2SubItem2).addRight(menuItem3SubItem3);
}
void loop()
{
readButtons();
navigateMenus();
} //loop()...
void menuChanged(MenuChangeEvent changed){
MenuItem newMenuItem=changed.to;
lcd.setCursor(0,1);
if(newMenuItem.getName()==menu.getRoot()){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("MENU ");
}else if(newMenuItem.getName()=="Item1"){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("1-Ajustes ");
}else if(newMenuItem.getName()=="Item1SubItem1"){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Hora");
}else if(newMenuItem.getName()=="Item1SubItem2"){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Fecha ");
}else if(newMenuItem.getName()=="Item2"){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("2-Chequeos ");
}else if(newMenuItem.getName()=="Item2SubItem1"){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("2-Chequeos ");
lcd.setCursor(0,1);
lcd.print("Sirenas ");
}else if(newMenuItem.getName()=="Item2SubItem2"){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("2-Chequeos ");
lcd.setCursor(0,1);
lcd.print("Zonas ");
}else if(newMenuItem.getName()=="Item2SubItem3"){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("2-Chequeos ");
lcd.setCursor(0,1);
lcd.print("Total ");
confirma();
}else if(newMenuItem.getName()=="Item3"){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("3-Luces ");
}else if(newMenuItem.getName()=="Item3SubItem1"){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Interiores ");
}else if(newMenuItem.getName()=="Item3SubItem2"){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Exteriores ");
}
}
void menuUsed(MenuUseEvent used){
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Ajuste Exitoso en ");
lcd.setCursor(0,1);
menu.toRoot();
}
void readButtons(){
int reading;
int buttonEnterState=LOW;
int buttonEscState=LOW;
int buttonLeftState=LOW;
int buttonRightState=LOW;
//Ent Boton
reading = digitalRead(buttonPinEnter);
if (reading != lastButtonEnterState) {
lastEnterDebounceTime = millis();
}
if ((millis() - lastEnterDebounceTime) > debounceDelay) {
buttonEnterState=reading;
lastEnterDebounceTime=millis();
}
lastButtonEnterState = reading;
//Esc Boton
reading = digitalRead(buttonPinEsc);
if (reading != lastButtonEscState) {
lastEscDebounceTime = millis();
}
if ((millis() - lastEscDebounceTime) > debounceDelay) {
buttonEscState = reading;
lastEscDebounceTime=millis();
}
lastButtonEscState = reading;
//Abajp buton
reading = digitalRead(buttonPinRight);
if (reading != lastButtonRightState) {
lastRightDebounceTime = millis();
}
if ((millis() - lastRightDebounceTime) > debounceDelay) {
buttonRightState = reading;
lastRightDebounceTime =millis();
}
lastButtonRightState = reading;
//Arriba buton
reading = digitalRead(buttonPinLeft);
if (reading != lastButtonLeftState) {
lastLeftDebounceTime = millis();
}
if ((millis() - lastLeftDebounceTime) > debounceDelay) {
buttonLeftState = reading;
lastLeftDebounceTime=millis();;
}
lastButtonLeftState = reading;
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())){
menu.use();
}else{
menu.moveDown();
}
break;
case buttonPinEsc:
menu.toRoot();
break;
case buttonPinRight:
menu.moveRight();
break;
case buttonPinLeft:
menu.moveLeft();
break;
}
lastButtonPushed=0;
}
void confirma()
{
lcd.setCursor(0,2);
lcd.print("Ent:Comfirmar");
lcd.setCursor(0,3);
lcd.print("Esc:Cancelar");
switch (lastButtonPushed){
case buttonPinEnter:
chequeo();
break;
case buttonPinEsc:
menu.toRoot();
break;
}
}
void chequeo()
{
delay(500);
digitalWrite(9,HIGH);
delay(500);
digitalWrite(10,HIGH);
}
Desde ya muchas gracias ![]()