当前位置: 首页 > news >正文

ESP32 低功耗优化实战:light sleep 模式让续航提升 40 倍

ESP32 低功耗优化实战:light sleep 模式让续航提升 40 倍

关键词:ESP32、低功耗、light sleep、FreeRTOS、物联网
Github源码:https://github.com/WuQinghui-00/ESP32-Light-Sensor-Monitor

一、背景

我最近在做一款基于 ESP32 的智能光照监测系统,使用 FreeRTOS 实现多任务架构。项目跑通后,我发现一个问题:功耗太高了。

实测工作电流在 80mA 左右,如果电池供电,几个小时就没电了。作为一个可能部署在室外的物联网设备,这样的功耗显然不行。

所以,我决定给项目加上低功耗优化。

二、方案选型

ESP32 支持多种低功耗模式:

  • Modem sleep:约 20mA,需要保持 Wi-Fi 连接时使用

  • Light sleep:约 0.8-2mA,CPU 暂停,外设保留,可被 GPIO 或定时器唤醒

  • Deep sleep:约 10μA,深度睡眠,唤醒后程序从头执行

考虑到我的系统需要周期性采集光照数据(每 10 秒一次),同时支持外部触发唤醒,唤醒后需要快速恢复运行,我选择了 Light sleep 模式。

三、代码实现

3.1 配置唤醒源

首先需要包含头文件:
#include "esp_sleep.h"
#include "driver/gpio.h"

配置 GPIO4 作为唤醒源,同时开启定时器唤醒作为保底:
const uint64_t wakeup_pin_mask = 1ULL << GPIO_NUM_4;
esp_sleep_enable_ext1_wakeup(wakeup_pin_mask, ESP_EXT1_WAKEUP_ANY_HIGH);
esp_sleep_enable_timer_wakeup(10 * 1000000);

配置 GPIO4 为输入模式:
gpio_config_t io_conf = {
.pin_bit_mask = wakeup_pin_mask,
.mode = GPIO_MODE_INPUT,
.intr_type = GPIO_INTR_DISABLE,
.pull_up_en = GPIO_PULLUP_ENABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
};
gpio_config(&io_conf);

3.2 进入睡眠和唤醒

进入睡眠的代码非常简单:
ESP_LOGI(TAG, "Entering light sleep...");
esp_light_sleep_start();
ESP_LOGI(TAG, "Woken up!");

唤醒后可以获取唤醒原因:
esp_sleep_wakeup_cause_t wakeup_cause = esp_sleep_get_wakeup_cause();
if (wakeup_cause == ESP_SLEEP_WAKEUP_EXT1) {
ESP_LOGI(TAG, "Wakeup caused by GPIO");
} else if (wakeup_cause == ESP_SLEEP_WAKEUP_TIMER) {
ESP_LOGI(TAG, "Wakeup caused by timer");
}

3.3 集成到 FreeRTOS 任务中

我的系统原本有一个 Sensor 任务负责采集光照数据。我把低功耗逻辑集成进去:

void sensor_task(void *pvParameters)
{
// 配置唤醒源...

while (1) {
// 采集传感器数据
read_sensor();

// 发送到队列
xQueueSend(sensor_queue, &data, 0);

// 等待 3 秒让日志显示清楚
vTaskDelay(pdMS_TO_TICKS(3000));

// 进入 light sleep
ESP_LOGI(TAG, "Entering light sleep...");
esp_light_sleep_start();

// 唤醒后继续循环
ESP_LOGI(TAG, "Woken up!");
}
}

四、效果验证

4.1 串口日志

烧录后,串口输出如下:

I (389) SENSOR_TASK: State: DARK, Voltage: 500mV
I (3389) SENSOR_TASK: Entering light sleep...
(此时串口暂停,CPU 进入睡眠)
(10 秒后定时器唤醒,或 GPIO 触发唤醒)
I (3389) SENSOR_TASK: Woken up!
I (3389) SENSOR_TASK: Wakeup caused by timer
I (3389) SENSOR_TASK: State: DARK, Voltage: 500mV

可以看到系统成功进入睡眠,然后被唤醒,继续正常工作。

4.2 功耗数据

  • 正常工作:80mA

  • Light sleep:2mA

理论续航提升:80mA / 2mA = 40 倍。原来只能用 1 天的电池,现在能用 40 天。

五、踩坑记录

坑 1:编译警告被当作错误

加了低功耗代码后,编译报 cc1.exe: some warnings being treated as errors。在 CMakeLists.txt 里加了 target_compile_options(${COMPONENT_TARGET} PRIVATE -Wno-error) 解决。

坑 2:定时器和 GPIO 同时唤醒

一开始没加定时器,只能靠 GPIO 唤醒。后来加了 10 秒定时器作为保底,防止漏触发。现在两种唤醒方式可以同时工作。

六、总结

通过这次优化,我学会了:

  1. ESP32 低功耗模式的使用方法

  2. 多唤醒源配置(GPIO + 定时器)

  3. 在 FreeRTOS 任务中集成低功耗逻辑

  4. 功耗数据测量和分析

最终效果:待机电流从 80mA 降至 2mA,理论续航提升 40 倍。

下一步计划:集成 Wi-Fi 和 MQTT,实现数据上云。

七、项目链接

GitHub:https://github.com/WuQinghui-00/ESP32-Light-Sensor-Monitor

八、参考资源

ESP-IDF 电源管理文档:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/system/power_management.html
ESP32 低功耗模式详解:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/system/sleep_modes.html


http://www.cnnetsun.cn/news/1538586.html

相关文章:

  • Mermaid:如何用文本语法解决图表协作与版本控制难题?——技术文档的效率革命
  • 炉石传说模改插件HsMod终极指南:如何快速提升你的游戏体验 [特殊字符]
  • 企业文档管理中PDF格式的应用与优化
  • 物联网省电神器:手把手教你理解环境反向散射通信(AmBc)的工作原理
  • 用Stable Diffusion的‘想象力’补全3D点云?PCDreamer保姆级原理解读与复现避坑
  • Vue3-DateTime-Picker 技术架构深度解析:现代化Vue 3日期选择器解决方案
  • Atlas系统优化引擎:基于Windows的轻量级性能加速方案
  • OptiScaler:让所有显卡释放AI超分潜能的开源黑科技
  • 三步掌握BilibiliDown:极速高效下载B站视频全攻略
  • 从零到一:手把手教你用STM32F103和IR2104搭建单相全桥逆变器(附Buck电源LM5164选型)
  • 别让错误标签毁了你的模型:一份给实践者的深度学习标签噪声避坑指南
  • 前后端分离牙科就诊管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 实测才敢推!2026年不容错过的专业降AIGC平台
  • 面向工业消防安全的功率MOSFET选型策略与器件适配手册
  • LeetCode 42. Trapping Rain Water 题解
  • 终极指南:使用CXPatcher在Mac上完美运行Windows游戏的完整教程
  • STM32F103C8T6外接MCP4725 DAC模块,I2C地址配置错了?实测输出电压只有一半的排查与修复
  • Linux下PCIe AER错误排查实战:从寄存器解析到故障定位
  • 从“纸上谈兵”到“身体力行”:具身智能(Embodied AI)的演进逻辑、技术挑战与产业落地
  • 保姆级教程:用YOLOv5s搞定双缺口滑块验证码(从标注到部署避坑指南)
  • 保姆级教程:在Ubuntu 20.04上搞定pybind11编译与Python调用C++库
  • CSDN 去水印打印神器 | 一键展开代码 + 清除水印 + 自动打印,完美保存技术文章!
  • QML 文本控件实战:Text、TextInput、TextEdit 的样式定制与交互优化
  • TradingAgents-CN终极教程:10分钟搭建你的AI股票投资分析系统
  • 深入解析C语言中的Stream(流)操作与文件处理实践
  • 手把手教你处理Android 11+的‘特殊权限’:从MANAGE_EXTERNAL_STORAGE申请到结果监听全流程
  • 李慕婉-仙逆-造相Z-Turbo与Unity引擎:实时3D场景概念图生成插件开发
  • AI专著写作权威指南:优质工具推荐,让你的学术之路更平坦
  • 【CP AUTOSAR】Wdg驱动与GPT定时器协同:实现精准看门狗管理的实战解析
  • 数字图像处理(十)腐蚀和膨胀:从原理到实战应用