#include <TFT_eSPI.h>
#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
/***********************************
You can also use the VSPI port of the ESP32 to connect the TFT SPI pins. The pinout is as follows2:
TFT Pin ESP32 Pin
MOSI 23
SCK 18
CS 15
RST 4
DC 2
**************************************/
TFT_eSPI tft = TFT_eSPI();
#define TFT_CS 15 // Chip select pin
#define TFT_DC 4 // Data/command pin
#define TFT_RST 2 // Reset pin
#define CLOCK_RADIUS 100
#define CLOCK_CENTER_X 160
#define CLOCK_CENTER_Y 120
#define HOUR_HAND_LENGTH 50
#define HOUR_HAND_WIDTH 5
#define MINUTE_HAND_LENGTH 80
#define MINUTE_HAND_WIDTH 3
#define SECOND_HAND_LENGTH 90
#define SECOND_HAND_WIDTH 1
#define HOUR_ANGLE_OFFSET 270
#define MINUTE_ANGLE_OFFSET 270
#define SECOND_ANGLE_OFFSET 270
#define CLOCK_FONT_SIZE 2
#define CLOCK_FONT_COLOR TFT_WHITE
const char* ssid = "Airtel_arvi_6035";
const char* password = "air26289";
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 19800); // 19800 seconds is UTC+5:30
int old_hour_x, old_hour_y, old_minute_x, old_minute_y, old_second_x, old_second_y;
void setup() {
tft.init();
tft.setRotation(0);
tft.fillScreen(TFT_BLACK);
tft.setTextSize(CLOCK_FONT_SIZE);
drawClockFace();
connectToWiFi();
updateTime();
old_hour_x = CLOCK_CENTER_X;
old_hour_y = CLOCK_CENTER_Y - HOUR_HAND_LENGTH;
old_minute_x = CLOCK_CENTER_X;
old_minute_y = CLOCK_CENTER_Y - MINUTE_HAND_LENGTH;
old_second_x = CLOCK_CENTER_X;
old_second_y = CLOCK_CENTER_Y - SECOND_HAND_LENGTH;
}
void loop() {
timeClient.update();
updateClockHands();
delay(1000);
}
void drawClockFace() {
tft.drawCircle(CLOCK_CENTER_X, CLOCK_CENTER_Y, CLOCK_RADIUS, TFT_WHITE);
for (int i = 1; i <= 12; i++) {
float angle = i * 30 * PI / 180;
int x = CLOCK_CENTER_X + (CLOCK_RADIUS - 10) * cos(angle);
int y = CLOCK_CENTER_Y + (CLOCK_RADIUS - 10) * sin(angle);
tft.setTextColor(CLOCK_FONT_COLOR);
tft.setCursor(x - 5, y - 5);
tft.print(i);
}
}
void updateClockHands() {
eraseClockHands();
drawHourHand();
drawMinuteHand();
drawSecondHand();
}
void eraseClockHands() {
tft.drawLine(CLOCK_CENTER_X, CLOCK_CENTER_Y, old_hour_x, old_hour_y, TFT_BLACK);
tft.drawLine(CLOCK_CENTER_X, CLOCK_CENTER_Y, old_minute_x, old_minute_y, TFT_BLACK);
tft.drawLine(CLOCK_CENTER_X, CLOCK_CENTER_Y, old_second_x, old_second_y, TFT_BLACK);
}
void drawHourHand() {
float hour_angle = (timeClient.getHours() % 12 + timeClient.getMinutes() / 60.0) * 30 * PI / 180;
hour_angle += HOUR_ANGLE_OFFSET * PI / 180;
int hour_x = CLOCK_CENTER_X + HOUR_HAND_LENGTH * cos(hour_angle);
int hour_y = CLOCK_CENTER_Y + HOUR_HAND_LENGTH * sin(hour_angle);
tft.drawLine(CLOCK_CENTER_X, CLOCK_CENTER_Y, hour_x, hour_y, TFT_YELLOW);
old_hour_x = hour_x;
old_hour_y = hour_y;
}
void drawMinuteHand() {
float minute_angle = timeClient.getMinutes() * 6 * PI / 180;
minute_angle += MINUTE_ANGLE_OFFSET * PI / 180;
int minute_x = CLOCK_CENTER_X + MINUTE_HAND_LENGTH * cos(minute_angle);
int minute_y = CLOCK_CENTER_Y + MINUTE_HAND_LENGTH * sin(minute_angle);
tft.drawLine(CLOCK_CENTER_X, CLOCK_CENTER_Y, minute_x, minute_y, TFT_CYAN);
old_minute_x = minute_x;
old_minute_y = minute_y;
}
void drawSecondHand() {
float second_angle = timeClient.getSeconds() * 6 * PI / 180;
second_angle += SECOND_ANGLE_OFFSET * PI / 180;
int second_x = CLOCK_CENTER_X + SECOND_HAND_LENGTH * cos(second_angle);
int second_y = CLOCK_CENTER_Y + SECOND_HAND_LENGTH * sin(second_angle);
tft.drawLine(CLOCK_CENTER_X, CLOCK_CENTER_Y, second_x, second_y, TFT_RED);
old_second_x = second_x;
old_second_y = second_y;
}
void connectToWiFi() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(250);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void updateTime() {
timeClient.begin();
timeClient.setTimeOffset(0);
}