#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_SET_PIN 15
#define BUTTON_HOUR_PIN 12
#define BUTTON_MINUTE_PIN 13
int address = 0; // Dirección de inicio en la EEPROM
bool setMode = false;
bool outputTimeEditMode = false;
bool systemLocked = false;
bool saveMode = false; // Indica si estamos en modo de guardar
unsigned long lastButtonActivityTime = 0;
unsigned long setButtonStartTime = 0; // Tiempo de inicio de la pulsación del botón SET
unsigned long saveMessageStartTime = 0; // Tiempo de inicio de la visualización del mensaje de guardado
int currentHour = 0;
int currentMinute = 0;
int outputHour = 0;
int outputMinute = 0;
void setup() {
Serial.begin(9600);
pinMode(BUTTON_SET_PIN, INPUT_PULLUP);
pinMode(BUTTON_HOUR_PIN, INPUT_PULLUP);
pinMode(BUTTON_MINUTE_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("Time: 00:00");
display.println("Output: 00:00");
display.display();
EEPROM.begin(512);
}
void loop() {
updateClock();
handleButtons();
}
void updateClock() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Time: ");
display.print(currentHour / 10);
display.print(currentHour % 10);
display.print(":");
display.print(currentMinute / 10);
display.print(currentMinute % 10);
display.println();
display.print("Output: ");
display.print(outputHour / 10);
display.print(outputHour % 10);
display.print(":");
display.print(outputMinute / 10);
display.print(outputMinute % 10);
if (saveMode) {
display.println();
display.println("Guardado");
}
display.display();
}
void handleButtons() {
int readingSet = digitalRead(BUTTON_SET_PIN);
int readingHour = digitalRead(BUTTON_HOUR_PIN);
int readingMinute = digitalRead(BUTTON_MINUTE_PIN);
if (readingSet == LOW || readingHour == LOW || readingMinute == LOW) {
lastButtonActivityTime = millis();
}
if (!systemLocked && readingSet == LOW && !setMode) {
setMode = true;
outputTimeEditMode = false;
saveMode = false;
setButtonStartTime = millis();
}
if (setMode) {
if (millis() - setButtonStartTime >= 2000) {
saveMode = true;
EEPROM.write(address, outputHour);
EEPROM.write(address + 1, outputMinute);
EEPROM.commit();
saveMessageStartTime = millis();
}
if (outputTimeEditMode && readingHour == LOW) {
outputHour = (outputHour + 1) % 24;
}
if (outputTimeEditMode && readingMinute == LOW) {
outputMinute = (outputMinute + 1) % 60;
}
if (readingSet == LOW && millis() - setButtonStartTime < 2000) {
setMode = false; // Salir del modo de configuración si se presiona SET brevemente
outputTimeEditMode = true; // Entrar en modo de edición de la hora de salida
}
}
if (saveMode && millis() - saveMessageStartTime >= 3000) {
saveMode = false;
}
}