hola, estoy haciendo una alarma de casa, ya saben las típicas con un lcd, un teclado, añadí el modulo rtc para mostrar la hora en la pantalla después de un cierto tiempo de inactividad, es eso no tengo problema, el problema es que quiero que el usuario pueda configurar la hora como lo hacemos en los celulares.
después de intentarlo un poco he conseguido esto:
#include <LiquidCrystal_I2C.h>
#include<Wire.h>
#include <Keypad.h>
#include <RTClib.h>
const byte FILAS = 4; // define numero de filas
const byte COLUMNAS = 4; // define numero de columnas
char keys[FILAS][COLUMNAS] = { // define la distribucion de teclas
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte pinesFilas[FILAS] = {5,4,3,2};
byte pinesColumnas[COLUMNAS] = {9,8,7,6};
Keypad teclado = Keypad(makeKeymap(keys), pinesFilas, pinesColumnas, FILAS, COLUMNAS);
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x3f,16,2);
int POSICION_COLUMNA = 6;
int POSICION_FILA = 0;
int CONTINUIDAD = 0;
char TECLA;
char ATRAS = '*';
char UP = 'A';
char DOWN = 'B';
char ENTER = '#';
int YEAR;
int MONT;
int DAY;
int HOUR;
int MINUT;
int SRCOND;
void setup() {
lcd.init();
lcd.backlight();
lcd.begin(16, 2);
if (! rtc.begin()) {
Serial.println("Modulo RTC no encontrado !");
}
rtc.adjust(DateTime(__DATE__, __TIME__));
}
void loop() {
DateTime fecha = rtc.now();
lcd.cursor();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("fecha 30/09/2020");
lcd.setCursor(0,1);
lcd.print("hora 20:00:00");
lcd.setCursor(POSICION_COLUMNA,POSICION_FILA);
while (true){
if (CONTINUIDAD == 0){
TECLA = teclado.getKey();
}
if (TECLA){
if (TECLA == DOWN){
if (POSICION_FILA == 0){
if (POSICION_COLUMNA == 6){
CONTINUIDAD = 0;
}
else if (POSICION_COLUMNA == 9){
POSICION_COLUMNA--;
POSICION_COLUMNA--;
lcd.setCursor(POSICION_COLUMNA,POSICION_FILA);
CONTINUIDAD = 0;
}
else if (POSICION_COLUMNA == 11){
POSICION_COLUMNA--;
POSICION_COLUMNA--;
lcd.setCursor(POSICION_COLUMNA,POSICION_FILA);
CONTINUIDAD = 0;
}
else{
POSICION_COLUMNA --;
lcd.setCursor(POSICION_COLUMNA,POSICION_FILA);
CONTINUIDAD = 0;
}
}
else{
if (POSICION_COLUMNA == 5){
POSICION_FILA = 0;
POSICION_COLUMNA = 14;
lcd.setCursor(POSICION_COLUMNA,POSICION_FILA);
CONTINUIDAD = 0;
}
else if (POSICION_COLUMNA == 8){
POSICION_COLUMNA--;
POSICION_COLUMNA--;
lcd.setCursor(POSICION_COLUMNA,POSICION_FILA);
CONTINUIDAD = 0;
}
else if (POSICION_COLUMNA == 11){
POSICION_COLUMNA--;
POSICION_COLUMNA--;
lcd.setCursor(POSICION_COLUMNA,POSICION_FILA);
CONTINUIDAD = 0;
}
else{
POSICION_COLUMNA --;
lcd.setCursor(POSICION_COLUMNA,POSICION_FILA);
CONTINUIDAD = 0;
}
}
}
else if (TECLA == UP){
if (POSICION_FILA == 0){
if (POSICION_COLUMNA == 7){
POSICION_COLUMNA++;
POSICION_COLUMNA++;
lcd.setCursor(POSICION_COLUMNA,POSICION_FILA);
CONTINUIDAD = 0;
}
else if (POSICION_COLUMNA == 9){
POSICION_COLUMNA++;
POSICION_COLUMNA++;
lcd.setCursor(POSICION_COLUMNA,POSICION_FILA);
CONTINUIDAD = 0;
}
else if (POSICION_COLUMNA == 14){
POSICION_FILA = 1;
POSICION_COLUMNA = 5;
lcd.setCursor(POSICION_COLUMNA,POSICION_FILA);
CONTINUIDAD = 0;
}
else{
POSICION_COLUMNA ++;
lcd.setCursor(POSICION_COLUMNA,POSICION_FILA);
CONTINUIDAD = 0;
}
}
else{
if (POSICION_COLUMNA == 6){
POSICION_COLUMNA++;
POSICION_COLUMNA++;
lcd.setCursor(POSICION_COLUMNA,POSICION_FILA);
CONTINUIDAD = 0;
}
else if (POSICION_COLUMNA == 9){
POSICION_COLUMNA++;
POSICION_COLUMNA++;
lcd.setCursor(POSICION_COLUMNA,POSICION_FILA);
CONTINUIDAD = 0;
}
else if (POSICION_COLUMNA == 12){
CONTINUIDAD = 0;
}
else{
POSICION_COLUMNA ++;
lcd.setCursor(POSICION_COLUMNA,POSICION_FILA);
CONTINUIDAD = 0;
}
}
}
else{
lcd.print(TECLA);
POSICION_COLUMNA++;
lcd.setCursor(POSICION_COLUMNA,POSICION_FILA);
CONTINUIDAD = 0;
if (POSICION_FILA == 0){
if (POSICION_COLUMNA == 8){
POSICION_COLUMNA++;
lcd.setCursor(POSICION_COLUMNA,POSICION_FILA);
CONTINUIDAD = 0;
}
else if (POSICION_COLUMNA == 10){
POSICION_COLUMNA++;
lcd.setCursor(POSICION_COLUMNA,POSICION_FILA);
CONTINUIDAD = 0;
}
else if (POSICION_COLUMNA == 15){
POSICION_FILA = 1;
POSICION_COLUMNA = 5;
lcd.setCursor(POSICION_COLUMNA,POSICION_FILA);
CONTINUIDAD = 0;
}
}
else{
if (POSICION_COLUMNA == 7){
POSICION_COLUMNA++;
lcd.setCursor(POSICION_COLUMNA,POSICION_FILA);
CONTINUIDAD = 0;
}
else if (POSICION_COLUMNA == 10){
POSICION_COLUMNA++;
lcd.setCursor(POSICION_COLUMNA,POSICION_FILA);
CONTINUIDAD = 0;
}
else if (POSICION_COLUMNA == 12){
lcd.clear();
lcd.print("datos guardados");
delay(1800);
CONTINUIDAD = 0;
break;
}
}
}
}
else{
while (true ){
TECLA = teclado.getKey();
DateTime fecha = rtc.now();
if (fecha.second()%2 == 0){
lcd.noCursor();
TECLA = teclado.getKey();
}
else {
lcd.cursor();
TECLA = teclado.getKey();
}
if (TECLA){
lcd.cursor();
CONTINUIDAD = 1;
break;
}
}
}
}
}
no estoy seguro si es la mejor forma de hacerlo, de la forma en que esta hecho he pensado en usar
rtc.adjust(DateTime(AÑO, MES, DIA, HORA, MINUTO, SEGUNDO));
para establecer la hora pero no se como hacer que las variables tomen el valor que les corresponde, podría poner un condicional para cada posición de columna y fila pero el código se alargaría demasiado y ya esta demasiado extenso, por favor si alguien tiene una idea de como hacerlo le agradecería mucho