#include <TM1637Display.h>
#include <ezButton.h>
#include "Incrementor.h"
unsigned long previousMillis = 0;
unsigned long previousDotMillis = 0;
bool dotsOn = true; // Inicialmente, los puntos están encendidos
bool hourReset = false; // Variable para rastrear si se ha reiniciado 'hours'
bool minuteReset = false; // Variable para rastrear si se ha reiniciado 'minutes'
bool stateA=HIGH;
// Pinout para TM1637
#define CLK_PIN 2
#define DIO_PIN 3
TM1637Display display(CLK_PIN, DIO_PIN);
// Inicialización de los objetos de los botones
ezButton timeSetBtn(4); // Botón para configurar la hora
ezButton alarmSetBtn(5); // Botón para configurar la alarma
ezButton hourBtn(6); // Botón para incrementar la hora
ezButton minuteBtn(7); // Botón para incrementar los minutos
byte hours = 12; // Inicializa las horas a las 12:00 AM
byte minutes = 0; // Inicializa los minutos en 0
byte hourAlarm = 12; // establecemos la hora en la que va a sonar la alarma
byte minuteAlarm = 1; //establecemos el minuto en el que va a sonar la alarma
bool isSettingHour = false; // Bandera para configurar las horas
bool isSettingMinute = false; // Bandera para configurar los minutos
void setup() {
//tone(8,2000);
pinMode(9, INPUT_PULLUP);
display.setBrightness(0x0f); // Brillo del display (ajustar según sea necesario)
timeSetBtn.setDebounceTime(50); // Establece el tiempo de rebote del botón
alarmSetBtn.setDebounceTime(50); // Establece el tiempo de rebote del botón
hourBtn.setDebounceTime(50); // Establece un tiempo de rebote para el botón
minuteBtn.setDebounceTime(50); // Establece un tiempo de rebote para el botón
}
// instancias de la clase Incrementor
Incrementor hourIncrementor(hours, hourReset, hourBtn,timeSetBtn,23);
Incrementor minuteIncrementor(minutes, minuteReset, minuteBtn,timeSetBtn,59);
Incrementor halarmIncrementor(hourAlarm, hourReset, hourBtn,alarmSetBtn,23);
Incrementor malarmIncrementor(minuteAlarm, minuteReset, minuteBtn,alarmSetBtn,59);
void loop() {
hourBtn.loop();
minuteBtn.loop();
timeSetBtn.loop(); // Actualiza el estado del botón "timeSetBtn"
alarmSetBtn.loop();
//DUMP(hours); // Imprimir el valor de "hour" en la consola
// Llamar a los Incrementors en el loop
hourIncrementor.update();
minuteIncrementor.update();
halarmIncrementor.update();
malarmIncrementor.update();
avanzar();
alarm();
// Alternar los puntos (se encienden y apagan cada segundo)
if (millis() - previousDotMillis >= 500) {
previousDotMillis = millis();
dotsOn = !dotsOn;
}
// Mostrar la hora actual y los puntos
if(alarmSetBtn.getState() == LOW){
if (!isSettingHour) {
display.showNumberDecEx((hourAlarm * 100) + minuteAlarm, dotsOn ? 0b01000000 : 0, true);
} else {
display.showNumberDec(hourAlarm, dotsOn ? 0b01000000 : 0, true);
}
}else{
if (!isSettingHour) {
display.showNumberDecEx((hours * 100) + minutes, dotsOn ? 0b01000000 : 0, true);
} else {
display.showNumberDec(hours, dotsOn ? 0b01000000 : 0, true);
}
}
}
void alarm() {
static unsigned long alarmMillis = 0;
static bool alarmTriggered = false;
// Comprobar si las horas y minutos actuales coinciden con la alarma
if (hours == hourAlarm && minutes == minuteAlarm && digitalRead(9)) {
// Si la alarma aún no ha sido activada, establece el tiempo de inicio
if (!alarmTriggered) {
alarmMillis = millis();
alarmTriggered = true;
}
// Verifica si ha pasado 60000 ms (60 segundos)
if (millis() - alarmMillis >= 60000) {
// Aumenta los minutos y reinicia el temporizador de la alarma
minutes++;
if (minutes == 60) {
minutes = 0;
hours++;
if (hours == 24) {
hours = 0;
}
}
alarmMillis = millis();
}
// Hacer sonar la alarma
if ((millis() - previousMillis) >= 500) {
previousMillis = millis();
if (stateA == HIGH) {
noTone(8);
stateA = LOW;
} else {
tone(8, 2000);
stateA = HIGH;
}
}
} else {
// Restablecer la bandera de alarma cuando las condiciones no se cumplen
alarmTriggered = false;
noTone(8);
}
}
void avanzar(){
// Avanza el tiempo si no estamos en modo de configuración
if (!isSettingHour && !isSettingMinute) {
unsigned long currentMillis = millis();
// Verifica si ha pasado 60000 ms (60 segundos)
if (currentMillis - previousMillis >= 60000) { // Incrementa minutos cada 60 segundos
previousMillis = currentMillis;
minutes++;
if (minutes == 60) {
minutes = 0;
hours++;
if (hours == 24) {
hours = 0;
}
}
}
}
}