#include <Wire.h>
#include <DS3231.h>
#include <TM1637Display.h>
#include <OneButton.h>
#include <Encoder.h>
// Pin definitions
#define LIGHT_SENSOR A6
#define DISPLAY_CLK 3
#define DISPLAY_DIO 2
#define ROTARY_S1 6 //CLK
#define ROTARY_S2 5 //DT
#define ROTARY_KEY 4 //SWITCH
#define BUZZER 7
#define ALARM_COUNT 3
DS3231 rtc;
TM1637Display display(DISPLAY_CLK, DISPLAY_DIO);
OneButton button(ROTARY_S2, true);
//Encoder myEnc(CLK, DT);
Encoder myEnc(ROTARY_S1, ROTARY_S2);
int light_now;
int light_prev = -1;
bool debug = true;
bool h12, PM_time;
long oldPosition = -999;
long newPosition;
int timeToSetHours;
int timeToSetMinutes;
int currentHour;
int currentMinute;
enum Statuses {DISPLAY_TIME, SET_TIME_HOURS, SET_TIME_MINUTES, SET_ALARM_HOURS, SET_ALARM_MINUTES};
Statuses TimeMode;
void DebugPrint(String msg) {
if (debug) {
Serial.println(msg);
}
}
void ClickHandler() {
DebugPrint("DEBUG: Click Detected");
if (TimeMode == SET_TIME_HOURS) {
rtc.setHour(timeToSetHours);
TimeMode = SET_TIME_MINUTES;
DebugPrint("DEBUG: Switched to SET_TIME_HOURS");
return;
}
if (TimeMode == SET_TIME_MINUTES) {
rtc.setMinute(timeToSetMinutes);
TimeMode = SET_TIME_HOURS;
DebugPrint("DEBUG: Switched to SET_TIME_MINUTES");
return;
}
}
void LongClickHandler() {
display.clear();
DebugPrint("DEBUG: Hold Detected");
if (TimeMode == DISPLAY_TIME) {
TimeMode = SET_TIME_HOURS;
return;
}
if (TimeMode == SET_TIME_HOURS || TimeMode == SET_TIME_MINUTES) {
rtc.setHour(timeToSetHours);
rtc.setMinute(timeToSetMinutes);
TimeMode = DISPLAY_TIME;
DebugPrint("DEBUG: New Time Saved");
}
}
void setup() {
Wire.begin();
if (debug) {
Serial.begin(9600);
Serial.println("DEBUG MODE ENABLED");
}
TimeMode = DISPLAY_TIME;
pinMode(ROTARY_S2, INPUT_PULLUP);
pinMode(BUZZER, OUTPUT);
rtc.setClockMode(false);
button.attachClick(ClickHandler);
button.setPressMs(3000);
button.attachLongPressStart(LongClickHandler);
DebugPrint("DEBUG: Setup Completed");
}
void loop() {
button.tick();
updateBrightness();
// Get current time
currentHour = rtc.getHour(h12, PM_time);
currentMinute = rtc.getMinute();
// Display based on mode
switch (TimeMode) {
case DISPLAY_TIME:
display.showNumberDecEx(currentHour * 100 + currentMinute, 0b11100000, true);
break;
case SET_TIME_HOURS:
timeToSetHours = encoder(true);
rtc.setHour(timeToSetHours);
display.showNumberDecEx(timeToSetHours * 100 + currentMinute, 0b11100000, true);
break;
case SET_TIME_MINUTES:
timeToSetMinutes = encoder(false);
rtc.setMinute(timeToSetMinutes);
display.showNumberDecEx(currentHour * 100 + timeToSetMinutes, 0b11100000, true);
break;
}
}
int encoder(bool setHour) {
newPosition = myEnc.read();
if (newPosition != oldPosition) {
oldPosition = newPosition;
}
if (setHour) {
// Handle hour value (0-23)
int value = abs(newPosition % 23); // Ensure value is between 0 and 23
DebugPrint(String(value));
return value;
} else {
// Handle minute value (0-59)
int value = abs(newPosition % 59); // Ensure value is between 0 and 59
DebugPrint(String(value));
return value;
}
}
void updateBrightness() {
light_now = analogRead(LIGHT_SENSOR);
if (abs(light_prev - light_now) >= 100) {
display.setBrightness(map(light_now, 100, 800, 7, 1));
DebugPrint("DEBUG: Brightness Change");
light_prev = light_now;
}
}