/* Source: https://randomnerdtutorials.com/esp32-over-the-air-ota-programming/ To update the firmware with Platform IO, do a build and then upload in the web interface the file .pio/build/esp32doit-devkit-v1/firmware.bin */ #include /* * Rui Santos * Complete Project Details http://randomnerdtutorials.com */ #include #include #include #include #include const char* host = "esp32ota"; const char* ssid = "JoNelsDarlings"; const char* password = "Paris2016"; /*const char* ssid = "Rucksack"; const char* password = "Muratina";*/ // variabls to blink without delay: const int led = 2; unsigned long previousMillis = 0; // will store last time LED was updated const long interval = 1000; // interval at which to blink (milliseconds) int ledState = LOW; // ledState used to set the LED int wifiState = WL_DISCONNECTED; // Wifi-Connection Status WebServer server(80); /* * Login page */ const char* loginIndex = "
" "" "" "" "
" "
" "" "" "" "" "
" "
" "" "" "" "
" "
" "" "" "" "" "
" "
ESP32 Login Page
" "
" "
Username:
Password:
" "
" ""; /* * Server Index Page */ const char* serverIndex = ""; /* * setup function */ void wifiSetup(void){ // Connect to WiFi network WiFi.begin(ssid, password); Serial.println(""); // Wait for connection or reboot if it doesn't connect for too long uint32_t wifiConnAttements = 0; while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); if (wifiConnAttements++ > 120) { Serial.println( ""); ESP.restart(); } } Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); /*use mdns for host name resolution*/ if (!MDNS.begin(host)) { // http://esp32ota.local Serial.println("Error setting up MDNS responder!"); while (1) { delay(1000); } } Serial.println("mDNS responder started"); } void setup(void) { pinMode(led, OUTPUT); Serial.begin(9600); wifiSetup(); /*return index page which is stored in serverIndex */ server.on("/", HTTP_GET, []() { server.sendHeader("Connection", "close"); server.send(200, "text/html", loginIndex); }); server.on("/serverIndex", HTTP_GET, []() { server.sendHeader("Connection", "close"); server.send(200, "text/html", serverIndex); }); /*handling uploading firmware file */ server.on( "/update", HTTP_POST, []() { server.sendHeader("Connection", "close"); server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK"); ESP.restart(); }, []() { HTTPUpload& upload = server.upload(); if (upload.status == UPLOAD_FILE_START) { Serial.printf("Update: %s\n", upload.filename.c_str()); if (!Update.begin( UPDATE_SIZE_UNKNOWN)) { // start with max available size Update.printError(Serial); } } else if (upload.status == UPLOAD_FILE_WRITE) { /* flashing firmware to ESP*/ if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) { Update.printError(Serial); } } else if (upload.status == UPLOAD_FILE_END) { if (Update.end( true)) { // true to set the size to the current progress Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize); } else { Update.printError(Serial); } } }); server.begin(); } void loop(void) { if (wifiState!=WiFi.status()) { Serial.print("Wifi Status Change: "); Serial.println(WiFi.status()); wifiState=WiFi.status(); } // if we lost connection reconnect... if (WL_CONNECTED != WiFi.status()){ WiFi.disconnect(); delay(1000); wifiSetup(); } server.handleClient(); delay(1); // loop to blink without delay unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { // save the last time you blinked the LED previousMillis = currentMillis; // if the LED is off turn it on and vice-versa: ledState = not(ledState); // set the LED with the ledState of the variable: digitalWrite(led, ledState); } }