第六章、6.2 ESP32低功耗模式详解:深度睡眠与轻度睡眠实战指南
适用场景: 电池供电设备(如传感器节点、可穿戴设备、远程监控装置)
一、低功耗模式简介
ESP32提供3种核心低功耗模式,功耗对比如下:
模式 | 功耗 | 唤醒延迟 | 保持工作的模块 |
---|---|---|---|
Active | 约100mA | - | 所有功能全速运行 |
Light Sleep | 约0.8mA | <1ms | CPU暂停,外设/内存保持 |
Deep Sleep | 约0.01mA | 约1秒 | 仅RTC控制器和RTC内存 |
💡 关键结论:
需要秒级响应 → 轻度睡眠(如蓝牙遥控器)
超长待机(月/年级别)→ 深度睡眠(如每小时采集1次的传感器)
二、深度睡眠模式 (Deep Sleep)
原理:关闭主CPU和大部分外设,仅保留RTC控制器和RTC内存(仅8KB可用)。
唤醒源配置(代码示例):
#include <esp_sleep.h>void setup() {// 1. 配置定时器唤醒(单位:微秒)esp_sleep_enable_timer_wakeup(10 * 1000000); // 10秒后唤醒// 2. 配置外部引脚唤醒(可选)esp_sleep_enable_ext0_wakeup(GPIO_NUM_33, 0); // PIN33低电平唤醒// 3. 配置触摸引脚唤醒(可选)esp_sleep_enable_touchpad_wakeup();// 4. 进入深度睡眠esp_deep_sleep_start(); // 程序在此停止,重启后从setup()重新运行
}void loop() {} // 深度睡眠不会进入loop()
函数解析:
-
esp_sleep_enable_timer_wakeup(us)
-
设置RTC定时器,
us
为微秒数(最大约4.5小时) -
注意:超过最大值需用
esp_sleep_enable_timer_wakeup()
循环计数
-
-
esp_sleep_enable_ext0_wakeup(pin, level)
-
pin
:唤醒引脚(仅限RTC引脚:0,2,4,12-15,25-27,32-39) -
level
:0=低电平唤醒,1=高电平唤醒
-
-
esp_deep_sleep_start()
-
关键动作:保存RTC内存数据 → 关闭非RTC模块 → 进入睡眠 → 唤醒后重启
-
数据保存技巧:
// 将数据存入RTC内存(重启后仍存在)
RTC_DATA_ATTR int bootCount = 0; // 使用RTC_DATA_ATTR宏void setup() {Serial.begin(115200);bootCount++;Serial.printf("第%d次唤醒\n", bootCount); // 每次唤醒+1
}
三、轻度睡眠模式 (Light Sleep)
原理:暂停CPU时钟,保留内存状态,外设可通过中断快速唤醒。
基础代码框架:
void enterLightSleep() {// 1. 配置GPIO唤醒(任意引脚)esp_sleep_enable_ext1_wakeup(BIT(GPIO_NUM_15), // 使用GPIO15唤醒ESP_EXT1_WAKEUP_ANY_HIGH // 高电平触发);// 2. 配置串口唤醒(可选)esp_sleep_enable_uart_wakeup(0); // 串口0收到数据时唤醒// 3. 进入轻度睡眠esp_light_sleep_start(); // 唤醒后继续执行后续代码
}void loop() {if (needsSleep) {Serial.println("进入轻度睡眠...");enterLightSleep();Serial.println("已唤醒!"); // 唤醒后输出}// 正常执行其他任务
}
函数解析:
-
esp_sleep_enable_ext1_wakeup(bitmask, mode)
-
bitmask
:使用BIT(GPIO_NUM_X)
设置多个引脚 -
mode
:ESP_EXT1_WAKEUP_ALL_LOW
(所有低电平)或ESP_EXT1_WAKEUP_ANY_HIGH
(任一高电平)
-
-
esp_light_sleep_start()
-
唤醒后从该函数后继续执行(不重启)
-
四、电池供电场景优化策略
-
硬件层面
-
关闭未使用的LED/传感器电源
-
添加10μF电容稳定电源
-
-
软件层面
// 深度睡眠前关闭外设 void prepareDeepSleep() {btStop(); // 关闭蓝牙WiFi.disconnect(true); // 断开WiFiadc_power_off(); // 关闭ADC电源esp_sleep_pd_config( // 关闭RTC外设电源域ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF); }
-
功耗实测数据
场景 平均电流 2000mAh电池寿命 深度睡眠(每小时唤醒1分钟) 0.02mA 4.5年 轻度睡眠(待机蓝牙) 0.9mA 3个月
五、常见问题排查
-
唤醒立即复位?
-
检查
RTC_DATA_ATTR
保存的数据是否溢出(仅8KB) -
避免在
setup()
中初始化已关闭的外设
-
-
功耗偏高?
-
执行
gpio_deep_sleep_hold_dis()
禁用GPIO保持器 -
用
esp_sleep_get_wakeup_cause()
判断唤醒源针对性优化
-
-
轻度睡眠无法唤醒?
-
确认唤醒引脚未配置为输出模式
-
检查
esp_sleep_enable_xxx_wakeup()
返回值(成功返回ESP_OK
)
-
最佳实践:在深度睡眠中每小时采集一次温湿度数据并上传,其余时间保持睡眠,可使CR2032纽扣电池工作1年以上。