#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.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; // Pin para el botón de establecer modo de configuración
const int hour_button_pin = 12; // Pin para el botón de incrementar horas
const int minute_button_pin = 13; // Pin para el botón de incrementar minutos
int hora_actual = 0;
int minuto_actual = 0;
int hora_riego = 0;
int minuto_riego = 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; // Tiempo en milisegundos para mantener pulsado el botón de configuración
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 (;;);
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("ACTUAL: 00:00");
display.println("Riego: 00:00");
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;
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;
}
}
}
// 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.display();
}
// Función para formatear un número en dos dígitos con un cero delante si es necesario
String formato_dos_digitos(int numero) {
if (numero < 10) {
return "0" + String(numero);
} else {
return String(numero);
}
}