#include <TM1637Display.h>
#include <uRTCLib.h>
#define CLK 3
#define DIO 4
int time;
// REAL alarm time (saved)
int alarmHour = 0;
int alarmMin = 0;
// TEMP alarm time (editing)
int alarmHourTemp = 0;
int alarmMinTemp = 0;
int alarm;
int alarmTemp;
int buzzer = 9;
// Buzz control
bool buzz = true;
unsigned long lastBeep = 0;
bool buzzerState = false;
// Buttons
int alarmMode = 2;
int hourInc = 5;
int enter = 6;
int pot = A0;
int potValue;
// States
int alarmModestate;
int hourIncstate;
int enterState;
const uint8_t allON[] = { 0xff, 0xff, 0xff, 0xff };
int mode = 0; // 0 = normal, 1 = alarm set
bool justEnteredAlarmMode = false;
uRTCLib rtc(0x68);
TM1637Display display(CLK, DIO);
void setup() {
URTCLIB_WIRE.begin();
rtc.set(0, 39, 11, 2, 3, 11, 25);
display.setBrightness(5);
pinMode(alarmMode, INPUT_PULLUP);
pinMode(hourInc, INPUT_PULLUP);
pinMode(enter, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
}
void loop() {
rtc.refresh();
int hour = rtc.hour();
int minute = rtc.minute();
time = hour * 100 + minute;
alarmModestate = digitalRead(alarmMode);
hourIncstate = digitalRead(hourInc);
enterState = digitalRead(enter);
// ---- ENTER ALARM SET MODE ----
if (alarmModestate == LOW && mode == 0) {
mode = 1;
justEnteredAlarmMode = true;
alarmHourTemp = alarmHour;
alarmMinTemp = alarmMin;
delay(200);
}
// ---- NORMAL CLOCK MODE ----
if (mode == 0) {
display.showNumberDecEx(time, 0b01000000, true, 4, 0);
// STOP ALARM if ENTER is pressed
if (enterState == LOW) {
buzz = false;
noTone(buzzer);
}
// ----- ALARM RINGING LOGIC -----
if (time == alarm && buzz) {
unsigned long currentMillis = millis();
// Toggle buzzer every 500ms
if (currentMillis - lastBeep >= 500) {
lastBeep = currentMillis;
buzzerState = !buzzerState;
if (buzzerState)
tone(buzzer, 500);
else
noTone(buzzer);
}
}
}
// ---- ALARM SET MODE ----
else if (mode == 1) {
if (justEnteredAlarmMode) {
display.setSegments(allON);
delay(400);
justEnteredAlarmMode = false;
}
alarmTemp = alarmHourTemp * 100 + alarmMinTemp;
display.showNumberDecEx(alarmTemp, 0b01000000, true, 4, 0);
potValue = analogRead(pot);
alarmMinTemp = map(potValue, 0, 1023, 0, 59);
if (hourIncstate == LOW) {
alarmHourTemp++;
if (alarmHourTemp > 23) alarmHourTemp = 0;
delay(200);
}
if (enterState == LOW) {
alarmHour = alarmHourTemp;
alarmMin = alarmMinTemp;
alarm = alarmHour * 100 + alarmMin;
// Reset buzzing for next day
buzz = true;
mode = 0;
delay(200);
}
}
}