2. ESP32的功耗模式详解
好,咱们直接进入正题。ESP32的功耗模式,说白了就是一套「省电组合拳」。你想想看,一个物联网设备,大部分时间都在待机,真正干活的时间可能就几秒钟。如果一直全速运行,电池撑不了几天。
ESP32提供了五种功耗模式,从「火力全开」到「几乎关机」。我刚开始接触时也觉得眼花缭乱,但摸清楚之后,发现其实就两条主线:关掉什么,以及保留什么。
2.1 Active模式:火力全开
这是默认状态。CPU跑着,Wi-Fi连着,蓝牙开着,所有外设都能用。电流嘛,大概在80mA到260mA之间,具体看你干了什么。
什么时候用? 需要处理数据、发送网络请求、或者执行复杂计算的时候。说白了,就是「干活模式」。
关键参数:
- CPU频率:80MHz / 160MHz / 240MHz 可调
- 典型电流:80mA ~ 260mA
- 所有功能全开
我个人习惯是,只有在真正需要高性能时才跑240MHz。大部分场景160MHz完全够用,还能省点电。
2.2 Modem-sleep模式:关掉无线
这个模式很有意思。CPU还在跑,但Wi-Fi和蓝牙的射频部分被关掉了。注意,我说的是「射频部分」,不是整个Wi-Fi模块。
为什么这样设计?因为Wi-Fi的射频前端(PA、LNA)是耗电大户。关掉它们,电流能降到3mA到20mA左右。但CPU还能干活,内存数据也保留着。
我的经验: 我在做智能传感器项目时,大部分时间就用这个模式。传感器采集数据、做简单处理,然后每隔几分钟唤醒Wi-Fi发一次数据。这样既保证了响应速度,又省了电。
适用场景: 需要保持CPU运行,但不需要持续联网。比如数据采集、本地处理、定时任务等。
2.3 Light-sleep模式:浅度睡眠
这个模式,CPU暂停了。嗯,你没听错,CPU不跑了。但内存数据还在,RTC(实时时钟)还在工作,GPIO状态也保持着。
电流能降到0.8mA左右。为什么这么低?因为CPU是耗电大户,把它停下来,效果立竿见影。
唤醒方式:
- 定时器唤醒(RTC定时器)
- GPIO触发唤醒(比如按键)
- 触摸传感器唤醒
注意: 进入Light-sleep前,记得把Wi-Fi和蓝牙先断开。否则它们会尝试重连,反而更耗电。我曾经踩过这个坑,以为进了睡眠就万事大吉,结果电流反而比Active模式还高...
2.4 Deep-sleep模式:深度睡眠
这是ESP32最常用的省电模式。CPU停了,大部分内存也断电了,只有RTC内存(约8KB)和RTC外设还在工作。
电流能降到10μA左右。你没看错,微安级别。相比Active模式的几十毫安,差了三个数量级。
保留什么?
- RTC内存(8KB)—— 可以存一些关键数据
- RTC定时器 —— 用于定时唤醒
- ULP协处理器 —— 这个后面会细讲
- 部分GPIO —— 可以保持状态或用于唤醒
典型应用: 电池供电的传感器节点。每隔几分钟醒来,采集数据、发送、再睡回去。我做过一个温湿度监测器,两节AA电池用了大半年。
唤醒方式:
- 定时器唤醒(最常用)
- GPIO唤醒(外部触发)
- 触摸传感器唤醒
- ULP协处理器唤醒(这个很强大)
2.5 Hibernation模式:几乎关机
这个模式,说白了就是「终极省电」。RTC定时器、ULP协处理器这些都不工作了。只有RTC内存里的极少量数据保留着,以及一个非常基础的唤醒逻辑。
电流能降到2.5μA左右。比Deep-sleep还低,但代价是唤醒后几乎等于重启,所有外设都要重新初始化。
慎重使用: 这个模式适合那些几个月才唤醒一次的设备。比如一些环境监测设备,或者紧急信标。日常项目,Deep-sleep基本够用了。
2.6 模式对比一览
| 模式 | CPU状态 | Wi-Fi/蓝牙 | RTC内存 | 典型电流 | 唤醒时间 |
|---|---|---|---|---|---|
| Active | 运行 | 可用 | 可用 | 80~260mA | — |
| Modem-sleep | 运行 | 关闭射频 | 可用 | 3~20mA | — |
| Light-sleep | 暂停 | 关闭 | 可用 | 0.8mA | ~1ms |
| Deep-sleep | 关闭 | 关闭 | 保留8KB | 10μA | ~3ms |
| Hibernation | 关闭 | 关闭 | 极少量 | 2.5μA | ~10ms |
2.7 实际项目中的选择策略
说了这么多,到底怎么选?我一般遵循这个原则:
- 需要实时响应? 用Modem-sleep或Light-sleep。比如智能门锁,有人按门铃要立刻响应。
- 定时上报数据? 用Deep-sleep。比如温湿度传感器,每10分钟醒来一次就够了。
- 几个月才用一次? 用Hibernation。比如一些野外监测设备。
一个小技巧: 不要一上来就追求最低功耗。先保证功能正常,再逐步优化。我见过太多人为了省几微安,把系统搞得不稳定,最后得不偿失。
嗯,这五种模式,说白了就是「用多少电,干多少活」。下一章我们会深入讲代码实现,看看怎么在代码里切换这些模式。到时候我会分享一些实际项目中的坑和技巧。