ESPNOW crashes WIFI after reboot and if not used

lesateq
Posts: 2
Joined: Sun Aug 11, 2024 10:32 am

ESPNOW crashes WIFI after reboot and if not used

Postby lesateq » 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);     

  }
}

lesateq
Posts: 2
Joined: Sun Aug 11, 2024 10:32 am

Re: ESPNOW crashes WIFI after reboot and if not used

Postby lesateq » Tue Aug 13, 2024 1:18 pm

Update 13/08/2024

I found out that running ESPNOW with a simple init() and deinit() causes the problem. As mentioned before, a deinit() without prior init() of ESPNOW causes a full system crash. In other words; if Ihave ever executed ESPNOW I will not be able to run WIFI STA or AP anymore (tested on multiple boards). Even after a powercycle of the board wifi simply does not work. The only way to get WIFI running again is flashing the SoC (with option Erase All Flash). Is there any smarter guy in the world who can explain what ESPNOW is doing with the memory or the wifi ? Again I do NOT run ESPNOW and WIFI at the same time. At boot time a button press determines whether to execute WIFI/No ESPNOW or ESPNOW/No WIFI. I have used code below to run ESPNOW in minimal configuration which simply melts down WIFI communication...

Code: Select all

 if (esp_now_init() != ESP_OK) {
          Serial.println("Error initializing ESP-NOW");
          return;
    }else{
          Serial.println("Success initializing ESP-NOW");    
    }
    esp_wifi_set_protocol( WIFI_IF_STA , WIFI_PROTOCOL_LR);
    delay(1000);
     if (esp_now_deinit()!= ESP_OK) {
          Serial.println("Error DE-initializing ESP-NOW");
          return;
    }else{
          Serial.println("Success DE-initializing ESP-NOW");    
    }
  }[code]
[/code]

Who is online

Users browsing this forum: Google [Bot] and 86 guests