#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_UP_PIN 12
#define BUTTON_DOWN_PIN 13
#define BUTTON_SET_PIN 14
#define BUTTON_MODE_PIN 15
int hours = 0;
int minutes = 0;
bool buttonUpPressed = false;
bool buttonDownPressed = false;
bool buttonSetPressed = false;
bool buttonModePressed = false;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
void setup() {
pinMode(BUTTON_UP_PIN, INPUT_PULLUP);
pinMode(BUTTON_DOWN_PIN, INPUT_PULLUP);
pinMode(BUTTON_SET_PIN, INPUT_PULLUP);
pinMode(BUTTON_MODE_PIN, INPUT_PULLUP);
Serial.begin(9600);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Dirección 0x3C para la pantalla OLED
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.display(); // Inicializar la pantalla
delay(2000);
display.clearDisplay(); // Limpiar la pantalla
// Mostrar mensaje de bienvenida
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println("Sistema de Riego");
display.println(" Bienvenido ");
display.display();
delay(2000);
// Leer ajustes de la EEPROM
EEPROM.begin(512);
EEPROM.get(0, hours);
EEPROM.get(sizeof(hours), minutes);
EEPROM.end();
}
void loop() {
// Actualizar el tiempo si se presionan los botones correspondientes
int upButtonState = digitalRead(BUTTON_UP_PIN);
int downButtonState = digitalRead(BUTTON_DOWN_PIN);
int setButtonState = digitalRead(BUTTON_SET_PIN);
int modeButtonState = digitalRead(BUTTON_MODE_PIN);
if (upButtonState == LOW && !buttonUpPressed) {
buttonUpPressed = true;
minutes++;
}
if (downButtonState == LOW && !buttonDownPressed) {
buttonDownPressed = true;
minutes--;
}
if (setButtonState == LOW && !buttonSetPressed) {
buttonSetPressed = true;
hours++;
}
if (modeButtonState == LOW && !buttonModePressed) {
buttonModePressed = true;
hours--;
}
if (upButtonState == HIGH && buttonUpPressed) {
buttonUpPressed = false;
}
if (downButtonState == HIGH && buttonDownPressed) {
buttonDownPressed = false;
}
if (setButtonState == HIGH && buttonSetPressed) {
buttonSetPressed = false;
}
if (modeButtonState == HIGH && buttonModePressed) {
buttonModePressed = false;
}
// Asegurarse de que los minutos y las horas permanezcan dentro del rango válido
if (minutes < 0) {
minutes = 59;
}
if (minutes > 59) {
minutes = 0;
}
if (hours < 0) {
hours = 23;
}
if (hours > 23) {
hours = 0;
}
// Guardar ajustes en la EEPROM
EEPROM.begin(512);
EEPROM.put(0, hours);
EEPROM.put(sizeof(hours), minutes);
EEPROM.commit();
EEPROM.end();
// Mostrar la hora en la pantalla OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.print("Hora: ");
display.print(hours);
display.print(":");
if (minutes < 10) {
display.print("0");
}
display.println(minutes);
display.display();
}