ESPNOW crashes WIFI after reboot and if not used
Posted: Sun Aug 11, 2024 11:10 am
I am working on a project where we use ESPNOW for proprietary communication between ESP32 boards (NodeMcu ESP-32 Wroom WiFi / Bluetooth). Next I use Arduino IDE and Arduino OTA for over-the-air updates. Please note we are NOT using ESPNOW and WIFI at the same time. In the setup() we check for button press and run the OTA routine in the code below. If the button is not pressed we do NOT connect WIFI and run ESPNOW communication. We cannot share the ESPNOW code since it is proprietary, However the ESPNOW communication works perfect. Now, if we flash the ESP32 the first time by the USB port we can run OTA by pressing the button. It works well. Then, when we run ESPNOW after reboot (not pressing the button), the ESPNOW communications works well. Next, we reset the board again and press the button to invoke the OTA routine. That seems to work but the peculiar thing is that, after having used the ESPNOW function and after reboot invoking the OTA routine, it tries to connect WIFI but we see no SSID anymore. For some reason the OTA routine works only until the ESPNOW routine has been used. Somehow ESPNOW settings have been stored in memory or something that prevents OTA from working after having used ESPNOW. I have read about using esp_now_deinit() but that obviously crashes the ESP32 when ESPNOW had not been initialized. Do you have any suggestions how to solve this problem? Does ESPNOW store settings that remain in the board's memory after reboot?
Code: Select all
void setup() {
char tmpstr[40];
byte mac[6];
Serial.begin(19200);
Serial.println("Starting...");
pinMode(BOOT_BUTTON, INPUT); // init boot button pressed = false
pinMode(LED_BLUE,OUTPUT); // blue LED
digitalWrite(LED_BLUE,LOW); // blue LED off
CheckOTA(); // CheckOTA() checks for 10 seconds and runs OTA when button/gpio 0 is pressed
.... rest of the setup() code
Code: Select all
void OTAInit(){
esp_wifi_disconnect();
delay(2000);
esp_wifi_start();
// esp_now_deinit();
Serial.begin(19200);
Serial.printf("Starting OTA - WIFI: %s\n",ssid );
digitalWrite(LED_BLUE,HIGH); // Turn blue LED off before init
WiFi.mode(WIFI_AP);
WiFi.softAP("FirmwareESP32");
Serial.println("WIFI Ready");
Serial.print("IP address: ");
Serial.println(WiFi.softAPIP());
digitalWrite(LED_BLUE,HIGH); // Turn blue LED off when connected to WIFI
// 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();
delay(1000);
while(true){
ArduinoOTA.handle(); // blink +++++++++++ LED fast when in OTA mode
// Serial.println("OTA LED ON");
digitalWrite(LED_BLUE,HIGH); // code for S60
delay(100);
ArduinoOTA.handle();
// Serial.println("OTA LED OFF");
digitalWrite(LED_BLUE,LOW); // code for S60
delay(100);
}
}