#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());
}