#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <EEPROM.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int set_button_pin = 27;
const int hour_button_pin = 12;
const int minute_button_pin = 13;
int hora_actual = 0;
int minuto_actual = 0;
int hora_riego = 0;
int minuto_riego = 0;
int hora_abierto = 0;
int minuto_abierto = 0;
bool modo_configuracion = false;
bool hora_actual_configurada = false;
bool hora_riego_configurada = false;
unsigned long set_button_press_time = 0;
const unsigned long set_button_hold_time = 5000;
void setup() {
pinMode(set_button_pin, INPUT_PULLUP);
pinMode(hour_button_pin, INPUT_PULLUP);
pinMode(minute_button_pin, INPUT_PULLUP);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
// Inicializar la EEPROM con valores predeterminados
EEPROM.begin(512);
EEPROM.write(0, 0); // Hora actual (horas)
EEPROM.write(1, 0); // Hora actual (minutos)
EEPROM.write(2, 0); // Hora de riego (horas)
EEPROM.write(3, 0); // Hora de riego (minutos)
EEPROM.write(4, 0); // Hora de "Abierto" (horas)
EEPROM.write(5, 0); // Hora de "Abierto" (minutos)
EEPROM.commit();
// Leer los valores guardados de la EEPROM
hora_actual = EEPROM.read(0);
minuto_actual = EEPROM.read(1);
hora_riego = EEPROM.read(2);
minuto_riego = EEPROM.read(3);
hora_abierto = EEPROM.read(4);
minuto_abierto = EEPROM.read(5);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("ACTUAL: " + formato_dos_digitos(hora_actual) + ":" + formato_dos_digitos(minuto_actual));
display.println("Riego: " + formato_dos_digitos(hora_riego) + ":" + formato_dos_digitos(minuto_riego));
display.println("Abierto: " + formato_dos_digitos(hora_abierto) + ":" + formato_dos_digitos(minuto_abierto));
display.display();
delay(2000);
}
void loop() {
// Verificar si se debe entrar en modo de configuración
if (digitalRead(set_button_pin) == LOW) {
unsigned long current_time = millis();
if (current_time - set_button_press_time >= set_button_hold_time) {
modo_configuracion = true;
hora_actual_configurada = false;
hora_riego_configurada = false;
hora_actual = 0;
minuto_actual = 0;
hora_riego = 0;
minuto_riego = 0;
hora_abierto = 0;
minuto_abierto = 0;
set_button_press_time = current_time;
}
} else {
if (modo_configuracion) {
if (!hora_actual_configurada) {
configurar_hora_actual();
} else if (!hora_riego_configurada) {
configurar_hora_riego();
} else {
modo_configuracion = false;
// Guardar los valores de configuración en la EEPROM
EEPROM.write(0, hora_actual);
EEPROM.write(1, minuto_actual);
EEPROM.write(2, hora_riego);
EEPROM.write(3, minuto_riego);
EEPROM.write(4, hora_abierto);
EEPROM.write(5, minuto_abierto);
EEPROM.commit();
}
}
}
// Actualizar la hora en pantalla si no está en modo de configuración
if (!modo_configuracion) {
actualizar_hora_pantalla();
}
// Pequeño retraso para evitar múltiples detecciones del botón
delay(200);
}
void configurar_hora_actual() {
// Mostrar mensaje de configuración de la hora actual
display.clearDisplay();
display.setCursor(0, 0);
display.println("Configurar Hora Actual:");
display.display();
// Variables para almacenar la hora y los minutos configurados
int nueva_hora = hora_actual;
int nuevo_minuto = minuto_actual;
// Loop de configuración de la hora actual
while (digitalRead(set_button_pin) == HIGH) {
// Incrementar la hora si se presiona el botón correspondiente
if (digitalRead(hour_button_pin) == LOW) {
nueva_hora = (nueva_hora + 1) % 24;
delay(200); // Retraso para evitar rebotes
}
// Incrementar los minutos si se presiona el botón correspondiente
if (digitalRead(minute_button_pin) == LOW) {
nuevo_minuto = (nuevo_minuto + 1) % 60;
delay(200); // Retraso para evitar rebotes
}
// Mostrar la hora actual en pantalla
display.clearDisplay();
display.setCursor(0, 10);
display.print("Hora Actual: ");
display.print(formato_dos_digitos(nueva_hora));
display.print(":");
display.print(formato_dos_digitos(nuevo_minuto));
display.display();
}
// Almacenar la hora actual configurada
hora_actual = nueva_hora;
minuto_actual = nuevo_minuto;
hora_actual_configurada = true;
}
void configurar_hora_riego() {
// Mostrar mensaje de configuración de la hora de riego
display.clearDisplay();
display.setCursor(0, 20);
display.println("Configurar Hora Riego:");
display.display();
// Variables para almacenar la hora y los minutos configurados
int nueva_hora = hora_riego;
int nuevo_minuto = minuto_riego;
// Loop de configuración de la hora de riego
while (digitalRead(set_button_pin) == HIGH) {
// Incrementar la hora si se presiona el botón correspondiente
if (digitalRead(hour_button_pin) == LOW) {
nueva_hora = (nueva_hora + 1) % 24;
delay(200); // Retraso para evitar rebotes
}
// Incrementar los minutos si se presiona el botón correspondiente
if (digitalRead(minute_button_pin) == LOW) {
nuevo_minuto = (nuevo_minuto + 1) % 60;
delay(200); // Retraso para evitar rebotes
}
// Mostrar la hora de riego en pantalla
display.clearDisplay();
display.setCursor(0, 30);
display.print("Riego: ");
display.print(formato_dos_digitos(nueva_hora));
display.print(":");
display.print(formato_dos_digitos(nuevo_minuto));
display.display();
}
// Almacenar la hora de riego configurada
hora_riego = nueva_hora;
minuto_riego = nuevo_minuto;
hora_riego_configurada = true;
}
void actualizar_hora_pantalla() {
// Actualizar la hora actual y la hora de riego en pantalla
display.clearDisplay();
display.setCursor(0, 0);
display.print("ACTUAL: ");
display.print(formato_dos_digitos(hora_actual));
display.print(":");
display.print(formato_dos_digitos(minuto_actual));
display.setCursor(0, 10);
display.print("Riego: ");
display.print(formato_dos_digitos(hora_riego));
display.print(":");
display.print(formato_dos_digitos(minuto_riego));
display.setCursor(0, 20);
display.print("Abierto: ");
display.print(formato_dos_digitos(hora_abierto));
display.print(":");
display.print(formato_dos_digitos(minuto_abierto));
display.display();
}
String formato_dos_digitos(int numero) {
if (numero < 10) {
return "0" + String(numero);
} else {
return String(numero);
}
}