Buenas noches! tengo el siguiente problema... tengo un interruptor de esos de palanca que sube y baja, cuando la palanca está abajo, está en el LCD la pantalla principal en la que todo funciona perfectamente, y cuando subo la palanca, entra al menú... en el menú hay otro submenú y cuando pulso la tecla 1 o pulso la tecla 2 en un teclado de esos de 4x4 debería de acceder a la opción marcada del submenú, pero se queda en la pantalla principal del menú, sin acceder a los submenús. "que creo que sí que accede al submenú, pero como es llevado desde el loop si la palanca está arriba, y sigue arriba, pues vuelve a la pantalla principal del menú" pensé que quizás poniendo un pulsador pull up en vez de un interruptor de palanca lo arreglaría, pero me pasa lo mismo... mientras está pulsado el pulsador, accedo al menú,una vez en el menú pulso la tecla 1 o 2 para navegar por el submenú y creo que por una milésima de segundo se visualiza el submenú, pero automáticamente vuelve a cargar la pantalla del menú llamada desde el loop y cuando suelto el pulsador, vuelve a la pantalla principal...
El código es este:
#include <Time.h>
#include <TimeAlarms.h>
#include <DS1307RTC.h>
#include <LiquidCrystal.h>
#include <Keypad.h>
int botonestado = 0;
int viejoestado = 0;
// 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
void loop(){
// Creamos el objeto key, para el keypad
char key = keypad.getKey();
// String caracterpresionado(key);
if (digitalRead(botonmenu) == LOW) {
menu(); //AQUÍ ES DONDE AL TENER LA PALANCA HACIA ARRIBA ESTÁ EN LOW Y ENTRA AL MENÚ
}else{ resto del código de la pantalla principal.... "la cual funciona muy bien" }
}
void menu(){
// Texto a mostrar en pantalla LCD
lcd.setCursor(0,0);
lcd.write(" Elija una opcion ");
lcd.setCursor(0,2);
lcd.write("1 - Horarios riegos ");
lcd.setCursor(0,3);
lcd.write("2 - inicio y fin ");
lcd.setCursor(0,1);
lcd.write(" ");
// Método de selección de opciones
char key1 = keypad.getKey();
if (key1 == '1') {
Serial.print("Menú de horarios y riegos");
modificaralarmas();
}
if (key1 == '2') {
Serial.print("Definir variables de inicio y fin de riegos");
definirvariablesinicioyfin();
}
}
// Función principal para modificar las alarmas de riego
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();
}
}
void definirvariablesinicioyfin(){
"aun por definir la función..."
}
Alguna idea de cómo hacer para que una vez que desde el if que hay en el loop, me lleve a entrar en la función menu() que está fuera del loop, deje de dar vueltas y entras una y otra vez y no dejarme navegar por los submenús??????
GRACIAS!!!!