Arduino Ide and Wemos lolin32 problems with the light sleep mode

Timchick
Posts: 2
Joined: Mon Jan 13, 2025 4:42 pm

Arduino Ide and Wemos lolin32 problems with the light sleep mode

Postby Timchick » Mon Jan 13, 2025 5:11 pm

Hello everyone. I have a project on Arduino Ide and Wemos lolin32. And I also have problems with the light sleep mode. Here is my code.

Code: Select all

#include <esp_now.h>
#include <WiFi.h>

uint8_t buttonState = 0;
uint8_t Receive_LED_DATA = 0;
bool isRecv = false;
uint8_t broadcastAddress[] = {0x24, 0xD7, 0xEB, 0x88, 0x6B, 0x30};

typedef struct struct_message {
  bool state;
} struct_message;

esp_now_peer_info_t peerInfo;
String success;

void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}

void OnDataRecv(const esp_now_recv_info *mac_addr, const uint8_t *data, int data_len) {
  char macStr[18];
  snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
           mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  if (data_len > 0) {
    Receive_LED_DATA = *data;
  }
  isRecv = true;
}

void wifiOn() {
  WiFi.mode(WIFI_STA);
  WiFi.setSleep(WIFI_PS_NONE);
  if (esp_now_init() != ESP_OK) {
    return;
  }

  esp_now_register_send_cb(OnDataSent);
  memcpy(peerInfo.peer_addr, broadcastAddress, 6);
  peerInfo.channel = 0; // максимум каналов 14, но на всех, кроме 0, не подключается
  peerInfo.encrypt = false;

  esp_now_add_peer(&peerInfo);
  esp_now_register_recv_cb(OnDataRecv);
}

void setup() {
  wifiOn();
  esp_sleep_enable_timer_wakeup(1000 * 1000);
}

void loop() {
    esp_err_t result = esp_now_send(broadcastAddress, &buttonState, sizeof(&buttonState));
    if (result == ESP_OK)
      Serial.println("Sent with success\t");
    else
      Serial.println("Error sending the data\t");
    buttonState = !buttonState;


    WiFi.mode(WIFI_OFF);
    esp_light_sleep_start();
    wifiOn();
}
At first everything works fine, then the wifi cannot start after waking up from sleep. After an hour, the memory is full and the code cannot get enough memory to allocate for the buffer. After rebooting, the situation repeats. Here are the error codes that were at first.

Code: Select all

19:10:36.564 -> E (487376) wifi:NAN WiFi stop
19:10:37.595 -> E (487422) wifi:Expected to init 4 rx buffer, actual is 3
19:10:37.595 -> E (487426) wifi_init: Failed to deinit Wi-Fi driver (0x3001)
19:10:37.595 -> E (487426) wifi_init: Failed to deinit Wi-Fi (0x3001)
After several reboots and several hours of work, the error has changed, now this.

Code: Select all

20:55:53.352 -> E (571631) wifi:wifi nvs cfg alloc out of memory
20:55:53.352 -> E (571632) wifi:init nvs: failed, ret=101
20:55:53.352 -> E (571635) wifi_init: Failed to deinit Wi-Fi driver (0x3001)
20:55:53.352 -> E (571635) wifi_init: Failed to deinit Wi-Fi (0x3001)
What is this and what are the possible solutions?

lbernstone
Posts: 886
Joined: Mon Jul 22, 2019 3:20 pm

Re: Arduino Ide and Wemos lolin32 problems with the light sleep mode

Postby lbernstone » Tue Jan 14, 2025 4:45 pm

My guess is the esp_now stuff is not getting destroyed with your wifi_off, so it is consuming a lot of memory. Unregister the callbacks and deinit the driver before you go to sleep. Note that light sleep and DFS are not currently supported in arduino-esp32 (but they are actively working on it).

Timchick
Posts: 2
Joined: Mon Jan 13, 2025 4:42 pm

Re: Arduino Ide and Wemos lolin32 problems with the light sleep mode

Postby Timchick » Wed Jan 15, 2025 10:05 am

Thank you sir. This really helped in my case.

Who is online

Users browsing this forum: No registered users and 41 guests