#include <Wire.h>
#include <RTClib.h>
#include <TM1637Display.h>
#define CLK_PIN 9
#define DIO_PIN 8
TM1637Display display(CLK_PIN, DIO_PIN);
#define SET_PIN 2
#define DOWN_PIN 3
#define UP_PIN 4
byte hour, minute;
bool settingMode = false;
bool updateTime = false;
bool setButtonState = HIGH;
bool upButtonState = HIGH;
bool downButtonState = HIGH;
bool lastSetButtonState = HIGH;
bool lastUpButtonState = HIGH;
bool lastDownButtonState = HIGH;
RTC_DS1307 rtc;
void setup() {
display.setBrightness(7);
Wire.begin();
rtc.begin();
if (rtc.isrunning()) {
DateTime now = rtc.now();
hour = now.hour();
minute = now.minute();
} else {
hour = 12;
minute = 0;
}
pinMode(SET_PIN, INPUT_PULLUP);
pinMode(DOWN_PIN, INPUT_PULLUP);
pinMode(UP_PIN, INPUT_PULLUP);
displayTime();
}
void loop() {
setButtonState = digitalRead(SET_PIN);
upButtonState = digitalRead(UP_PIN);
downButtonState = digitalRead(DOWN_PIN);
if (settingMode) {
if (upButtonState != lastUpButtonState) {
lastUpButtonState = upButtonState;
if (upButtonState == LOW) {
if (hour < 12) {
hour++;
} else {
hour = 0;
}
updateTime = true;
}
} else if (downButtonState != lastDownButtonState) {
lastDownButtonState = downButtonState;
if (downButtonState == LOW) {
if (minute < 59) {
minute++;
} else {
minute = 0;
}
updateTime = true;
}
}
if (setButtonState != lastSetButtonState) {
lastSetButtonState = setButtonState;
if (setButtonState == LOW || updateTime) {
settingMode = false;
updateTime = false;
displayTime();
DateTime now = rtc.now();
rtc.adjust(DateTime(now.year(), now.month(), now.day(), hour, minute, now.second()));
delay(100);
}
}
} else {
if (setButtonState != lastSetButtonState) {
lastSetButtonState = setButtonState;
if (setButtonState == LOW) {
settingMode = true;
display.clear();
delay(200);
}
}
}
if (!settingMode || (millis() % 500 < 250)) {
displayTime();
} else {
display.clear();
}
delay(10);
}
void displayTime() {
int displayHour = hour;
if (displayHour > 12) {
displayHour -= 12;
}
display.showNumberDecEx(displayHour * 100 + minute, 0b01000000, true);
delay(200);
}