I've been successful with OTA programming ESP32s. My problem is that any script that uses the OTA code seems to REQUIRE the WiFi be present to operate. That is, in the absence of WiFi, the unit reboots constantly. I get the same behavior using the Arduino sample BasicOTA script, or any ESP32 specific scrips I've found. The OTA upload and my own scripts work fine, as long as WiFi is present, otherwise, this is repeated forever...
Booting
Connection Failed! Rebooting...
ets Jun 8 2016 00:22:57
@guilfordbob, your topic has been moved to a more suitable location on the forum. Introductory Tutorials is for tutorials that e.g. you write, not for questions. Feel free to write a tutorial about the subject once your problem is solved.
I do still want the ability to do an OTA update if the device later gets within range of the WiFi. Physical access is difficult.
Would a good solution be to just delete the ESP.restart(); statement from the example? I have code elsewhere that looks for WiFi & connects when it finds it.
Thanks
#include <WiFi.h>
#include <ESPmDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
const char* ssid = "..........";
const char* password = "..........";
void setup() {
Serial.begin(115200);
Serial.println("Booting");
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.println("Connection Failed! Rebooting...");
delay(5000);
***ESP.restart();***
}
// Port defaults to 3232
// ArduinoOTA.setPort(3232);
// Hostname defaults to esp3232-[MAC]
// ArduinoOTA.setHostname("myesp32");
// No authentication by default
// ArduinoOTA.setPassword("admin");
// Password can be set with it's md5 value as well
// MD5(admin) = 21232f297a57a5a743894a0e4a801fc3
// ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3");
ArduinoOTA
.onStart([]() {
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) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
})
.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();
Serial.println("Ready");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
ArduinoOTA.handle();
}
That reconnect statement is almost identical to the one I have elsewhere in the code!
I'm all set now. I do have to wait until WiFi is available to initialize the OTA initialize code runs ( without the WiFi connect statements in the sample code). Now my code boots and runs fine regardless of WiFi availability. OTA works whenever WiFi is in range, whether it was there at boot or not.
Thanks for the help.