Menú LCD con 4 botones

Buenos días, traigo una duda para la realización de un menú (SIN KEYPAD) con una pantalla LCD 20x4, más que una duda sería si se podría realizar lo mismo de manera más corta utilizando estructuras o algo similar. La idea es realizar un menú en el cual en pantalla muestra una opción en cada esquina y en cada esquina un botón, es decir 4 botones, y dependiendo que botón se pulse entra en un menú u otro.

Por ejemplo, primera pantalla: ---------------------------------------
boton1 | cafe | boton3
| |
| |
boton2 | te | boton4

Si pulso el botón1 entra en el menú cafe, y si pulso el boton2 entra en menu te. Bien ahora si quiero menú café:


boton1 | solo nube| boton3
| |
| |
boton2 | mitad atras | boton4

Ahora si pulso el botón 1 entra en menú solo y asi sucesivamente hasta que se llegue a la función final. Creo que más o menos se entiende la idea.

Yo lo he realizado de la siguiente manera:

#include <Wire.h>
#include <LiquidCrystal_I2C_AvrI2C.h>

LiquidCrystal_I2C_AvrI2C lcd(0x27, 20, 4);

byte boton1 = 3;
byte boton2 = 2;
byte boton3 = 9;
byte boton4 = 10;

byte estado = 1;

void setup() {

  lcd.begin();
  lcd.backlight();
  pinMode(boton1, INPUT);
  pinMode(boton2, INPUT);
  pinMode(boton3, INPUT);
  pinMode(boton4, INPUT);
  digitalWrite(boton1, HIGH);
  digitalWrite(boton2, HIGH);
  digitalWrite(boton3, HIGH);
  digitalWrite(boton4, HIGH);
}

void loop() {

  if (estado == 1) {
    do {
      LCDmenu0();
    } while (estado == 1); lcd.clear();
  }

  if (estado == 2) {
    do {
      LCDmenu1();
    } while (estado == 2);
    lcd.clear();
  }

  if (estado == 3) {
    do {
      LCDmenu2();
    } while (estado == 3);
    lcd.clear();
  }

  if (estado == 4) {
    do {
      //LCDmenu4();
    } while (estado == 4);
    lcd.clear();
  }

  if (estado == 5) {
    do {
      //LCDmenu5();
    } while (estado == 5);
    lcd.clear();
  }

  if (estado == 6) {
    do {
      //LCDmenu6();
    } while (estado == 6);
    lcd.clear();
  }

  if (estado == 7) {
    do {
     // LCDmenu7();
    } while (estado == 7);
    lcd.clear();
  }

  if (estado == 8) {
    do {
      //LCDmenu8();
    } while (estado == 8);
    lcd.clear();
  }

  if (estado == 9) {
    do {
      //LCDmenu9();
    } while (estado == 9);
    lcd.clear();
  }

}

void LCDmenu0()
{
  lcd.setCursor(0, 0);
  lcd.print("cafe");
  lcd.setCursor(0, 3);
  lcd.print("te");

  if (digitalRead(boton1) == HIGH)
  {
    estado = 2;   
    lcd.clear();
  }
  if (digitalRead(boton2) == HIGH)
  {
    estado= 3;    
    lcd.clear();
  }
}

void LCDmenu1()
{
  lcd.setCursor(0, 0); lcd.print("solo");
  lcd.setCursor(0, 3); lcd.print("mitad");
  lcd.setCursor(9, 0); lcd.print("nube");
  lcd.setCursor(15, 3); lcd.print("ATRAS");
  delay(500);

  if (digitalRead(boton1) == HIGH)
  {
    estado = 4;     
  }
  if (digitalRead(boton2) == HIGH)
  {
    estado = 5;  
  }
  if (digitalRead(boton3) == HIGH)
  {
    estado = 6;  
  }
  if (digitalRead(boton4) == HIGH)
  {
    estado = 1;   
  }
}

void LCDmenu2()
{
  lcd.setCursor(0, 0); lcd.print("negro");
  lcd.setCursor(0, 3); lcd.print("rojo");
  lcd.setCursor(9, 0); lcd.print("tila");
  lcd.setCursor(15, 3); lcd.print("ATRAS");
  delay(500);

  if (digitalRead(boton1) == HIGH)
  {
    estado = 7;     
  }
  if (digitalRead(boton2) == HIGH)
  {
    estado = 8;  
  }
  if (digitalRead(boton3) == HIGH)
  {
    estado = 9;  
  }
  if (digitalRead(boton4) == HIGH)
  {
    estado = 1;   
  }
}

Esto en principio hace lo que yo quiero, pero me da la espina que hay alguna forma de optimizarlo. A ver si puede ayudarme alguien con más experiencia. :slight_smile:

Existen librerias para eso que te facilitan la tarea(busca en san google).Tu enfoque te limita a tres las opciones a elegir ,pero y si necesitas añadir mas tipos de cafe,añadiras mas botones...?

Buenos días, ya había buscado por san google y no había encontrado lo que buscaba, es posible que esté y no la haya encontrado, y se me ocurrió esa forma de realizarlo, ya sé que es un menú limitado pero ahora mismo es lo que necesito y preguntaba por si se podía optimizar, acortar...; con Keypad tienes más opciones y hay muchos más ejemplos por google que sobre mi forma de hacerlo, aunque es probable que esta sea más simple. Después de eso ya decidí preguntar por aquí.

Busca en tutoriales, busca en Search de este foro. Hay cientos de ejemplos pero intenta con solo la palabra menu lcd y luego ve descartantado. Ejemplo en search con menu surgen cosas como estas

Menu site:http://forum.arduino.cc

Si te sirve de algo, usa la libreria "MenuBackend" es la que mejor me ha funcionado en mis proyectos. Saludos