#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RTClib.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define CENTER_X 64
#define CENTER_Y 32
#define RADIUS 30
int BUTTON_HOUR = 2;
int BUTTON_MINUTE = 3;
int BUTTON_SET = 4;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
RTC_DS3231 rtc;
int setHour = 0;
int setMinute = 0;
bool settingTime = false;
void setup(){
Serial.begin(115200);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)){
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.clearDisplay();
if(!rtc.begin()){
Serial.println("Couldn`t find RTC");
while(1);
}
if(rtc.lostPower()){
Serial.println("RTC lost power, setting the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
pinMode(BUTTON_HOUR, INPUT);
pinMode(BUTTON_MINUTE, INPUT);
pinMode(BUTTON_SET, INPUT);
}
void loop(){
if(!settingTime){
DateTime now = rtc.now();
display.clearDisplay();
drawClockFace();
drawHands(now.hour(), now.minute(), now.second());
display.display();
if(digitalRead(BUTTON_SET) == LOW){
settingTime = true;
setHour = now.hour();
setMinute = now.minute();
delay(200);
}
} else{
adhustTime();
}
delay(100);
}
void drawClockFace(){
display.drawCircle(CENTER_X, CENTER_Y, RADIUS, SSD1306_WHITE);
for(int i = 0; i < 12; i++){
float angle = i * 30 * PI / 180;
int x1 = CENTER_X + cos(angle) * (RADIUS - 2);
int y1 = CENTER_Y + sin(angle) * (RADIUS - 2);
int x2 = CENTER_X + cos(angle) * (RADIUS);
int y2 = CENTER_Y + sin(angle) * (RADIUS);
display.drawLine(x1, y1, x2, y2, SSD1306_WHITE);
}
}
void drawHands(int hour, int minute, int second){
if(hour > 12) hour -= 12;
float hour_angle = (hour * 30 + minute * .5) * PI / 180;
drawHand(hour_angle, RADIUS - 15, SSD1306_WHITE);
float minute_angle = minute * 6 * PI / 180;
drawHand(minute_angle, RADIUS - 5, SSD1306_WHITE);
float second_angle = second * 6 * PI / 180;
drawHand(second_angle, RADIUS, SSD1306_WHITE);
}
void drawHand(float angle, int length, int color){
int x = CENTER_X + cos(angle - PI / 2) * length;
int y = CENTER_Y + sin(angle - PI / 2) * length;
display.drawLine(CENTER_X, CENTER_Y, x, y, color);
}
void adhustTime(){
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 10);
display.print("Set Time");
display.setCursor(10, 30);
display.print(setHour);
display.print(";");
display.print(setMinute < 10 ? "0" : "");
display.print(setMinute);
display.display();
if(digitalRead(BUTTON_HOUR) == LOW){
setHour++;
if(setHour >= 24) setHour = 0;
delay(200);
}
if(digitalRead(BUTTON_MINUTE) == LOW){
setMinute++;
if(setMinute >= 60) setMinute = 0;
delay(200);
}
if(digitalRead(BUTTON_SET) == LOW){
rtc.adjust(DateTime(2024, 1, 1, setHour, setMinute, 0));
settingTime = false;
delay(200);
}
}