#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <TimerOne.h>
#define BUTTON_PIN 2
Adafruit_SSD1306 display(128, 64, &Wire, -1);
volatile bool displayAnalog = false;
volatile unsigned long lastDebounceTime = 0;
const unsigned long debounceDelay = 50;
byte seconds = 0;
byte minutes = 0;
byte hours = 0;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), buttonPressed, FALLING);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(WHITE);
Timer1.initialize(1000000);
Timer1.attachInterrupt(updateTime);
}
void loop() {
if (displayAnalog) {
drawAnalogClock();
} else {
drawDigitalClock();
}
}
void updateTime() {
static unsigned long prevMillis = 0;
unsigned long currentMillis = millis();
if (currentMillis - prevMillis >= 1000) {
prevMillis = currentMillis;
seconds++;
if (seconds >= 60) {
seconds = 0;
minutes++;
if (minutes >= 60) {
minutes = 0;
hours++;
if (hours >= 24) {
hours = 0;
}
}
}
}
}
void buttonPressed() {
if ((millis() - lastDebounceTime) > debounceDelay) {
displayAnalog = !displayAnalog;
display.clearDisplay();
}
lastDebounceTime = millis();
}
void drawDigitalClock() {
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0, 0);
display.print(hours / 10);
display.print(hours % 10);
display.print(':');
display.print(minutes / 10);
display.print(minutes % 10);
display.print(':');
display.print(seconds / 10);
display.print(seconds % 10);
display.display();
}
void drawAnalogClock() {
display.clearDisplay();
byte second_angle = map(seconds, 0, 60, 0, 360);
byte minute_angle = map(minutes, 0, 60, 0, 360) + map(seconds, 0, 60, 0, 6);
byte hour_angle = map(hours % 12, 0, 12, 0, 360) + map(minutes, 0, 60, 0, 30);
display.drawCircle(64, 32, 30, WHITE);
drawClockHand(64, 32, 20, second_angle, WHITE);
drawClockHand(64, 32, 16, minute_angle, WHITE);
drawClockHand(64, 32, 12, hour_angle, WHITE);
display.display();
}
void drawClockHand(int16_t centerX, int16_t centerY, int16_t length, int16_t angle, uint16_t color) {
float radians = (angle - 90) * (PI / 180.0);
int16_t x = centerX + length * cos(radians);
int16_t y = centerY + length * sin(radians);
display.drawLine(centerX, centerY, x, y, color);
}