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]);
}