有办法使ESP32-WROOM进入light-sleep或deep-sleep后,能保持连接?

butterfly
Posts: 13
Joined: Thu Sep 23, 2021 5:45 am

有办法使ESP32-WROOM进入light-sleep或deep-sleep后,能保持连接?

Postby butterfly » Thu Sep 23, 2021 6:03 am

从技术参考手册上了解到,预设功耗模式除Active模式外,其他模式射频模块关闭。但有时我的应用需要Wi-Fi长连接。
目前了解两种可能的方法:
1.使用Wi-Fi唤醒,支持Light-sleep,但是我在程序中没有找到Wi-Fi唤醒的接口。
2.从预设的功耗模式修改出一种自定义功耗模式,通过调整电源控制信号。
最后,请帮忙看下:1.低功耗模式下,Wi-Fi能保持连接的方案;2.实现的大致步骤或者参考文档。谢谢您!

ESP_Gargamel
Posts: 786
Joined: Wed Nov 14, 2018 8:45 am

Re: 有办法使ESP32-WROOM进入light-sleep或deep-sleep后,能保持连接?

Postby ESP_Gargamel » Fri Sep 24, 2021 2:45 am

开启 light sleep 可默认保持 WiFi 连接,会自动唤醒。

butterfly
Posts: 13
Joined: Thu Sep 23, 2021 5:45 am

Re: 有办法使ESP32-WROOM进入light-sleep或deep-sleep后,能保持连接?

Postby butterfly » Fri Sep 24, 2021 7:47 am

您好!
刚刚测试,您说的前提是通过函数esp_wifi_set_ps设置wifi为省电模式:WIFI_PS_MIN_MODEM或WIFI_PS_MAX_MODEM?如果设置为WIFI_PS_NONE,每次从light-sleep醒来,wifi都会断开。

zhaozhaozhao
Posts: 21
Joined: Tue Apr 13, 2021 8:43 am

Re: 有办法使ESP32-WROOM进入light-sleep或deep-sleep后,能保持连接?

Postby zhaozhaozhao » Sat Sep 25, 2021 6:47 pm

对的就是power management包,这个我前一阵子也在搞。默认的light_sleep_start()和deep_sleep_start()都会切断无线网络,请参阅https://docs.espressif.com/projects/esp ... leep-modes

在esp_pm包里有一个叫automatic light sleep的设置,启用后不用显示地调用sleep_start函数,freertos检测到后续没有任务时就会自动进入浅睡眠。见下图。要启用这个功能需要在idf.py menuconfig中开启freertos tickless idle选项。

Image

butterfly
Posts: 13
Joined: Thu Sep 23, 2021 5:45 am

Re: 有办法使ESP32-WROOM进入light-sleep或deep-sleep后,能保持连接?

Postby butterfly » Sun Sep 26, 2021 3:07 am

oh,my god,您的图片没加载起,我的esp-idf是4.1版本,component->FreeRTOS中没有tickless选项。看来得升级一下ESP-idf。

zhaozhaozhao
Posts: 21
Joined: Tue Apr 13, 2021 8:43 am

Re: 有办法使ESP32-WROOM进入light-sleep或deep-sleep后,能保持连接?

Postby zhaozhaozhao » Sun Sep 26, 2021 8:48 am

我的idf版本是v4.2,这个自动浅睡模式因为要一直保持wifi,待机状态耗电也要大概5mA

butterfly
Posts: 13
Joined: Thu Sep 23, 2021 5:45 am

Re: 有办法使ESP32-WROOM进入light-sleep或deep-sleep后,能保持连接?

Postby butterfly » Mon Sep 27, 2021 6:53 am

谢谢您的回复。
请问自动浅睡眠可以实现Wi-Fi和TCP都保持连接吗?
加入自动进入到浅睡眠,唤醒是通过设置的唤醒源或者网络?
目前,esp-idf升级到4.4版本后,任务中放长一点的延时,测电流发现没能自动浅睡眠,可能是配置没对。强制浅睡眠,wifi不会断开,但是我要使用TCP clent,一旦使用TCP,wifi会断开,因此TCP也要重新连接,汗。

zhaozhaozhao
Posts: 21
Joined: Tue Apr 13, 2021 8:43 am

Re: 有办法使ESP32-WROOM进入light-sleep或deep-sleep后,能保持连接?

Postby zhaozhaozhao » Mon Sep 27, 2021 12:21 pm

你好,
auto_light_sleep不需要对原代码作任何改动,睡眠和唤醒都是自动的。除了freertos/tikeless idle之外,还需要启用power management,请见https://docs.espressif.com/projects/esp ... -pm-enable
如果需要在自动睡眠唤醒时调用自己的函数也是可以的,见https://github.com/espressif/esp-idf/pull/4352
之前我试的esp_light_sleep_start()一定会断开WIFI,有时还能收发消息可能是AP那边没断开,请问你试过浅睡后几分钟再发数据吗? 我这边试的是一分钟内仍可以发,但之后就不行了。

以上就是我了解的全部了。ESP好像还支持设定哪些组件断电,不知道能不能在睡眠状态强制保持WIFI开启。

butterfly
Posts: 13
Joined: Thu Sep 23, 2021 5:45 am

Re: 有办法使ESP32-WROOM进入light-sleep或deep-sleep后,能保持连接?

Postby butterfly » Tue Sep 28, 2021 9:05 am

自动浅睡眠除了您说的menuconfig的配置外,还需要初始化时调用esp_err_t esp_pm_configure(const void* vconfig),目前我实现了。
强制浅睡眠目前测试是,只连接wifi,设置esp_wifi_set_ps(WIFI_PS_MIN_MODEM),默认也是WIFI_PS_MIN_MODEM,这样RTC自动唤醒后,wifi不会断开(醒来我会读对端的RSSI,并且event handle没有断开事件),睡眠时间是固定的20秒,其他时间没有尝试过。但是如果创建了TCP clent,即使休眠前断开TCP(可能是我没断开到,因为还有另一个bug,就是调用10次socket()后,就创建失败了,而menuconfig中允许最多同时10个socket连接,closesocket()没用对?),醒来后重新创建TCP client socket,这是wifi会断开,因此TCP也必须重连。

休眠时间长一点,应该效果也是一样的。

Who is online

Users browsing this forum: No registered users and 199 guests