#include <WiFi.h> // Define WiFi
#include <ESP32Time.h> // Define ESP32Time
#include "esp_sntp.h" // Define sntp_*()
volatile bool disconnectRequested = false;
ESP32Time rtc(8*3600); // Offset in seconds GMT+8 (Singapore)
bool timeSynched = false;
void IRAM_ATTR handleInterrupt() { disconnectRequested = true; }
void wiFiStationConnected(WiFiEvent_t event, WiFiEventInfo_t info) {
Serial.println("Connected to AP successfully!");
}
void wiFiGotIP(WiFiEvent_t event, WiFiEventInfo_t info) {
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.println("** Running tasks requiring WiFi");
}
void wiFiStationDisconnected(WiFiEvent_t event, WiFiEventInfo_t info) {
Serial.println("Disconnected from WiFi access point");
Serial.print("WiFi lost connection. Reason: ");
Serial.println(info.wifi_sta_disconnected.reason);
Serial.println("Trying to Reconnect");
WiFi.begin("Wokwi-GUEST", "", 6);
Serial.println("** Running tasks requiring WiFi -- HALTED");
}
void timeSync_cb(struct timeval *tv) {
Serial.print("Time sync: ");
Serial.print(ctime(&tv->tv_sec)); // ctime includes "\n"
timeSynched = true;
}
void setup() {
Serial.begin(115200);
// Handle network events
WiFi.onEvent(wiFiStationConnected, ARDUINO_EVENT_WIFI_STA_CONNECTED);
WiFi.onEvent(wiFiGotIP, ARDUINO_EVENT_WIFI_STA_GOT_IP);
WiFi.onEvent(wiFiStationDisconnected, ARDUINO_EVENT_WIFI_STA_DISCONNECTED);
// Connect to AP
WiFi.mode(WIFI_STA);
WiFi.begin("Wokwi-GUEST", "", 6);
WiFi.setAutoReconnect(true); // Will try to reconnect
// Get date/time via SNTP
configTime(8*3600, 0, "pool.ntp.org");
Serial.print("Default SNTP synchronization interval: ");
Serial.println(sntp_get_sync_interval());
// Change synchronization interval (at least 15 seconds)
sntp_set_sync_interval(1*60*1000); // 1 minute
Serial.print("The new SNTP synchronization interval: ");
Serial.println(sntp_get_sync_interval());
// Call timeSync_cb() whenever time sync occurs
sntp_set_time_sync_notification_cb(timeSync_cb);
// Simulate WiFi disconnection
pinMode(32, INPUT_PULLDOWN);
attachInterrupt(digitalPinToInterrupt(32), handleInterrupt, RISING);
}
void loop() {
if (disconnectRequested) {
disconnectRequested = false; // Clear the flag
Serial.println("Button pressed. Disconnecting WiFi...");
WiFi.disconnect();
}
if (timeSynched)
Serial.println(rtc.getTimeDate());
delay(2000);
}
Simulate WiFi disconnection