#include <WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <uRTCLib.h>
// WiFi credentials
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// NTP server and time offset
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 8 * 3600, 60000); // GMT+8 (Kuala Lumpur)
// RTC DS3231 using I2C (default address 0x68)
uRTCLib rtc(0x68);
void setup() {
Serial.begin(115200);
// Connect to WiFi
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi connected!");
// Start the NTP client
timeClient.begin();
timeClient.update();
// Initialize RTC
updateRTCFromNTP();
}
void loop() {
// Print RTC time every 5 seconds
printRTCTime();
delay(5000);
}
void updateRTCFromNTP() {
timeClient.update();
time_t epochTime = timeClient.getEpochTime();
struct tm *timeinfo = gmtime(&epochTime);
// Set RTC date and time
rtc.set(timeinfo->tm_sec, timeinfo->tm_min, timeinfo->tm_hour,
timeinfo->tm_wday, timeinfo->tm_mday, timeinfo->tm_mon + 1, timeinfo->tm_year - 100);
Serial.println("RTC updated with NTP time.");
}
void printRTCTime() {
rtc.refresh();
Serial.printf("RTC Date & Time: %04d-%02d-%02d %02d:%02d:%02d\n",
rtc.year() + 2000, rtc.month(), rtc.day(),
rtc.hour(), rtc.minute(), rtc.second());
}