#include "my_wifi.h"
#include "my_lcd.h"
#include "my_rtc.h"
MyWiFi wifi;
MyLCD lcd;
MyRTC rtc;
char datetimeBuffer[20];
bool timeValid = false;
void onTimeSynced(const DateTime &dt) {
if (rtc.set(dt)) {
Serial.println("RTC updated from SNTP");
timeValid = true;
}
else {
Serial.println("Failed to update RTC!");
}
}
void setup() {
Serial.begin(115200);
lcd.begin();
// Initialize RTC first
if (!rtc.begin()) {
lcd.displayError("RTC Error!", "Check module");
while(true) delay(1000);
}
// Show initial RTC time
rtc.formatDateTime(datetimeBuffer, sizeof(datetimeBuffer));
lcd.display(datetimeBuffer, "Booting...", "RTC Time");
// Start WiFi with timeout
wifi.begin();
wifi.setTimeSyncCallback(onTimeSynced);
const unsigned long wifiTimeout = 15000; // 15 seconds
unsigned long start = millis();
while (!wifi.isConnected() && (millis() - start < wifiTimeout)) {
delay(100);
Serial.print(".");
}
// Initial time validation
timeValid = rtc.isTimeValid();
}
void loop() {
static unsigned long lastReconnect = 0;
static unsigned long lastUpdate = 0;
const unsigned long reconnectInterval = 30000; // 30 seconds
// Periodic reconnect attempt
if (!wifi.isConnected() && (millis() - lastReconnect > reconnectInterval)) {
Serial.println("\nAttempting WiFi reconnect...");
WiFi.reconnect();
lastReconnect = millis();
}
// Update display every second
if (millis() - lastUpdate >= 1000) {
lastUpdate = millis();
rtc.formatDateTime(datetimeBuffer, sizeof(datetimeBuffer));
String statusLine2 = wifi.isConnected() ? "WiFi: Connected" : "WiFi: Offline";
String statusLine3 = timeValid ? "Time: Valid" : "Time: Unsynced";
if (!timeValid) {
statusLine3 += " " + String(millis()/1000%2 ? "*" : ""); // Blinking indicator
}
lcd.display(datetimeBuffer, statusLine2.c_str(), statusLine3.c_str());
// Periodic time validation
if (!rtc.isTimeValid()) {
timeValid = false;
Serial.println("RTC time invalid!");
}
}
delay(10); // Small delay for stability
}