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 实际项目中的选择策略

说了这么多,到底怎么选?我一般遵循这个原则:

  1. 需要实时响应? 用Modem-sleep或Light-sleep。比如智能门锁,有人按门铃要立刻响应。
  2. 定时上报数据? 用Deep-sleep。比如温湿度传感器,每10分钟醒来一次就够了。
  3. 几个月才用一次? 用Hibernation。比如一些野外监测设备。

一个小技巧: 不要一上来就追求最低功耗。先保证功能正常,再逐步优化。我见过太多人为了省几微安,把系统搞得不稳定,最后得不偿失。

嗯,这五种模式,说白了就是「用多少电,干多少活」。下一章我们会深入讲代码实现,看看怎么在代码里切换这些模式。到时候我会分享一些实际项目中的坑和技巧。