This chat conversation is shared from TypingMind.com
Avatar of the person chatting

实现 ESP32 调用 espidf 框架实现深度睡眠【测量深度睡眠功耗】

ESP32 是一款低功耗的 Wi-Fi 和蓝牙 MCU,它支持多种低功耗模式,其中包括深度睡眠模式。深度睡眠模式可以大幅度降低设备的功耗,适用于电池供电的场景。以下是使用 ESP-IDF(Espressif IoT Development Framework)实现 ESP32 深度睡眠并测量其功耗的基本步骤。

  1. 环境准备:

    • 确保你的开发环境已经安装了 ESP-IDF,并配置好了开发工具链。
    • 准备ESP32开发板和USB数据线,连接至电脑。
  2. 编写代码: 使用ESP-IDF提供的API,可以轻松地编写代码让ESP32进入深度睡眠模式。以下是一个简单的示例代码:

#include "esp_sleep.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"

void app_main() {
    // 在进入深度睡眠之前打印一条日志
    ESP_LOGI("Sleep", "Entering deep sleep for 10 seconds");

    // 设置唤醒设备的条件,这里设置为10秒后自动唤醒
    esp_sleep_enable_timer_wakeup(10 * 1000000);

    // 进入深度睡眠模式
    esp_deep_sleep_start();

    // 代码不会执行到这里
}
  1. 构建、烧录、运行: 使用ESP-IDF提供的工具进行构建、烧录到ESP32开发板上,并监控输出:

    idf.py build
    idf.py -p PORT flash
    idf.py -p PORT monitor
    

    PORT 替换成你的ESP32板连接的串行端口号。

  2. 测量功耗: 要测量ESP32在深度睡眠模式下的功耗,你需要一个电流或功率测量工具,如万用表或专用的功耗测试仪器。

    • 断开ESP32的USB连接(如果它是通过USB供电的)。
    • 使用万用表的电流档位来测量ESP32的电流消耗。
    • 将万用表的正负极串联到ESP32的电源线路中。
    • 记录深度睡眠状态下的电流读数。
  3. 分析结果: 根据测量到的电流值,你可以计算ESP32在深度睡眠模式下的功耗。功耗计算公式为 P = V * I,其中 P 是功耗(瓦特),V 是电压(伏特),I 是电流(安培)。

注意:在实际应用中,可能还需要考虑如何将ESP32从深度睡眠中唤醒,比如使用外部中断、定时器或者其他条件。另外,如果需要在深度睡眠后保持一些数据或状态,可以使用RTC存储器或RTC GPIO。

测量功耗时要确保其他外围设备(如传感器、显示屏等)也处于低功耗状态或断电状态,以便准确测量ESP32本身的深度睡眠功耗。

Avatar of the person chatting

我用官方的开发板烧录这个深度睡眠代码,打印正常,但是发现测量得到的电流为 10mA 左右,这个是为什么会这么大

如果你的ESP32在深度睡眠模式下仍然消耗约10mA的电流,那可能由以下几个原因造成:

  1. 开发板上的其他组件: 许多ESP32开发板设计时考虑了便于开发的各种功能,因此可能包含LED指示灯、USB转串行芯片、电压调节器等。这些组件即使在ESP32进入深度睡眠模式时也可能会继续工作并消耗电流。

  2. 电源管理不当: 如果开发板上的电源管理电路设计不是为了最小化深度睡眠的功耗,那么它可能会导致额外的电流消耗。

  3. 外部电路或设备: 如果ESP32开发板连接了外部电路或设备,例如传感器或通信模块,这些设备可能没有被适当地关闭或切换到它们自己的低功耗模式。

  4. I/O引脚状态: ESP32的I/O引脚在进入睡眠模式前应当配置成输入模式,并且关闭所有外围设备。如果有引脚被配置成输出模式并且输出高电平,那么可能会引起额外的功耗。

  5. 固件设置: 有可能是固件设置中的问题,比如未关闭Wi-Fi或蓝牙模块,或者RTCOOLK频率设置过高。

为了解决这个问题,你可以尝试以下步骤:

  • 检查开发板文档: 阅读ESP32开发板的文档,了解哪些组件可能在深度睡眠时继续工作。

  • 断开非必要组件: 如果可能,试着断开或移除那些不需要的组件,例如指示灯或其他非必要的硬件。

  • 优化电路: 如果你有能力修改硬件,尝试重新设计电源管理电路,以便在深度睡眠模式下最小化功耗。

  • 固件优化: 在代码中确保所有外围功能(如Wi-Fi、蓝牙、外设时钟)在睡眠前被禁用或设置到低功耗状态。

  • 使用专用的低功耗开发板: 如果你是在设计一个低功耗应用,可能需要使用专为低功耗优化的开发板,或者直接使用ESP32芯片而非开发板进行原型设计。

  • 使用专业设备进行测试: 确保你的测试设备和方法准确无误。有时万用表的电流档位不够精确,可能需要使用专业的功耗分析工具。

如果这些步骤都无法解决问题,可能需要进一步调试硬件和软件,查看是否有隐藏的功耗来源。

Avatar of the person chatting

把深度睡眠例程的框架修改换成 Arduino

如果你想使用Arduino IDE来编写ESP32进入深度睡眠的代码,可以参考以下步骤:

  1. 安装Arduino IDE和ESP32支持库:

    • 下载并安装最新版本的Arduino IDE。
    • 在Arduino IDE的"文件" -> "首选项"中添加ESP32的Boards Manager URL:https://dl.espressif.com/dl/package_esp32_index.json
    • 打开"工具" -> "开发板:" -> "开发板管理器",搜索ESP32并安装。
  2. 编写代码: 打开Arduino IDE,编写代码以实现ESP32的深度睡眠。以下是一个简单的示例:

#include <esp_sleep.h>

void setup() {
  Serial.begin(115200);

  // 给串口足够的时间来初始化
  delay(1000);
  Serial.println("Entering deep sleep for 10 seconds");

  // 设置ESP32在10秒后自动唤醒
  esp_sleep_enable_timer_wakeup(10 * 1000000);

  // 进入深度睡眠
  esp_deep_sleep_start();

  // 注意:ESP32进入深度睡眠后,不会执行下面的代码
}

void loop() {
  // 这里的代码在深度睡眠后不会被执行
}
  1. 编译和上传:

    • 接上你的ESP32开发板。
    • 在Arduino IDE中选择正确的端口和开发板类型("工具" -> "开发板:" -> "ESP32 Dev Module")。
    • 点击"上传"按钮上传代码到你的ESP32板上。
  2. 测试:

    • 上传完成后,打开串行监视器查看打印信息。
    • 使用电流测量工具(如万用表)来测量ESP32的功耗。
  3. 测量功耗:

    • 断开ESP32的USB连接(如果是通过USB供电的)。
    • 使用万用表的电流档位来测量ESP32的电流消耗。
    • 将万用表的正负极串联到ESP32的电源线路中。
    • 记录深度睡眠状态下的电流读数。

记住,同样的注意事项适用于Arduino IDE:确保在测量功耗时考虑开发板上其他组件的影响,并确保所有外围设备均已关闭或断电。

如果你的ESP32开发板在深度睡眠模式下的电流消耗仍然很高(如前面提到的10mA),请按照前面回答中提供的解决方案进行排查和调整。

Avatar of the person chatting

在 platformio 中编译以上代码,提示如下错误“Building in release mode Compiling .pio\build\pico32\src\main.cpp.o src/main.cpp: In function 'void setup()': src/main.cpp:4:3: error: 'Serial' was not declared in this scope Serial.begin(115200); ^~~~~~ src/main.cpp:7:3: error: 'delay' was not declared in this scope delay(1000); ^~~~~ *** [.pio\build\pico32\src\main.cpp.o] Error 1 ============================== [FAILED] Took 1.28 seconds ============================== ”

错误信息表明你的平台IO项目中缺失了Serialdelay的定义。这通常是因为项目未正确配置来使用Arduino框架,或者编译环境未正确设置。

要在PlatformIO中编译Arduino代码,你需要确保platformio.ini文件配置正确,指定了正确的开发板和框架。platformio.ini文件告诉PlatformIO你正在使用的开发板和框架。

假设你正在使用ESP32开发板,你的platformio.ini应该类似于以下内容:

[env:pico32]
platform = espressif32
board = pico32
framework = arduino

请注意,board应该是你实际使用的ESP32开发板的ID。例如,如果你使用的是ESP32 Dev Module,则应该将board设置为esp32dev

在PlatformIO中,Serialdelay函数是Arduino框架的一部分。如果你定义了framework = arduino,那么这些函数应该是可用的。如果你依旧遇到这个问题,尝试以下步骤:

  1. 检查platformio.ini文件: 确保其包含正确的platformboardframework设置。

  2. 清理并重新构建项目: 在PlatformIO的终端中运行以下命令:

pio run --target clean
pio run
  1. 检查代码: 如果你在main.cpp中编写了Arduino代码,确保文件顶部包含了Arduino.h头文件,以便正确地包含Arduino框架的所有定义:
#include <Arduino.h>
  1. 重启PlatformIO IDE: 有时候,重启IDE可以解决环境相关的问题。

  2. 检查PlatformIO和ESP32工具链是否最新: 确保你的PlatformIO和ESP32工具链是最新的。

如果你仍然面临问题,那么可能需要更详细地查看你的PlatformIO项目配置和源代码,以便找到问题所在。