#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#define TFT_DC 14
#define TFT_CS 27
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
int Sx[60],Mx[60],Hx[30];
int Sy[60],My[60],Hy[30];
int center_x=120;
int center_y=120;
int seconds_hand_len = 80;
int minutes_hand_len = 60;
int hours_hand_len = 40;
int clock_radius=100;
int hours_x=0;
int hours_y=0;
String SSID = "Wokwi-GUEST";
String PASS = "";
const long utcOffsetInSeconds = 7200+3600;
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", utcOffsetInSeconds);
int hours;
int minutes;
int seconds;
long int startMillis=0;
int period = 1000;
long int currentMillis=0;
int prevS;
int prevM;
GFXcanvas16 canvas(240, 240);
void drawClock();
void setup() {
Serial.begin(115200);
Serial.print("Connecting to WiFi");
WiFi.begin(SSID, PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
timeClient.begin();
if (timeClient.update()) {
Serial.println("Synchronized with NTP.");
} else {
Serial.println("Error synchronizing with NTP.");
}
hours = timeClient.getHours();
minutes = timeClient.getMinutes();
seconds = timeClient.getSeconds();
Serial.print(hours);Serial.print(":");
Serial.print(minutes);Serial.print(":");
Serial.print(seconds);Serial.println("");
tft.begin();
drawClockCanvas();
tft.drawRGBBitmap(0, 0, canvas.getBuffer(), canvas.width(), canvas.height());
prevS=seconds;
prevM=minutes;
}
void loop() {
currentMillis = millis();
if(currentMillis - startMillis >= period) {
tft.drawLine(120,120,Sx[prevS],Sy[prevS],ILI9341_BLACK);
hours = timeClient.getHours();
minutes = timeClient.getMinutes();
seconds = timeClient.getSeconds();
prevS = seconds;
Serial.print(hours);Serial.print(":");
Serial.print(minutes);Serial.print(":");
Serial.print(seconds);Serial.println("");
if(seconds>=59) {seconds=0;prevS=0; minutes++;
if(minutes>=59) minutes=0;
tft.drawLine(120,120,Mx[prevM],My[prevM],ILI9341_BLACK);
tft.drawLine(120,120,Mx[minutes],My[minutes],ILI9341_YELLOW);
prevM=minutes;
hours_x = int(hours_hand_len * sin(radians(hours * 30 + 0.5 * minutes)) + center_x);
hours_y = int(-1 * hours_hand_len * cos(radians(hours * 30 + 0.5 * minutes )) + center_y);
tft.drawLine(120,120,hours_x,hours_y,ILI9341_RED);
}
tft.drawLine(120,120,Sx[seconds],Sy[seconds],ILI9341_GREEN);
if(minutes<=seconds) tft.drawLine(120,120,Mx[minutes],My[minutes],ILI9341_YELLOW);
//if(hours<=seconds)
tft.drawLine(120,120,hours_x,hours_y,ILI9341_RED);
startMillis=currentMillis;
}
}
void drawClock(){
for(int secs=0;secs<60;secs++){
Sx[secs] = int(seconds_hand_len * sin(radians(secs * 6)) + center_x);
Sy[secs] = int(-1 * seconds_hand_len * cos(radians(secs * 6)) + center_y);
}
for(int mins=0;mins<60;mins++){
Mx[mins] = int(minutes_hand_len * sin(radians(mins * 6)) + center_x);
My[mins] = int(-1 * minutes_hand_len * cos(radians(mins * 6)) + center_y);
}
tft.begin();
tft.drawCircle(center_x,center_y,clock_radius,ILI9341_WHITE);
tft.drawCircle(center_x,center_y,clock_radius+1,ILI9341_WHITE);
for(int hrs=0;hrs<12;hrs++){
hours_x = int(clock_radius * sin(radians(hrs * 30 )) + center_x);
hours_y = int(-1 *clock_radius * cos(radians(hrs * 30)) + center_y);
tft.drawLine(120,120,hours_x,hours_y,ILI9341_WHITE);
}
tft.fillCircle(120,120,clock_radius-10,ILI9341_BLACK);
tft.setCursor(center_x,center_y-clock_radius+10);
tft.print("12");
tft.setCursor(center_x,center_y+clock_radius-10);
tft.print("6");
tft.setCursor(center_x+clock_radius-10,center_y);
tft.print("3");
tft.setCursor(center_x-clock_radius+10,center_y);
tft.print("9");
hours_x = int(hours_hand_len * sin(radians(hours * 30 + 0.5 * minutes)) + center_x);
hours_y = int(-1 * hours_hand_len * cos(radians(hours * 30 + 0.5 * minutes )) + center_y);
tft.drawLine(120,120,Sx[seconds],Sy[seconds],ILI9341_GREEN);
tft.drawLine(120,120,Mx[minutes],My[minutes],ILI9341_YELLOW);
tft.drawLine(120,120,hours_x,hours_y,ILI9341_RED);
}
void drawClockCanvas(){
for(int secs=0;secs<60;secs++){
Sx[secs] = int(seconds_hand_len * sin(radians(secs * 6)) + center_x);
Sy[secs] = int(-1 * seconds_hand_len * cos(radians(secs * 6)) + center_y);
}
for(int mins=0;mins<60;mins++){
Mx[mins] = int(minutes_hand_len * sin(radians(mins * 6)) + center_x);
My[mins] = int(-1 * minutes_hand_len * cos(radians(mins * 6)) + center_y);
}
//tft.begin();
canvas.drawCircle(center_x,center_y,clock_radius,ILI9341_WHITE);
canvas.drawCircle(center_x,center_y,clock_radius+1,ILI9341_WHITE);
for(int hrs=0;hrs<12;hrs++){
hours_x = int(clock_radius * sin(radians(hrs * 30 )) + center_x);
hours_y = int(-1 *clock_radius * cos(radians(hrs * 30)) + center_y);
canvas.drawLine(120,120,hours_x,hours_y,ILI9341_WHITE);
}
canvas.fillCircle(120,120,clock_radius-10,ILI9341_BLACK);
canvas.setCursor(center_x,center_y-clock_radius+10);
canvas.print("12");
canvas.setCursor(center_x,center_y+clock_radius-10);
canvas.print("6");
canvas.setCursor(center_x+clock_radius-10,center_y);
canvas.print("3");
canvas.setCursor(center_x-clock_radius+10,center_y);
canvas.print("9");
hours_x = int(hours_hand_len * sin(radians(hours * 30 + 0.5 * minutes)) + center_x);
hours_y = int(-1 * hours_hand_len * cos(radians(hours * 30 + 0.5 * minutes )) + center_y);
canvas.drawLine(120,120,Sx[seconds],Sy[seconds],ILI9341_GREEN);
canvas.drawLine(120,120,Mx[minutes],My[minutes],ILI9341_YELLOW);
canvas.drawLine(120,120,hours_x,hours_y,ILI9341_RED);
}