Problema con menú al que se accede desde un interruptor

Gracias por la respuesta ArduMyth, pero por más que intento modificar tu código para adaptarlo al mio no lo consigo... o no entra al submenú, o al menú, o si entra luego no me capta el digito que aprieto en el teclado....estoy desesperado ya con el menú... creo que es algo que se escapa a mis conocimientos de carpintero, por lo que voy a ir a una tienda de electrónica de mi ciudad a ver si por un módico precio alguien puede hacerlo...

Bueno si alguien por aquí puede arreglarme el código por un precio módico también podemos hacerlo... mi código es el siguiente:

#include <Time.h>
#include <TimeAlarms.h>
#include <DS1307RTC.h>
#include <LiquidCrystal.h>
#include <Keypad.h>

// Creamos un objeto lcd con los pines a los que está conectado
LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);

// Creamos un array bidimensional para el control del teclado 4x4

const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte rowPins[ROWS] = {26, 24, 22, 28}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {27, 25, 23, 29}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

// Definimos el pin del interruptor del menú
const int botonmenu = 3;     // Pin del interruptor del menú

void setup() {
  
  // Preparar la interfaz serial
  Serial.begin(9600);

  // pin del pulsador de entrada
  pinMode(botonmenu, INPUT_PULLUP);   // Pin del pulsador negro  encendido


  //cargamos un objeto lcd e iniciamos la pantalla con 20 caracteres por línea y 4 líneas
  lcd.begin(20, 4);


  // Crear las alarmas y configurar las funciones correspondientes a cada una
  Alarm.alarmRepeat(8, 30, 0, aperturaelectrovalvula);
  Alarm.alarmRepeat(20, 30, 0, aperturaelectrovalvula);
}

void loop(){
    if (digitalRead(botonmenu) == HIGH) {
      menu();    
    }
    else{
     pantallaprincipal();
    }
}

void menu(){

// Texto a mostrar en pantalla LCD
  lcd.setCursor(0,0);
  lcd.write("  Elija una opcion  ");
  lcd.setCursor(0,2);
  lcd.write("1 - Horario riegos  ");
  lcd.setCursor(0,3);
  lcd.write("2 - inicio y fin    ");
  lcd.setCursor(0,1);
  lcd.write("                    ");

  char key1 = keypad.getKey();

  int pasadoaint = (key1-48);

switch (pasadoaint) {
    case 1:
          Serial.print("Menú de horarios y riegos");
          modificaralarmas();
          break;
    case 2:
          Serial.print("Definir variables de inicio y fin de riegos");
          definirvariablesinicioyfin();
          break;
  }
 }

// Submenú 2
void modificaralarmas(){
  
  Serial.println(" Dentro de modificaralarmas() ");
  lcd.setCursor(0,0);
  lcd.write("1 - ver horarios    ");
  lcd.setCursor(0,1);
  lcd.write("2 - modificar horas ");
  lcd.setCursor(0,2);
  lcd.write("2 - borrar horas    ");
  lcd.setCursor(0,3);
  lcd.write("4 - agregar riegos  ");

  char key2 = keypad.getKey();

        if (key2 == '1') {
       Serial.print(" Ver horarios");
       modificaralarmas();
       }
      if (key2 == '2') {
       Serial.print(" modificar horas");
       definirvariablesinicioyfin();
       }
        if (key2 == '3') {
       Serial.print(" borrar horas");
       modificaralarmas();
       }
      if (key2 == '4') {
       Serial.print(" agregar riegos");
       definirvariablesinicioyfin();
       }
      if (key2 == '*') {
       Serial.print(" Volver al menú principal");
       menu();
       }
       
}

// Submenú 1

void definirvariablesinicioyfin(){
  
}

void pantallaprincipal(){

 // código de pantalla principal la cual funciona perfectamente

}

Gracias!!!