#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "RTClib.h"
// RTC 模組對象
RTC_DS1307 rtc;
// SSD1306 顯示器的設置
#define OLED_RESET 4
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET);
// 顯示圓心位置
#define C_X 63
#define C_Y 31
// 時鐘指針角度設定
int h_degree[] = {270, 300, 330, 0, 30, 60, 90, 120, 150, 180, 210, 240};
// 設置小時、分鐘等數據
int t;
void setup() {
// 初始化 OLED 顯示器
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // OLED I2C 地址為 0x3C
display.display();
delay(1000);
display.clearDisplay();
// 畫時鐘圓圈
display.display();
// 初始化 RTC 模組
if (!rtc.begin()) {
Serial.println("無法找到 RTC 模組!");
while (1); // 如果 RTC 模組未正確初始化,停在這裡
}
// 設置時間,這裡會使用編譯時間來初始化 RTC
if (!rtc.isrunning()) {
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // 設置時間為編譯時間
}
}
float a = 45;
float theta_r, x, y;
void loop() {
// 清除顯示
display.clearDisplay();
// 讀取當前時間
DateTime now = rtc.now();
display.drawCircle(C_X, C_Y, 31, SSD1306_WHITE);
// 顯示數字時間(例如:12:34)
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 30);
display.print(now.hour(), DEC);
display.print(":");
display.print(now.minute(), DEC);
// 計算時針的位置
t = 90 - (now.hour() % 12) * 30 - (now.minute() / 2); // 時針每小時走30度,且分鐘會影響時針
theta_r = t * (PI / 180.0); // 將角度轉換為弧度
x = C_X + 15 * cos(theta_r); // 計算 x 坐標
y = C_Y - 15 * sin(theta_r); // 計算 y 坐標
display.drawLine(C_X, C_Y, x, y, SSD1306_WHITE); // 畫出時針
// 計算分針的位置
t = 90 - now.minute() * 6; // 分針每分鐘走6度
theta_r = t * (PI / 180.0); // 將角度轉換為弧度
x = C_X + 25 * cos(theta_r); // 計算 x 坐標
y = C_Y - 25 * sin(theta_r); // 計算 y 坐標
display.drawLine(C_X, C_Y, x, y, SSD1306_WHITE); // 畫出分針
// 顯示內容
display.display();
// 延遲 1 秒
delay(1000);
}