Menú en LCD 16X2

Hola, soy nuevo en el foro y en la programación, he querido hacer un menú para para un display LCD 16X2 para seleccionar por medio de interruptores tipo push button la forma en que trabajara mi circuito, la forma automática, la manual y la temporizada. El problema empieza al querer hacer que el usuario pueda seleccionar entre uno de esos tres modos.

Inicialmente el programa ejecuta una serie de instrucciones y quiero que el usuario pueda ingresar el menú de opciones, para ello utilizo una interrupción, la cual entra cuando un botón en el pin 2 de arduino cambia de estado de 0 a 1.

Esta interrupción llama a una función llamada ajustes la cual pretende hacer el cambio de modos de trabajo (automático, manual, temporizada).

Mi problema comienza al querer hacer el cambio de estos modos, debido a que la interrupción si llama correctamente al void ajustes mostrando el mensaje “Seleccione modo”, pero al presionar los interruptores para el cambio de opciones no sucede nada.

Gracias por su tiempo.

Mi placa es un Arduino MEGA 2560

El codigo es el siguiente:

#include <LiquidCrystal.h>                 // Libreria para usar la LCD I2C 16x2 (en este caso.
LiquidCrystal lcd(22, 23, 24, 25, 26, 27); // Pines de conexion del arduino al LCD (RS, EN, d4, d5, d6, d7) **RW por defecto va a tierra.**

int subir = 41;
int bajar = 42;
int OK = 43;
int cancelar = 44;

int seleccion_modo = 0;

const int entradas[]{ 41, 42, 43, 44 };

void setup(){
  for (int b = 0; b <= 3; b++){   // Configuramos los pines del arreglo como ENTRADAS.
    pinMode(entradas[b], INPUT);
    }

  pinMode(13, OUTPUT);  

  lcd.begin(16, 2);               // Iniciamos la LCD.
  lcd.clear();                    // Limpia la LCD.

  attachInterrupt(0, MenuConfiguraciones, RISING);
}



// Interrupcion que salta al void ajustes para la configuracion del sistema.
void MenuConfiguraciones(){
  ajustes();
}



//void que permite seleccionar entre el control automatico, el control manual o el control temporizado.

void ajustes(){
  int arriba = digitalRead(subir);
  int abajo = digitalRead(bajar);
  int guardar = digitalRead(OK);
  int salir = digitalRead(cancelar);
  String seleccion[]{"Automatico", "Manual", "Temporizado"};
  int modo_anterior = seleccion_modo;

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Seleccione modo");
          
      do{
      if (abajo == 1){
        seleccion_modo = (seleccion_modo -1);
        if (seleccion_modo == -1){
          seleccion_modo = 2;           
         }
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Modo de trabajo:");
      lcd.setCursor(0, 1);
      lcd.print(seleccion[seleccion_modo]);  
      }
      
        else if(arriba == 1){
           seleccion_modo = (seleccion_modo +1);
           if (seleccion_modo == 3){
             seleccion_modo = 0;
            }
           lcd.clear();
           lcd.setCursor(0, 0);
           lcd.print("Modo de trabajo:");
           lcd.setCursor(0, 1);
           lcd.print(seleccion[seleccion_modo]);
          }
                
       else if (salir ==1){
        seleccion_modo = modo_anterior;
        lcd.clear();
        }
             
      }while (salir == 0 && guardar == 0);
            
      if (seleccion_modo == 0){
        Control_Automatico();
        }

        else if (seleccion_modo == 1){
          Control_Manual();         
        }
          
        else if (seleccion_modo == 2){
          Control_Temporizado();           
        }  
}

void loop(){
digitalWrite(13, 1);   //(solo es un ejemplo del codigo principal)
delay(1000);
digitalWrite(13, 0);
delay(1000);
}

This does not answer your question but provides an alternative: https://github.com/MajicDesigns/MD_Menu

Bienvenido al foro Arduino en Español.
Acaban de mover tu tema del foro en Inglés donde erróneamente publicaste tu consulta a este foro.
Por favor no cometas de nuevo este error.
Normas del foro

Respecto a tu consulta partes de un error conceptual.
Las interrupciones no se usan para lo que tu las estas usando.
Una acción tan lenta como la que implique un cambio de modo se hace de manera simple de esta manera.

Prueba esto sin usar interrupciones a ver si trabaja como esperas.

#include <LiquidCrystal.h>                 // Libreria para usar la LCD I2C 16x2 (en este caso.
LiquidCrystal lcd(22, 23, 24, 25, 26, 27); // Pines de conexion del arduino al LCD (RS, EN, d4, d5, d6, d7) **RW por defecto va a tierra.**


#define PIN_MODO   2
#define PIN_LED   13
#define SUBIR     41
#define BAJAR     42
#define OK        43
#define CANCELAR  44

int seleccion_modo = 0;
unsigned long start;
byte status = 0;
const int entradas[]{ 41, 42, 43, 44 };
bool modo_ajuste = false;

void setup(){
  for (int b = 0; b <= 3; b++){   // Configuramos los pines del arreglo como ENTRADAS.
       pinMode(entradas[b], INPUT);
  }

  pinMode(PIN_LED, OUTPUT);  

  lcd.begin(16, 2);               // Iniciamos la LCD.
  lcd.clear();                    // Limpia la LCD.

  //attachInterrupt(0, MenuConfiguraciones, RISING);
}



// Interrupcion que salta al void ajustes para la configuracion del sistema.
void MenuConfiguraciones(){
    ajustes();
}



//void que permite seleccionar entre el control automatico, el control manual o el control temporizado.

void ajustes(){
  
  int arriba  = digitalRead(SUBIR);
  int abajo   = digitalRead(BAJAR);
  int guardar = digitalRead(OK);
  int salir   = digitalRead(CANCELAR);

  String seleccion[]{"Automatico", "Manual", "Temporizado"};
  int modo_anterior = seleccion_modo;

  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Seleccione modo");

  do {
      if (abajo == 1){
          seleccion_modo = (seleccion_modo -1);
      if (seleccion_modo == -1) {
          seleccion_modo = 2;           
      }
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Modo de trabajo:");
      lcd.setCursor(0, 1);
      lcd.print(seleccion[seleccion_modo]);  
  }

  else if (arriba == 1){
          seleccion_modo = (seleccion_modo +1);
  if (seleccion_modo == 3){
      seleccion_modo = 0;
  }
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Modo de trabajo:");
  lcd.setCursor(0, 1);
  lcd.print(seleccion[seleccion_modo]);
  }

  else if (salir ==1){
          seleccion_modo = modo_anterior;
          lcd.clear();
  }

  } while (salir == 0 && guardar == 0);

  if (seleccion_modo == 0){
      Control_Automatico();
  }

  else if (seleccion_modo == 1){
          Control_Manual();         
  }

  else if (seleccion_modo == 2){
          Control_Temporizado();           
  }  
}

void loop(){

  estado = digitalRead(PIN_MODO);
  if (!estado && estadoAnt) // FALLING
      modo_ajuste = modo_ajuste;           // aca esta la diferencia. 
  estadoAnt = estado;
  
  if (modo_ajuste)                                 // cada presion del pin 2 cambia a modo de configuracion o no
      MenuConfiguraciones();

  // maquina de estados para hacer blink con un led
  switch(status) {
    case 0: digitalWrite(PIN_LED, 1);   //(solo es un ejemplo del codigo principal)
            status = 1;
            start = millis();
            break;
    case 1: if (millis()- start > 1000UL) {
                start = millis();
                status = 2;
            }
            break;
    case 2: digitalWrite(PIN_LED, 0);
            status = 3;
            start = millis();
            break;
    case 3: if (millis()- start > 1000UL) {
                start = millis();
                status = 0; // vuelvo a comenzar
            }
            break;            
  }
  
  delay(1000);
  digitalWrite(PIN_LED, 0);
  delay(1000);
}