Problemas con el boton Enter para mi proyecto

Hola buenas tardes estoy realizando un proyecto en conjunto y no logramos resolver el problema del boton ENTER.
Lo que sucede es que ingresa perfectamente a las funciones pero a la hora de salir de la funcion debo mantenerlo presionado para lograrlo.
Estamos comenzando con tinkercad somos nuevos.
Gracias

#include <Adafruit_LiquidCrystal.h>

// ALGORITMO PROYECTO FINAL
Adafruit_LiquidCrystal lcd_1(0);

// Botones
const int BotonSubir = 2;
const int BotonBajar = 4;
const int BotonEnter = 7;

// Elementos de Sensores
const int PIR = 12;
const int piezo = 13;
const int LED = 8;
const int sensordeluz = A3;
const int foco = 10;

int PIRDato;
int Gas;
int Humedad;
int valorsensorluz;
int seconds = 0;
int indiceMenu = 0;
const int elementosMenu = 5;

String menu[elementosMenu] = { "1)Sensor de Gas   ", "EMERGENCIA!!    ", "4)Sensor Humedad ", "3)Alarma        ", "2)Sensor de Luz  " };

bool ejecutandoOpcion = false;
int opcionActual = -1;

void setup() {
    pinMode(BotonSubir, INPUT_PULLUP);
    pinMode(BotonBajar, INPUT_PULLUP);
    pinMode(BotonEnter, INPUT_PULLUP);
    pinMode(PIR, INPUT);
    pinMode(piezo, OUTPUT);
    pinMode(LED, OUTPUT);
    pinMode(A0, INPUT);
    pinMode(foco, OUTPUT); // Configurando pin 10 como salida para la bombilla

    // Menu de Inicio
    lcd_1.begin(16, 2);
    lcd_1.setBacklight(1); // Enciende la retroiluminación
    lcd_1.print("Bienvenidos a");
    lcd_1.setCursor(0, 1);
    lcd_1.print("Sensor Control");
    Serial.begin(9600);
    lcd_1.clear();
    lcd_1.print("Elija una opcion");
    lcd_1.setCursor(0, 1);
    lcd_1.print("y presione Enter");
    delay(1000); // Esperar 2 segundos
    lcd_1.clear();
    lcd_1.setCursor(0, 0);
    lcd_1.print("Opciones:");
    actualizarMenu();
}

void loop() {
    static unsigned long ultimoTiempoRebote = 0;
    unsigned long retardoRebote =250;

    if (!ejecutandoOpcion) {
        // Manejo del Boton Subir
        if (digitalRead(BotonSubir) == LOW && (millis() - ultimoTiempoRebote) > retardoRebote) {
            ultimoTiempoRebote = millis();
            indiceMenu++;
            if (indiceMenu >= elementosMenu) {
                indiceMenu = 0;
            }
            actualizarMenu();
        }

        // Manejo del Boton Bajar
        if (digitalRead(BotonBajar) == LOW && (millis() - ultimoTiempoRebote) > retardoRebote) {
            ultimoTiempoRebote = millis();
            indiceMenu--;
            if (indiceMenu < 0) {
                indiceMenu = elementosMenu - 1;
            }
            actualizarMenu();
        }

        // Manejo del Boton Enter para iniciar opción
        if (digitalRead(BotonEnter) == LOW && (millis() - ultimoTiempoRebote) > retardoRebote) {
            ultimoTiempoRebote = millis();
            ejecutandoOpcion = true;
            opcionActual = indiceMenu;
            lcd_1.clear();
            lcd_1.setCursor(0, 0);
            lcd_1.print("Ejecutando...");
           Serial.print(digitalRead(BotonEnter));
        }
    } else {
        // Ejecutar la opción seleccionada
        if (opcionActual == 0) 
            sensorDeGas(); 
        else if (opcionActual == 1) 
            alerta(); 
        else if (opcionActual == 2)
            sensorHumedad();
        else if (opcionActual == 3)
            alarma(); 
        else if (opcionActual == 4)
            sensorDeLuzAmbiental();
    }
}

// Definición de las funciones
void sensorDeGas() {
  Serial.print(digitalRead(BotonEnter));
    lcd_1.setCursor(0, 1);
    lcd_1.print("Sensor de Gas");
    while (ejecutandoOpcion) {
        Gas = analogRead(A0); // Lectura del sensor de gas
        if (Gas >= 500) {
            tone(piezo, 523, 200);
            digitalWrite(LED, HIGH);
            delay(500);
           lcd_1.setCursor(0,0);
   			lcd_1.print("    EVACUAR  ");
          lcd_1.setCursor(0,1);
   			lcd_1.print("   Fuga de GAS    ");
        } else {
            digitalWrite(LED, LOW); 
          lcd_1.setCursor(0,0);
   			lcd_1.print("   Analizando   ");
          lcd_1.setCursor(0,1);
   			lcd_1.print("Presencia de GAS    ");
        }
        if(digitalRead(BotonEnter) == LOW) {
           Serial.print(digitalRead(BotonEnter));  
          ejecutandoOpcion = false;
            lcd_1.clear();
            lcd_1.print("Opciones:");
            actualizarMenu();
        }
    }
}

void sensorHumedad() {
    lcd_1.setCursor(0, 1);
    lcd_1.print("Sensor Humedad");
    while (ejecutandoOpcion) {
        Humedad = map(analogRead(A1), 0, 1023, 0, 100);
        lcd_1.setCursor(0, 0);
        lcd_1.print("Humedad:   " + String(Humedad) + "    ");
        Serial.println(String(Humedad));
        lcd_1.setCursor(0, 1);  // Mover el cursor a la segunda línea
        if (Humedad <= 20) {
            lcd_1.print("Escasez De Agua   ");
            tone(piezo, 500, 200);
        } else if (Humedad >= 85) {
            lcd_1.print("Demasiada Agua     ");
            tone(piezo, 500, 200);
        } else {
            lcd_1.print("Nivel Normal      ");
        }
        if (digitalRead(BotonEnter) == LOW) {
            ejecutandoOpcion = false;
            lcd_1.clear();
            lcd_1.print("Opciones:");
            actualizarMenu();
        }
    }
}

void alarma() {
    lcd_1.setCursor(0, 1);
    lcd_1.print("Alarma");
    while (ejecutandoOpcion) {
        PIRDato = digitalRead(PIR);
        Serial.println(PIRDato);

        if (PIRDato == HIGH) {
            tone(piezo, 523, 200);
            digitalWrite(LED, HIGH);
            lcd_1.setCursor(0, 0);
    		lcd_1.print("Movimiento  ");
           lcd_1.setCursor(0, 1);
    		lcd_1.print("Detectado    ");
           lcd_1.setCursor(0, 0);
    		lcd_1.print("Alertando a las  ");
           lcd_1.setCursor(0, 1);
    		lcd_1.print("Autoridades    ");
          delay(500);
        } else {
            digitalWrite(LED, LOW);
           lcd_1.setCursor(0, 0);
    		lcd_1.print("   Area bajo   ");
           lcd_1.setCursor(0, 1);
    		lcd_1.print("   Control   ");
        }

        if (digitalRead(BotonEnter) == LOW) {
            ejecutandoOpcion = false;
            lcd_1.clear();
            lcd_1.print("Opciones:");
            actualizarMenu();
        }
    }
}

void alerta() {
    lcd_1.clear();
    lcd_1.setCursor(0, 0);
    lcd_1.print(" *Emergencia* ");
    lcd_1.setCursor(0, 1);
    lcd_1.print("Activacion completa");
    while (ejecutandoOpcion) {
        if (digitalRead(BotonEnter) == LOW) {
            ejecutandoOpcion = false;
            lcd_1.clear();
            lcd_1.print("Opciones:");
            actualizarMenu();
        }
    }
}

void sensorDeLuzAmbiental() {
    lcd_1.setCursor(0, 1);
    lcd_1.print("Sensor de Luz");
    while (ejecutandoOpcion) {
        valorsensorluz = analogRead(sensordeluz); // Lee el valor del sensor

        if (valorsensorluz > 20) { // Si el valor es mayor que 20
            digitalWrite(foco, HIGH);
          lcd_1.setCursor(0, 0);
    lcd_1.print("Baja Luz      ");
           lcd_1.setCursor(0, 1);
    lcd_1.print("Foco Encendido  ");
            delay(500);             // Espera un segundo
        } else {
            digitalWrite(foco, LOW); 
                 lcd_1.setCursor(0, 0);
    lcd_1.print("Luz Ambiental   ");
           lcd_1.setCursor(0, 1);
    lcd_1.print("Foco Apagado   ");
            delay(500);  
        }
        if (digitalRead(BotonEnter) == LOW) {
            ejecutandoOpcion = false;
            lcd_1.clear();
            lcd_1.print("Opciones:");
            actualizarMenu();
        }
    }
}

// Función para actualizar el menú en la pantalla LCD
void actualizarMenu() {
    lcd_1.setCursor(0, 1);
    lcd_1.print(menu[indiceMenu]);
}

Hola @joaquinpin07 ,

Perdona, pero a mí me parece o esta misma pregunta estaba publicada en otra sección del foro?
Porque la otra publicación ya había sido respondido y por eso la dejé pasar...
Si me he confundido intentaré ayudarlos.

Saludos.

Gaby.//

Moderador
Al menos este usuario no tiene mas preguntas en el foro.

Alguin puede ayudarme ??

Intente replicar tu código pero la librería

#include <Adafruit_LiquidCrystal.h>

Adafruit_LiquidCrystal lcd_1(0);

No se si pertenece a un LCD I2C o qué? No pude hacer que funcione.

Si un LCD 12C

En un simulador aclaro.

Descubri que solo se traba si dentro de la funcion tengo otros sensores que la funcion debe detectar. Si la funcion esta vacia no se traba como puedo corregirlo

No es que se trabe, lo que ocurre es que las funciones que llaman a otros sensores no tienen limite de tiempo y no devuelven el control, en otras palabras son bloqueantes.
Cuando escribes código debes pensar las cosas (eso se va aprendiendo como ahora con los errores) para que éstas no se queden esperando toda la vida, así que o bien le das un tiempo y si no reacciona devuelve el control o las interrogas y sigues con todo lo demás.

Veamos el caso de

void sensorDeLuzAmbiental() {

Mira qué hace

while (ejecutandoOpcion) {

Mientras ejecuandoOpcion este en true se queda clavado ahí y eso depende de que tu presiones

if (digitalRead(BotonEnter) == LOW) {
            ejecutandoOpcion = false;

Que tiene que ver el BotonEnter en una función que lee un sensor?
Es un error de programación, o sea de cómo encaras el problema. Claramente cuando uno empieza no conoce esto. Si estudias ingeniería de softwaware te enseñan a ser estructurado.

Deberías leer el sensor o sea

valorsensorluz = analogRead(sensordeluz); // Lee el valor del sensor

y nada mas.
Las acciones de control que encienden, apagan, bajan o suben la intensidad de luz deben ir en otro bloque.
El control del menú va en otro bloque.
Tienes un perfecto entre cruzamiento que es el responsable de estos inconvenientes.
Se entiende?

Si su loop fuera algo asi

void loop() {
    leoSensores();
    accionesDeControl();
    actualizarMenu();
}

la cosa funcionaría de otro modo, pero en cada uno de ellos no debe haber delay(), ni nada del tipo

while(me quedo toda la vida esperando que cambie)

y toma con humor esto último. Es ilustrativo.