Buenas:
Como muestra en la imagen, no se mueve la flecha indicadora para seleccionar menús y submenús y quiero saber el motivo.
¿Qué hago mal?
Es verdad que estoy desarrollando el menú con submenú completo, por ahora voy por partes.

Si pulsas el botón OK / Enter entra en una lista de submenús, solo funciona el "Nombre Relés". Debería moverse la flecha indicadora cuando pulsas el pulsador Arriba y Abajo. También es funcional introducir nombre de cada relés.
También dejo el código hecho en C# hasta donde he llegado, funciona introducir nombre de los relés y quede guardado en un archivo de texto tipo .txt.
LCD_Menu_y_submenu_03.ino
MenuPrincipal.h
Gracias por todo.
Como muestra en la imagen, no se mueve la flecha indicadora para seleccionar menús y submenús y quiero saber el motivo.
¿Qué hago mal?
Es verdad que estoy desarrollando el menú con submenú completo, por ahora voy por partes.

Si pulsas el botón OK / Enter entra en una lista de submenús, solo funciona el "Nombre Relés". Debería moverse la flecha indicadora cuando pulsas el pulsador Arriba y Abajo. También es funcional introducir nombre de cada relés.
También dejo el código hecho en C# hasta donde he llegado, funciona introducir nombre de los relés y quede guardado en un archivo de texto tipo .txt.
LCD_Menu_y_submenu_03.ino
C++:
// Include el código de la librería.
#include <LiquidCrystal.h>
// Inicializa la librería con sus pines indicados.
// RS, RW, Enable, D4, D5, D6, D7.
//LiquidCrystal lcd(8, NULL, 9, 4, 5, 6, 7);
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// Declarar a partir de aquí el lcd.
#include "MenuPrincipal.h"
// Pin 10 para saber que es luz de fondo.
//const byte LuzFondo = 10;
// Variables.
// Pulsador Arriba.
byte estadoActualArriba1 = 0;
byte estadoActualArriba2 = 0;
byte estadoUltimoArriba = 0;
int contadorArriba = 0;
// Pulsador Abajo.
byte estadoActualAbajo1 = 0;
byte estadoActualAbajo2 = 0;
byte estadoUltimoAbajo = 0;
int contadorAbajo = 0;
// Pulsador Izquierda.
byte estadoActualIzquierda1 = 0;
byte estadoActualIzquierda2 = 0;
byte estadoUltimoIzquierda = 0;
int contadorIzquierda = 0;
// Pulsador Derecha.
byte estadoActualDerecha1 = 0;
byte estadoActualDerecha2 = 0;
byte estadoUltimoDerecha = 0;
int contadorDerecha = 0;
// Pulsador Ok / Enter.
byte estadoActualEnter1 = 0;
byte estadoActualEnter2 = 0;
byte estadoUltimoEnter = 0;
int contadorEnter = 0;
void setup()
{
Serial.begin(115200); // 115200
// La pantalla es de 20 caracteres y 4 filas.
lcd.begin(20, 4);
// Indicar luz de fondo como salida.
// pinMode(LuzFondo, OUTPUT);
// Configuración de pines como salidas digitales.
pinMode(13, OUTPUT);
// Configuración de pines como entradas digitales.
pinMode(A1, INPUT); // Arriba.
pinMode(A2, INPUT); // Abajo.
pinMode(A3, INPUT); // Izquierda.
pinMode(A4, INPUT); // Derecha.
pinMode(A5, INPUT); // Ok / Enter.
lcd.clear(); // Borra la pantalla y su posición superior izquierda.
lcd.setCursor(0, 1); // Línea 2 del LCD.
lcd.print(F(" Pantalla principal ")); // Muestra título en la LCD.
}
void loop()
{
// Pulsador Arriba.
estadoActualArriba1 = digitalRead(A1);
delay(10);
estadoActualArriba2 = digitalRead(A1);
// Si los estados no son iguales, el sketch no hace gran cosa.
if (estadoActualArriba1 == estadoActualArriba2)
{
// El código que sigue es idéntico al del anteerior ejemplo.
if (estadoActualArriba1 != estadoUltimoArriba)
{
if (estadoActualArriba1 == HIGH)
{
contadorArriba = contadorArriba + 1;
Serial.print (F("Esta es la pulsación ARRIBA nº: "));
Serial.println(contadorArriba);
lcd.setCursor(0, 0); // Línea 1 del LCD.
lcd.print("Pulsado: ");
lcd.print(contadorArriba);
}
}
}
estadoUltimoArriba = estadoActualArriba1;
if (contadorArriba % 2 == 0)
{
digitalWrite(13, LOW);
}
else
{
digitalWrite(13, HIGH);
}
// Pulsador Abajo.
estadoActualAbajo1 = digitalRead(A2);
delay(10);
estadoActualAbajo2 = digitalRead(A2);
// Si los estados no son iguales, el sketch no hace gran cosa.
if (estadoActualAbajo1 == estadoActualAbajo2)
{
// El código que sigue es idéntico al del anteerior ejemplo.
if (estadoActualAbajo1 != estadoUltimoAbajo)
{
if (estadoActualAbajo1 == HIGH)
{
contadorAbajo = contadorAbajo + 1;
Serial.print (F("Esta es la pulsación ABAJO nº: "));
Serial.println(contadorAbajo);
}
}
}
estadoUltimoAbajo = estadoActualAbajo1;
if (contadorAbajo % 2 == 0)
{
digitalWrite(13, LOW);
}
else
{
digitalWrite(13, HIGH);
}
// Pulsador Izquierda.
estadoActualIzquierda1 = digitalRead(A3);
delay(10);
estadoActualIzquierda2 = digitalRead(A3);
// Si los estados no son iguales, el sketch no hace gran cosa.
if (estadoActualIzquierda1 == estadoActualIzquierda2)
{
// El código que sigue es idéntico al del anteerior ejemplo.
if (estadoActualIzquierda1 != estadoUltimoIzquierda)
{
if (estadoActualIzquierda1 == HIGH)
{
contadorIzquierda = contadorIzquierda + 1;
Serial.print (F("Esta es la pulsación IZQUIERDA nº: "));
Serial.println(contadorIzquierda);
}
}
}
estadoUltimoIzquierda = estadoActualIzquierda1;
if (contadorIzquierda % 2 == 0)
{
digitalWrite(13, LOW);
}
else
{
digitalWrite(13, HIGH);
}
// Pulsador Derecha.
estadoActualDerecha1 = digitalRead(A4);
delay(10);
estadoActualDerecha2 = digitalRead(A4);
// Si los estados no son iguales, el sketch no hace gran cosa.
if (estadoActualDerecha1 == estadoActualDerecha2)
{
// El código que sigue es idéntico al del anteerior ejemplo.
if (estadoActualDerecha1 != estadoUltimoDerecha)
{
if (estadoActualDerecha1 == HIGH)
{
contadorDerecha = contadorDerecha + 1;
Serial.print (F("Esta es la pulsación DERECHA nº: "));
Serial.println(contadorDerecha);
}
}
}
estadoUltimoDerecha = estadoActualDerecha1;
if (contadorDerecha % 2 == 0)
{
digitalWrite(13, LOW);
}
else
{
digitalWrite(13, HIGH);
}
// Pulsador OK / Enter.
estadoActualEnter1 = digitalRead(A5);
delay(10);
estadoActualEnter2 = digitalRead(A5);
// Si los estados no son iguales, el sketch no hace gran cosa.
if (estadoActualEnter1 == estadoActualEnter2)
{
// El código que sigue es idéntico al del anteerior ejemplo.
if (estadoActualEnter1 != estadoUltimoEnter)
{
if (estadoActualEnter1 == HIGH)
{
contadorEnter = contadorEnter + 1;
Serial.print (F("Esta es la pulsación OK / ENTER nº: "));
Serial.println(contadorEnter);
}
}
}
estadoUltimoEnter = estadoActualEnter1;
if (contadorEnter % 2 == 0)
{
digitalWrite(13, LOW);
//Menu_Principal();
}
else
{
digitalWrite(13, HIGH);
Menu_Principal();
}
}
MenuPrincipal.h
C++:
void Menu_Principal()
{
// Contador de teclas y navegador.
int opcion = 0;
bool salir = false;
const int seleccionMenu = 8;
// Capturar tecla para luego validar.
// Limpiar pantalla.
lcd.clear();
// Capturar pulsador para luego validar.
byte tecla;
byte teclaArriba = digitalRead(A1);
byte teclaAbajo = digitalRead(A2);
do
{
//******************************************************************
// Dibujo el menú principal.
String MENSAJES[] =
{
"** MENU PRINCIPAL **", // Posición 0.
" ESTADO PRINCIPAL ", // 1
" NOMBRE RELES ", // 2
" NOMBRE SENSORES ", // 3
" ENTRADA ANALÓGICA ", // 4
" CONFIGURACION ", // 5
" ACERCA DE... ", // 6
" AYUDA ", // 7
" EXTRA ", // 8
" INICIO ", // 9
" ", // 10
">" // 11
};
switch (opcion)
{
case 0:
lcd.setCursor(0, 0); // Línea 1 del LCD.
lcd.print(MENSAJES[0]); // ** MENÚ PRINCIPAL **
lcd.setCursor(0, 1);
lcd.print(MENSAJES[1]); // > ESTADO PRINCIPAL
lcd.setCursor(0, 1);
lcd.print(MENSAJES[11]); // >
lcd.setCursor(0, 2);
lcd.print(MENSAJES[2]); // NOMBRE RELÉS
lcd.setCursor(0, 3);
lcd.print(MENSAJES[3]); // NOMBRE SENSORES
break;
case 1:
lcd.setCursor(0, 0);
lcd.print(MENSAJES[0]); // ** MENÚ PRINCIPAL **
lcd.setCursor(0, 1);
lcd.print(MENSAJES[1]); // ESTADO PRINCIPAL
lcd.setCursor(0, 2);
lcd.print(MENSAJES[2]); // > NOMBRE RELÉS
lcd.setCursor(0, 2);
lcd.print(MENSAJES[11]); // >
lcd.setCursor(0, 3);
lcd.print(MENSAJES[3]); // NOMBRE SENSORES
break;
case 2:
lcd.setCursor(0, 0);
lcd.print(MENSAJES[0]); // ** MENÚ PRINCIPAL **
lcd.setCursor(0, 1);
lcd.print(MENSAJES[1]); // ESTADO PRINCIPAL
lcd.setCursor(0, 2);
lcd.print(MENSAJES[2]); // NOMBRE RELÉS
lcd.setCursor(0, 3);
lcd.print(MENSAJES[3]); // > NOMBRE SENSORES
lcd.setCursor(0, 3);
lcd.print(MENSAJES[11]); // >
break;
case 3:
lcd.setCursor(0, 0);
lcd.print(MENSAJES[0]); // ** MENÚ PRINCIPAL **
lcd.setCursor(0, 1);
lcd.print(MENSAJES[4]); // > ENTRADA ANALÓGICA
lcd.setCursor(0, 1);
lcd.print(MENSAJES[11]); // >
lcd.setCursor(0, 2);
lcd.print(MENSAJES[5]); // CONFIGURACIÓN
lcd.setCursor(0, 3);
lcd.print(MENSAJES[6]); // ACERCA DE...
break;
case 4:
lcd.setCursor(0, 0);
lcd.print(MENSAJES[0]); // ** MENÚ PRINCIPAL **
lcd.setCursor(0, 1);
lcd.print(MENSAJES[4]); // ENTRADA ANALÓGICA
lcd.setCursor(0, 2);
lcd.print(MENSAJES[5]); // > CONFIGURACIÓN
lcd.setCursor(0, 2);
lcd.print(MENSAJES[11]); // >
lcd.setCursor(0, 3);
lcd.print(MENSAJES[6]); // ACERCA DE...
break;
case 5:
lcd.setCursor(0, 0);
lcd.print(MENSAJES[0]); // ** MENÚ PRINCIPAL **
lcd.setCursor(0, 1);
lcd.print(MENSAJES[4]); // ENTRADA ANALÓGICA
lcd.setCursor(0, 2);
lcd.print(MENSAJES[5]); // CONFIGURACIÓN
lcd.setCursor(0, 3);
lcd.print(MENSAJES[6]); // > ACERCA DE...
lcd.setCursor(0, 3);
lcd.print(MENSAJES[11]); // >
break;
case 6:
lcd.setCursor(0, 0);
lcd.print(MENSAJES[0]); // ** MENÚ PRINCIPAL **
lcd.setCursor(0, 1);
lcd.print(MENSAJES[7]); // > AYUDA
lcd.setCursor(0, 1);
lcd.print(MENSAJES[11]); // >
lcd.setCursor(0, 2);
lcd.print(MENSAJES[8]); // EXTRA
lcd.setCursor(0, 3);
lcd.print(MENSAJES[9]); // INICIO
break;
case 7:
lcd.setCursor(0, 0);
lcd.print(MENSAJES[0]); // ** MENÚ PRINCIPAL **
lcd.setCursor(0, 1);
lcd.print(MENSAJES[7]); // AYUDA
lcd.setCursor(0, 2);
lcd.print(MENSAJES[8]); // > EXTRA
lcd.setCursor(0, 2);
lcd.print(MENSAJES[11]); // >
lcd.setCursor(0, 3);
lcd.print(MENSAJES[9]); // INICIO
break;
case 8:
lcd.setCursor(0, 0);
lcd.print(MENSAJES[0]); // ** MENÚ PRINCIPAL **
lcd.setCursor(0, 1);
lcd.print(MENSAJES[7]); // AYUDA
lcd.setCursor(0, 2);
lcd.print(MENSAJES[8]); // EXTRA
lcd.setCursor(0, 3);
lcd.print(MENSAJES[9]); // > INICIO
lcd.setCursor(0, 3);
lcd.print(MENSAJES[11]); // >
break;
default:
Serial.print(F("Fuera de rango"));
break;
}
// Fin de pintar el menú principal.
//******************************************************************
// Leer pulsador ingresada por el usuario.
tecla = digitalRead(A5);
// Validar el tipo de tecla.
if (tecla == digitalRead(A5))
{
switch (opcion)
{
case 0:
//
break;
case 1:
//
break;
case 2:
//OpcionC();
break;
case 3:
//
break;
case 4:
//
break;
case 5:
//
break;
case 6:
//
break;
case 7:
//
break;
case 8:
salir = true;
break;
default:
lcd.print(F("Fuera de rango. "));
break;
}
}
// Entonces si pulsas pulsador Abajo.
//tecla = digitalRead(A2);
else if (tecla == digitalRead(A2))
{
opcion++;
}
// Entonces si pulsas pulsador Arriba.
//tecla = digitalRead(A1);
else if (tecla == digitalRead(A1))
{
opcion--;
}
// Si está en la última opción, salta a la primera.
if (opcion > seleccionMenu)
{
opcion = 0;
}
// Si está en la primera posición, salta a la última.
if (opcion < 0)
{
opcion = seleccionMenu;
}
// Uso la tecla escape como salida.
} while (salir == false);
}
Gracias por todo.