#include #include #include #define OTA_WIFI_SSID "Chaos-West temp alternative" #define OTA_WIFI_PASSWORD "" #define OTA_WAIT_TIMEOUT 1000 // in 0.1s increments -> 10s void normal_loop(); void normal_setup(); void checkOTA(); bool initOTA(); enum OTA_MODE { NONE, SEARCHING, WAITING, UPDATING } otaMode; uint16_t otaWaitCounter; void checkOTA() { otaMode = SEARCHING; Serial.println("looking for OTA WiFi..."); // WARNING: to allow ESP-NOW work, this WiFi must be on Channel 1 if (OTA_WIFI_PASSWORD!="") { WiFi.begin(OTA_WIFI_SSID, OTA_WIFI_PASSWORD); //wifi with password }else{ WiFi.begin(OTA_WIFI_SSID); //open wifi } while (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println("no OTA WiFi found, proceed normal boot"); otaMode = NONE; return; } otaMode = WAITING; } void normal_setup() { Serial.println("Booting normal"); WiFi.disconnect(); WiFi.mode(WIFI_STA); WiFi.disconnect(); Serial.printf("wifi channel: %d\n", WiFi.channel()); } void setup() { Serial.begin(115200); delay(1000); Serial.println(); Serial.println("Initializing..."); checkOTA(); if(!initOTA()) { //initialize ota when ota enabled normal_setup(); } } bool initOTA() { if (otaMode == WAITING) { Serial.println("connected to OTA WiFi. Waiting for firmware..."); Serial.print("IP address: "); Serial.println(WiFi.localIP()); ArduinoOTA .onStart([]() { otaMode = UPDATING; String type; if (ArduinoOTA.getCommand() == U_FLASH) type = "sketch"; else // U_SPIFFS type = "filesystem"; // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end() Serial.println("Start updating " + type); }) .onEnd([]() { Serial.println("\nEnd"); }) .onProgress([](unsigned int progress, unsigned int total) { int prog = (progress / (total / 100)); Serial.printf("Progress: %u%%\r", prog); }) .onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); else if (error == OTA_END_ERROR) Serial.println("End Failed"); }); ArduinoOTA.begin(); return 1; //ota ok }else{ return 0; //not using ota } } void loop() { if (otaMode != NONE) { ArduinoOTA.handle(); if(otaMode == WAITING) { static long mil = millis(); static boolean huehott = false; if(millis() - mil > 100) { huehott = !huehott; mil = millis(); otaWaitCounter++; if(otaWaitCounter >= OTA_WAIT_TIMEOUT) { Serial.println("OTA wait timeout, proceeding normal boot"); otaMode = NONE; normal_setup(); } } } } else { normal_loop(); } } void normal_loop() { static unsigned long last_print=0; if (millis()-last_print>1000) { last_print=millis(); Serial.println("Loop"); } }