#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 = 14; // 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
const int second_button_pin = 15; // Pin para el botón de incrementar segundos
int hora = 0;
int minuto = 0;
int segundo = 0;
void setup() {
pinMode(set_button_pin, INPUT_PULLUP);
pinMode(hour_button_pin, INPUT_PULLUP);
pinMode(minute_button_pin, INPUT_PULLUP);
pinMode(second_button_pin, INPUT_PULLUP); // Definir el pin de los segundos como entrada
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.display();
delay(2000);
}
void loop() {
// Configurar el reloj si se presiona el botón
if (digitalRead(set_button_pin) == LOW) {
configurar_reloj();
}
// Incrementar la hora si se presiona el botón correspondiente
if (digitalRead(hour_button_pin) == LOW) {
hora = (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) {
minuto = (minuto + 1) % 60;
delay(200); // Retraso para evitar rebotes
}
// Incrementar los segundos si se presiona el botón correspondiente
if (digitalRead(second_button_pin) == LOW) {
segundo = (segundo + 1) % 60;
delay(200); // Retraso para evitar rebotes
}
// Actualizar el reloj
actualizar_reloj();
// Actualizar la hora en pantalla
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(25, 20);
display.print(formato_dos_digitos(hora));
display.print(":");
display.print(formato_dos_digitos(minuto));
display.print(":");
display.print(formato_dos_digitos(segundo));
display.display();
// Pequeño retraso para evitar múltiples detecciones del botón
delay(200);
}
void configurar_reloj() {
// Mostrar mensaje de configuración
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Configurar reloj:");
display.display();
// Variables para almacenar la hora y los minutos configurados
int nueva_hora = hora;
int nuevo_minuto = minuto;
int nuevo_segundo = segundo;
// Loop de configuración
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
}
// Incrementar los segundos si se presiona el botón correspondiente
if (digitalRead(second_button_pin) == LOW) {
nuevo_segundo = (nuevo_segundo + 1) % 60;
delay(200); // Retraso para evitar rebotes
}
// Mostrar la hora actual en pantalla
display.clearDisplay();
display.setTextSize(2);
display.setCursor(25, 20);
display.print(formato_dos_digitos(nueva_hora));
display.print(":");
display.print(formato_dos_digitos(nuevo_minuto));
display.print(":");
display.print(formato_dos_digitos(nuevo_segundo));
display.display();
}
// Almacenar la hora y los minutos configurados
hora = nueva_hora;
minuto = nuevo_minuto;
segundo = nuevo_segundo;
}
void actualizar_reloj() {
static unsigned long lastUpdateTime = millis(); // Variable para almacenar el tiempo del último update
unsigned long currentTime = millis(); // Obtener el tiempo actual
// Si ha pasado un segundo desde el último update, incrementar los segundos
if (currentTime - lastUpdateTime >= 1000) {
lastUpdateTime = currentTime; // Actualizar el tiempo del último update
// Incrementar el tiempo cada minuto
segundo++;
if (segundo == 60) {
segundo = 0;
minuto++;
if (minuto == 60) {
minuto = 0;
hora++;
if (hora == 24) {
hora = 0;
}
}
}
}
}
// 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);
}
}