#include #include #include #include "credentials.h" namespace Wifi { ESP8266WiFiMulti wifiMulti; WiFiEventHandler stationConnectedHandler; WiFiEventHandler stationDisconnectedHandler; String currentSSID; String currentPsk; void printStatus(); Task tReconnect(1 * TASK_MINUTE, TASK_FOREVER, []{ if (WiFi.status() != WL_CONNECTED) { Serial.println("Reconnecting to WiFi netowrk..."); WiFi.forceSleepWake(); WiFi.begin(currentSSID.c_str(), currentPsk.c_str()); } }); Task tInitialConnect(500 * TASK_MILLISECOND, 120, []{ Serial.println("Finding WiFi netowrk..."); if (wifiMulti.run() == WL_CONNECTED) tInitialConnect.disable(); }, nullptr, false, nullptr, []{ currentSSID = WiFi.SSID(); currentPsk = WiFi.psk(); tReconnect.enable(); }); void setup(Scheduler& ts, void(*onConnected)() = nullptr) { stationConnectedHandler = WiFi.onStationModeGotIP([onConnected](const WiFiEventStationModeGotIP& e) { Serial.println("Connected to network."); printStatus(); tReconnect.cancel(); if (onConnected) onConnected(); }); stationDisconnectedHandler = WiFi.onStationModeDisconnected([](const WiFiEventStationModeDisconnected& e) { Serial.println("Disconnected from network."); tReconnect.restartDelayed(); }); WiFi.setHostname(MAIN_DEVICE_ID); for (uint32_t i = 0; i < sizeof(credentials) / sizeof(WifiCredentials); i++) { wifiMulti.addAP(credentials[i].ssid, credentials[i].password); } ts.addTask(tInitialConnect); ts.addTask(tReconnect); tInitialConnect.enable(); } void disconnect() { Serial.println("Disconnecting WiFi"); WiFi.disconnect(); WiFi.forceSleepBegin(); } void printStatus() { // print the SSID of the network you're attached to: Serial.print("SSID: "); Serial.println(WiFi.SSID()); // print your WiFi shield's IP address: IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); // print the received signal strength: long rssi = WiFi.RSSI(); Serial.print("signal strength (RSSI):"); Serial.print(rssi); Serial.println(" dBm"); } }