#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);
#define BUTTON_HOUR_PIN 12
#define BUTTON_MINUTE_PIN 13
#define BUTTON_SET_PIN 15
#define BUTTON_DAY_1 2
#define BUTTON_DAY_2 3
#define BUTTON_DAY_3 4
#define BUTTON_DAY_4 5
#define BUTTON_DAY_5 6
#define BUTTON_DAY_6 7
#define BUTTON_DAY_7 8
#define RIEGO_EEPROM_ADDR 0
int currentHour = 0;
int currentMinute = 0;
bool programacionRiego[7] = {false}; // Inicializamos todos los días como desactivados
void setup() {
Serial.begin(9600);
pinMode(BUTTON_HOUR_PIN, INPUT_PULLUP);
pinMode(BUTTON_MINUTE_PIN, INPUT_PULLUP);
pinMode(BUTTON_SET_PIN, INPUT_PULLUP);
pinMode(BUTTON_DAY_1, INPUT_PULLUP);
pinMode(BUTTON_DAY_2, INPUT_PULLUP);
pinMode(BUTTON_DAY_3, INPUT_PULLUP);
pinMode(BUTTON_DAY_4, INPUT_PULLUP);
pinMode(BUTTON_DAY_5, INPUT_PULLUP);
pinMode(BUTTON_DAY_6, INPUT_PULLUP);
pinMode(BUTTON_DAY_7, 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.display();
// Cargamos la programación de riego desde la EEPROM
cargarProgramacionRiego();
}
void loop() {
// Actualizamos la hora
updateClock();
// Manejo de botones
handleButtons();
// Mostramos la programación de riego en la pantalla
displayProgramacionRiego();
}
void updateClock() {
// Aquí iría el código para actualizar la hora actual
// Por ejemplo, puedes utilizar un módulo RTC o la función millis() para llevar un seguimiento del tiempo
// Por simplicidad, usaremos un contador en lugar de un reloj en tiempo real
// Simulación: Contador para la hora y los minutos
currentMinute++;
if (currentMinute == 60) {
currentMinute = 0;
currentHour++;
if (currentHour == 24) {
currentHour = 0;
}
}
}
void handleButtons() {
// Aquí iría el código para manejar los botones y ajustar la hora, la programación del riego, etc.
// Por simplicidad, solo simularemos el ajuste de la hora y la programación del riego
// Simulación: Ajuste de la hora
if (digitalRead(BUTTON_HOUR_PIN) == LOW) {
delay(50); // Debounce
currentHour++;
if (currentHour == 24) {
currentHour = 0;
}
}
// Simulación: Ajuste de los minutos
if (digitalRead(BUTTON_MINUTE_PIN) == LOW) {
delay(50); // Debounce
currentMinute++;
if (currentMinute == 60) {
currentMinute = 0;
}
}
// Simulación: Ajuste de la programación del riego
if (digitalRead(BUTTON_SET_PIN) == LOW) {
delay(50); // Debounce
for (int i = 0; i < 7; i++) {
programacionRiego[i] = !programacionRiego[i]; // Alternar entre activado y desactivado
}
guardarProgramacionRiego(); // Guardar la programación en la EEPROM
}
// Simulación: Selección individual de los días de la semana
if (digitalRead(BUTTON_DAY_1) == LOW) {
delay(50); // Debounce
programacionRiego[0] = !programacionRiego[0];
guardarProgramacionRiego(); // Guardar la programación en la EEPROM
}
if (digitalRead(BUTTON_DAY_2) == LOW) {
delay(50); // Debounce
programacionRiego[1] = !programacionRiego[1];
guardarProgramacionRiego(); // Guardar la programación en la EEPROM
}
if (digitalRead(BUTTON_DAY_3) == LOW) {
delay(50); // Debounce
programacionRiego[2] = !programacionRiego[2];
guardarProgramacionRiego(); // Guardar la programación en la EEPROM
}
if (digitalRead(BUTTON_DAY_4) == LOW) {
delay(50); // Debounce
programacionRiego[3] = !programacionRiego[3];
guardarProgramacionRiego(); // Guardar la programación en la EEPROM
}
if (digitalRead(BUTTON_DAY_5) == LOW) {
delay(50); // Debounce
programacionRiego[4] = !programacionRiego[4];
guardarProgramacionRiego(); // Guardar la programación en la EEPROM
}
if (digitalRead(BUTTON_DAY_6) == LOW) {
delay(50); // Debounce
programacionRiego[5] = !programacionRiego[5];
guardarProgramacionRiego(); // Guardar la programación en la EEPROM
}
if (digitalRead(BUTTON_DAY_7) == LOW) {
delay(50); // Debounce
programacionRiego[6] = !programacionRiego[6];
guardarProgramacionRiego(); // Guardar la programación en la EEPROM
}
}
void displayProgramacionRiego() {
// Mostrar la programación de riego en la pantalla OLED
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.print("Hora: ");
display.print(currentHour);
display.print(":");
if (currentMinute < 10) {
display.print("0"); // Añadir un cero para los minutos menores a 10
}
display.println(currentMinute);
// Mostrar los días de la semana dentro de un recuadro según el estado de la programación de riego
for (int i = 0; i < 7; i++) {
if (programacionRiego[i]) {
// Si el día está seleccionado, mostrar un recuadro alrededor del número
display.drawRect(10 + (i * 15) - 1, 20 - 1, 12, 12, SSD1306_WHITE);
}
display.setCursor(13 + (i * 15), 22);
display.print(i + 1);
}
display.display();
}
void cargarProgramacionRiego() {
// Cargar la programación de riego desde la EEPROM
for (int i = 0; i < 7; i++) {
programacionRiego[i] = EEPROM.read(RIEGO_EEPROM_ADDR + i);
}
}
void guardarProgramacionRiego() {
// Guardar la programación de riego en la EEPROM
for (int i = 0; i < 7; i++) {
EEPROM.write(RIEGO_EEPROM_ADDR + i, programacionRiego[i]);
}
EEPROM.commit(); // Escribir en la EEPROM
}