Hola comunidad, se me presento un problema al implementar un menu a este sistema de seguridad.
El codigo asi como esta funciona perfecto. Lo que hace es que al apretar cualquier tecla del keypad ya la toma para que compararla con la contraseña y mi idea es que mientres este inactivo el sistema se muestre en el lcd la hora/fecha y humedad/temperatura y al apretar por ejemplo la A entre al menu y no me lo tome como una parte de la contraseña, la unica manera de poder armarla y desarmarla seria de apretar la D por ejemplo y ay recien me habilete todas las teclas para poder ingresar la contraseña, osea la secuencia seria D + 1234 + * armar alarma / D + 1234 + # desarmar alarma.
Mi otro problema que hace rato estoy luchando y no logro hacerlo funcionar es el menu, al apretar la A ingresa al menu con el 2 subo las opciones, el 8 bajo las opciones y el 5 confirmo, ese menu es para poder poner en hora el RTC, cambiar la contraseña, y a futuro (falta todavia realizar el codigo) controlar luces con horarios, habilitar-desabilitar zonas, ver ultimos eventos...
Nose si servira pero tengo una shield para leer eeprom capas que se pueden ay guardar las variable.
No pretendo que me hagan el codigo sino con una mano es suficiente...
Lo subo al skecht porque sino no me da la cantidad de caracteres...
Pd: Al codigo falta depurarlo un poco, tiene mucho delays y esta desordenado pero funciona luego le dare el fino...
Bueno despues de investigar un poco y ver codigos por la web, hise algo que funciona con el keypad, pero mi duda (capas es muy obvio pero no me doy cuenta) es que cuando apararece por ejemplo 1.Ajustar Hora y aprete la C (enter) me valla al loop de setear la hora, y tambien como salir del menu ya que al apretar la D sale del menu pero aparece en pantalla MenuRoot..
El codigo...
#include <MenuBackend.h>
#include <Keypad.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'#','0','*','D'}
};
byte rowPins[ROWS] = {25, 24, 23, 22};
byte colPins[COLS] = {29, 28, 27, 26};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
//this controls the menu backend and the event generation
MenuBackend menu = MenuBackend(menuUseEvent,menuChangeEvent);
//beneath is list of menu items needed to build the menu
MenuItem Inicio = MenuItem("Menu");
MenuItem Ajuste_Hora = MenuItem("1.Ajustar Hora");
MenuItem Ajuste_Fecha = MenuItem("2.Ajustar Fecha");
MenuItem Control_Luces = MenuItem("3.Control Luces");
MenuItem Zonas = MenuItem("4.Zonas");
MenuItem Eventos = MenuItem("5.Eventos");
MenuItem Autochequeo = MenuItem("6.Autochequeo");
//this function builds the menu and connects the correct items together
void menuSetup()
{
menu.getRoot().add(Inicio);
//setup the settings menu item
Inicio.addAfter(Inicio);
Inicio.addLeft(Inicio);
Inicio.addRight(Ajuste_Hora);
Ajuste_Hora.addRight(Ajuste_Hora);
Ajuste_Hora.addLeft(Inicio);
Ajuste_Hora.addAfter(Ajuste_Fecha);
Ajuste_Fecha.addRight(Ajuste_Fecha);
Ajuste_Fecha.addAfter(Control_Luces);
Control_Luces.addRight(Control_Luces);
Control_Luces.addAfter(Zonas);
Zonas.addRight(Zonas);
Zonas.addAfter(Eventos);
Autochequeo.addAfter(Ajuste_Hora);
/*
This is an important function
Here all use events are handled
This is where you define a behaviour for a menu item
*/
}
void menuUseEvent(MenuUseEvent used)
{
}
/*
This is an important function
Here we get a notification whenever the user changes the menu
That is, when the menu is navigated
*/
void menuChangeEvent(MenuChangeEvent changed)
{
lcd.setCursor(0, 0);
lcd.print(changed.to.getName());
}
void setup()
{
//Serial.begin(9600);
lcd.begin(16, 2);
menuSetup();
lcd.print("Up:A Down:B Use:C");
lcd.setCursor(0, 1);
lcd.print("Left:* Right:#");
}
void loop()
{
char key = keypad.getKey();
if(key != NO_KEY) {
switch (key) {
case 'A':
lcd.clear();
menu.moveUp();
break;
case 'B':
lcd.clear();
menu.moveDown();
break;
case '*':
lcd.clear();
menu.moveRight();
break;
case '#':
lcd.clear();
menu.moveLeft();
break;
case 'C':
lcd.clear();
menu.use();
break;
case 'D':
lcd.clear();
menu.toRoot();
break;
}
}
}
Bueno Gente edito el post al rato de postear mire el codigo y me di cuenta donde va la cadena de funciones
void menuUseEvent(MenuUseEvent used)
{
if (used.item == Ajuste_Hora)
{
//Aca va la funcion para cambio de hora
}
if (used.item == Ajuste_Fecha)
{
//Aca va la funcion para cambio de fecha
}
}