#include <EEPROM.h>
#include <Encoder.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal.h>
LiquidCrystal_I2C lcd (0x27, 16, 2);
struct HoRa { //struct Data {
int hora; // int hora;
int valorH; // int minuto;
}; //};
struct MinuTo{
int minuto;
int valorM;
};
MinuTo matrizM[60];
HoRa matrizH[24]; //Data matriz[60];
int pines [3]={ 8, 9,10};
int M = 0;
#define CLK_PIN 2
#define DT_PIN 3
#define SW_PIN 4
Encoder encoder(CLK_PIN, DT_PIN);
int currentMenu = 0;
int selectedHour = 0;
int selectedMinute = 0;
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
for (int M = 0; M < 4; M++) {
pinMode(pines[M], OUTPUT);
}
pinMode(SW_PIN, INPUT_PULLUP);
// Inicializar la matriz con direcciones y valores
for (int i = 0; i < 60; i++) {
matrizM[i].minuto = i;
matrizM[i].valorM = i ;
}
for (int j = 0; j < 24; j++) {
matrizH[j].hora = j;
matrizH[j].valorH = j ;
}
// Escribir la matriz en la EEPROM
int eeAddressM = 0; // Dirección de inicio en la EEPROM
int eeAddressH = sizeof(matrizM); // Desplazar después de matrizM
for (int i = 0; i < 60; i++) {
EEPROM.put(eeAddressM, matrizM[i]);
eeAddressM += sizeof(MinuTo);
delay(10); // Pequeña pausa para asegurar que la escritura en EEPROM sea exitosa
}
for (int j = 0; j < 24; j++) {
EEPROM.put(eeAddressH, matrizH[j]);
eeAddressH += sizeof(HoRa);
delay(10); // Pequeña pausa para asegurar que la escritura en EEPROM sea exitosa
}
Serial.println("Matriz escrita en la EEPROM");
// Leer y mostrar los valores y direcciones específicos de la EEPROM
for (int i = 0; i < 60; i++) {
MinuTo minuto;
EEPROM.get(i * sizeof(MinuTo), minuto);
if (minuto.valorM == 3 || minuto.valorM == 4 || minuto.valorM == 5) {
Serial.print("Minuto: ");
Serial.print(minuto.minuto);
Serial.print(", ValorM: ");
Serial.println(minuto.valorM);
}
}
for (int j = 0; j < 24; j++) {
HoRa hora;
EEPROM.get(sizeof(matrizM) + j * sizeof(HoRa), hora);
if (hora.valorH == 4 || hora.valorH == 23 || hora.valorH == 10) {
Serial.print("Hora: ");
Serial.print(hora.hora);
Serial.print(", ValorH: ");
Serial.println(hora.valorH);
if (hora.valorH == 4) {
digitalWrite(8, HIGH); // Encender el LED
} else {
digitalWrite(8, LOW); // Apagar el LED
}
}
}
}
void loop() {
// Leer y mostrar los valores de las matrices específicos de la EEPROM
for (int i = 0; i < 24; i++) {
HoRa hora;
EEPROM.get(i * sizeof(HoRa), hora);
if (hora.valorH == 4) {
digitalWrite(8, HIGH); // Encender el LED
} else {
digitalWrite(8, LOW); // Apagar el LED
}
delay(500); // Pequeña pausa para observar el estado del LED
}
//Ahora, el código enciende el LED en el bucle loop según el valor de valorH en la matriz de horas. Por favor, asegúrate de conectar correctamente el LED al pin 8 de tu Arduino y añade un resistor adecuado en serie con el LED para limitar la corriente.
//int hora =now.hour();
//int minuto =now.minute();
//int segundo = now.second();
/////////////////////////////////////
int encoderValue = encoder.read();
int buttonState = digitalRead(SW_PIN);
int selectedHourIndex = 0;
int selectedMinuteIndex = 0;
int selectedMenu = 0;
if (buttonState == LOW) {
selectedMenu = (selectedMenu + 1) % 3;
delay(300); // Añade un pequeño retraso para evitar múltiples cambios rápidos debido a rebotes del botón
}
lcd.clear();
if (selectedMenu == 0) {
lcd.print("Hour: ");
lcd.print(matrizH[selectedHourIndex].hora);
} else if (selectedMenu == 1) {
selectedMinuteIndex = (selectedMinuteIndex + encoderValue) % 60;
if (selectedMinuteIndex < 0) {
selectedMinuteIndex = 59;
}
lcd.print("Minute: ");
lcd.print(matrizM[selectedMinuteIndex].minuto);
} else if (selectedMenu == 2) {
lcd.print("Menu 3");
}
if (buttonState == LOW) {
if (selectedMenu == 0) {
Serial.println("Selected Hour: " + String(matrizH[selectedHourIndex].valorH));
} else if (selectedMenu == 1) {
Serial.println("Selected Minute: " + String(matrizM[selectedMinuteIndex].valorM));
}
}
delay(100);
}
if (encoderValue > 0) {
selectedMenu = (selectedMenu + 1) % 3;
} if (encoderValue < 0) {
selectedMenu = (selectedMenu + 2) % 3;
}
else if (selectedMenu == 1) {
selectedMinuteIndex = (selectedMinuteIndex + encoderValue) % 60;
if (selectedMinuteIndex < 0) {
selectedMinuteIndex = 59;
}
selectedMinute = matrizM[selectedMinuteIndex].minuto;
}
lcd.clear();
if (selectedMenu == 0) {
lcd.print("Hour: ");
lcd.print(matrizH[selectedHour].hora);
} if (selectedMenu == 1) {
selectedMinuteIndex = (selectedMinuteIndex + encoderValue) % 60;
else if (selectedMinuteIndex < 0) {
selectedMinuteIndex = 59;
}
selectedMinute = matrizM[selectedMinuteIndex].minuto;
delay(100);
lcd.print("Minute: ");
lcd.print(selectedMinute);
} if (selectedMenu == 2) {
lcd.print("Menu 3");
}
if (buttonState == LOW) {
if (selectedMenu == 0) {
// Do something with the selected hour
Serial.println("Selected Hour: " + String(matrizH[selectedHour].valorH));
} else if (selectedMenu == 1) {
// Do something with the selected minute
Serial.println("Selected Minute: " + String(matrizM[selectedMinute].valorM));
}
}
delay(100);
}