#include <RTClib.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#define TFT_DC 9
#define TFT_CS 10
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
double s = 0;
int m = 0, h = 0;
RTC_DS1307 rtc;
int tx1, tx2, tx3, ty1, ty2, ty3;
int x1, x2, x3, y1, y2, y3;
int tmp;
int last_sec;
void setup() {
Serial.begin(9600);
tft.begin();
rtc.begin();
last_sec = rtc.now().second();
while (last_sec == rtc.now().second()) {
last_sec = rtc.now().second();
}
tmp = millis();
}
void loop() {
DateTime now = rtc.now();
if (last_sec < now.second()) {
tmp = millis();
}
s = now.second() + max(0, min(1, (millis() - tmp) / 1000.0)),
m = now.minute(), h = now.hour();
last_sec = s;
if (millis() - tmp >= 1000) {
tmp = millis();
}
tft.drawCircle(120, 160, 110, ILI9341_WHITE);
for (int i = 0; i < 360; i += 6) {
double radian = (i * PI) / 180;
int s_x = 120 + cos(radian) * (105 - !(i % 30) * 7);
int s_y = 160 + sin(radian) * (105 - !(i % 30) * 7);
int e_x = 120 + cos(radian) * 110;
int e_y = 160 + sin(radian) * 110;
tft.drawLine(s_x, s_y, e_x, e_y, ILI9341_WHITE);
}
tft.drawLine(120, 160, tx1, ty1, ILI9341_BLACK);
tft.drawLine(120, 160, tx2, ty2, ILI9341_BLACK);
tft.drawLine(120, 160, tx3, ty3, ILI9341_BLACK);
double radian = radians(s * 6 - 90);
double x = 120 + cos(radian) * 80;
double y = 160 + sin(radian) * 80;
tft.drawLine(120, 160, x, y, ILI9341_RED);
x1 = x, y1 = y;
radian = radians(m * 6 + (s * 6 / 60.0) - 90);
x = 120 + cos(radian) * 105;
y = 160 + sin(radian) * 105;
tft.drawLine(120, 160, x, y, ILI9341_WHITE);
x2 = x, y2 = y;
radian = radians(h * 30 + (m * 30 / 60.0) - 90);
x = 120 + cos(radian) * 75;
y = 160 + sin(radian) * 75;
tft.drawLine(120, 160, x, y, ILI9341_WHITE);
x3 = x, y3 = y;
tft.fillCircle(120, 160, 3, ILI9341_WHITE);
tx1 = x1;
tx2 = x2;
tx3 = x3;
ty1 = y1;
ty2 = y2;
ty3 = y3;
// delay(10);
}