0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ESP32深度睡眠的教程

454398 来源:网络整理 作者:网络整理 2019-12-11 17:48 次阅读

步骤1:所需的零件

ESP32深度睡眠的教程

在本教程中,我将使用以下部分,因此,如果您想自己尝试本教程,则需要以下内容:

任何ESP32开发板▶http://educ8s.tv/part/ESP32

A Firebeetle ESP32开发板▶http://educ8s.tv/part/FireBeetle

面包板▶http://educ8s.tv/part/LargeBreadboard

电线▶http://educ8s。电视/零件/电线

LED▶http://educ8s.tv/part/LEDs

万用表▶http://educ8s.tv/part/Multimeter

步骤2:在ESP32芯片内部

在ESP32芯片内部,我们可以找到两种处理方式内核,RAMROM存储器,WiFi模块,蓝牙模块,用于加密应用程序的硬件加速模块,RTC模块以及许多外围设备。在RTC模块内部,我们可以找到一个PMU(相量测量单元),它是一种小型且低功耗的32位协处理器以及8Kbs的RAM存储器。少量的内存非常有用,因为您很快就会发现。还要注意,即使ESP32芯片的RTC内存也比Arduino Uno的内存大4倍。

WiFi模块,处理内核和蓝牙模块需要大量电流才能运行。因此,如果我们想节省电量,则必须在不使用它们时将其禁用。这就是我们现在要做的。我们将把ESP32设置为Deep – Sleep模式,在该模式下,除RTC模块外,所有功能都将禁用。有轻度睡眠模式和深度睡眠模式。在深度睡眠模式下,ESP32功耗最低。 在深度睡眠模式下仅需要0.01 mAs的电流,这就是我们今天要尝试的原因。

步骤3:ESP32深度睡眠模式

在这种模式下,如前所述,所有功能均被禁用。 CPU核心,WiFI模块,蓝牙模块,外围设备等。连同CPU一样,芯片的主内存也被禁用,因此存储在内存中的所有内容都会永远丢失。处于深度睡眠模式时,唯一仍可以工作的模块是RTC模块,超低功耗协处理器及其内存!因此,如果将要在深度睡眠模式下生存的数据保存到RTC内存中,则在唤醒芯片后它们将保持完整。

有三种方法可以唤醒芯片。我们可以使用计时器,GPIO引脚或协处理器。

今天,我们将学习如何使用计时器在特定时间后唤醒芯片。让我们看一个示例。

步骤4:深度睡眠示例

我已将两个LED连接到此ESP32板。 ESP32开机时,黄色LED会亮三秒钟,然后进入深度睡眠模式3秒钟。唤醒后,它会点亮绿色指示灯3秒钟,然后返回睡眠状态。从现在开始,它只会闪烁绿色LED,因此该芯片记住这不是它第一次启动,因为我们正在使用RTC内存来存储整数值。

让我们快速看一下。在这个项目的代码。如您所见,代码非常简单。为了使ESP32进入深度睡眠模式,我们只需要两行代码。

esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);

esp_deep_sleep_start();

我们使用esp_sleep_enable_timer_wakeup函数启用计时器,输入以秒为单位的睡眠时间,然后调用esp_deep_sleep_start函数。而已!

#define uS_TO_S_FACTOR 1000000 /* Conversion factor for micro seconds to seconds */

#define TIME_TO_SLEEP 3 /* Time ESP32 will go to sleep (in seconds) */

RTC_DATA_ATTR int bootCount = 0;

尽管与执行代码有一点不同。当我们使用深度睡眠功能时,ESP32每次唤醒时,都会再次执行设置功能。从不调用循环函数。所有变量值都会丢失,除非我们使用此前缀将它们保存在RTC内存中。在此示例中,我将bootCount int变量保存到RTC内存中,以便程序知道它是否是第一次运行并打开正确的LED。像往常一样,您可以找到此示例附带的示例代码。

步骤5:功耗

现在让我们看看该板的功耗。 ESP32处于活动模式时,会从电池汲取约60mAs的电流。 ESP32处于深度睡眠模式时,它将消耗约19mAs的电流!这大大降低了电流消耗,但是该芯片的创建者声称在深度睡眠模式下需要0.01mA的电流。我们的设置有什么问题?

罪魁祸首是主板。我使用的是DOIT ESP32板,这是大约一年前上市的第一块ESP32板。电路板的设计并未针对功耗进行优化,因此,即使在深度睡眠模式下,它也需要大量电流。幸运的是,那里有设计更好的ESP32板。

例如,DFrobot的Firebeetle ESP32板设计得更好,当使用3.3V电源供电时,其深度睡眠电流仅为0.01mAs。如果我们使用之前使用的相同电池组为电路板供电,其输出约为4.8V,则可以看到在活动模式下的电流消耗为48mAs,而在深度睡眠模式下的电流仅为0.05mAs!印象深刻不是吗!如果使用3.3V电池或电源,我们可以进一步降低电路板的功耗。我将在以后的视频中尝试。在深度睡眠模式下,该板所需的0.05mAs电流是我在功能齐全的ESP32板(具有USB至串行驱动器,调节器和电池电路)中消耗的最低电流。

如果您发现任何板子都能比Firebeetle板子取得更好的效果,请在下面的评论栏中告诉我,我想尝试一下。

Firebeetle ESP32板子的功耗在深度睡眠模式非常低。如果使用4节AA充电电池供电,则每天需要大约1.44毫安时。因此,从理论上讲,如果将其置于深度睡眠模式,则这种具有2.500mAhs容量的移动电源可以为该板供电近5年!当然,我们将不时唤醒电路板以执行需要更多功率的任务,因此电池寿命将大大减少。

步骤6:深入研究睡眠错误

不幸的是,ESP32的软件和硬件尚未成熟。使用深度睡眠模式时,我尝试在两个ESP32板上都出现了一个软件或硬件错误。随机唤醒后,ESP32会进入睡眠状态,并且不会再次唤醒。此错误可能在几次唤醒后或100次之后发生。它只是随机的。

我发现的一个简单解决方案是在唤醒后和从RTC内存读取之前添加500ms的小延迟。这样,项目就可以正常工作,但是,当然,我们要付出的代价是减少了电池寿命,因为每次唤醒时芯片处于活动模式的时间要长500ms。我认为此错误将在不久的将来通过新的软件或硬件修复得到解决。

void setup(){

pinMode(GREEN_LED_PIN,OUTPUT);

pinMode(YELLOW_LED_PIN,OUTPUT);

delay(500);

if(bootCount == 0) //Run this only the first time

{

digitalWrite(YELLOW_LED_PIN,HIGH);

bootCount = bootCount+1;

}else

{

digitalWrite(GREEN_LED_PIN,HIGH);

}

delay(3000);

digitalWrite(GREEN_LED_PIN,LOW);

digitalWrite(YELLOW_LED_PIN,LOW);

esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);

esp_deep_sleep_start();

}

步骤7:最终想法

我已经在项目中使用了深度睡眠功能。您还记得几周前我发布的In-Paper电子书温度计吗?不更新时需要60mAs的电流。现在,使用芯片的深度睡眠功能,我设法将电流消耗降低到0.43mAs。因此,有了这种移动电源,我们现在的电池寿命估计约为3个月。很好,不是吗?

但是我认为还有很多改进的余地。我的电路中某处有小电流泄漏。如果我们可以减少它,我们可以使该项目用电池运行一年以上!我认为这太神奇了!我们现在有了一块功能非常强大的板,功耗非常低。最好的是,我们要做的就是利用这一点,只需使用两行代码!我将在以后的项目中大量使用此功能。

责任编辑:wv

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ESP32
    +关注

    关注

    18

    文章

    970

    浏览量

    17197
收藏 人收藏

    评论

    相关推荐

    esp8266和esp32区别是什么

    以下是关于ESP8266和ESP32的主要区别: 处理器和架构 : ESP8266 :使用一个Tensilica L106 80MHz的处理器,属于Xtensa架构。 ESP32 :使
    的头像 发表于 08-19 18:16 5208次阅读

    esp32用什么软件编程

    ESP32是一款由乐鑫(Espressif)推出的低功耗、高性能的Wi-Fi和蓝牙双模微控制器,广泛应用于物联网、智能家居、智能穿戴等领域。要对ESP32进行编程,需要选择合适的编程软件和开发环境
    的头像 发表于 08-19 17:24 3386次阅读

    ESP8266-12退出深度睡眠模式时挂起怎么解决?

    数据。 问题是,当从深度睡眠中醒来时,ESP8266会挂起。当它处于深度睡眠状态时,红色 LED 会变暗。当它挂起时,它会变成亮红色,蓝光
    发表于 07-22 06:26

    ESP8266 CH_PD引脚的作用是否与“深度睡眠”命令相同?

    SDK 功能system_deep_sleep ESP8266进入深度睡眠模式。在RST引脚上的复位脉冲后,芯片将唤醒。 但是什么是CH_PD引脚功能呢?Simetimes那个标记为CH_EN
    发表于 07-19 09:57

    ESP32-WROOM-32E、ESP32-WROOM-32D、ESP32-WROOM-32U 有什么区别?ESP32-WROOM-32 后缀字母代表的意思是?

    相信很多人心里都有这样的疑问,今天就教大家怎么区分它们。 32D和32U是同一个芯片ESP32-D0WD的模组,主要区别的天线模式,分别是板载和IPEX外接天线。 32E是用的升级版的芯片
    的头像 发表于 07-17 10:09 9304次阅读
    <b class='flag-5'>ESP32</b>-WROOM-32E、<b class='flag-5'>ESP32</b>-WROOM-32D、<b class='flag-5'>ESP32</b>-WROOM-32U  有什么区别?<b class='flag-5'>ESP32</b>-WROOM-32 后缀字母代表的意思是?

    ESP8266上运行AT命令固件,通过发送命令AT GSLP使其进入深度睡眠状态,ESP8266如何从深度睡眠中醒来?

    我正在ESP8266上运行 AT 命令固件。我可以通过发送命令 AT GSLP 使其进入深度睡眠状态。但是我如何从深度睡眠中醒来
    发表于 07-16 07:32

    ESP8285处于深度睡眠状态时,XPD_DCDC状态是什么?

    我想知道当ESP8285处于深度睡眠状态时,XPD_DCDC状态是什么。 它是否处于高逻辑水平? 还是在高阻抗下? 换句话说:它是深度睡眠
    发表于 07-15 08:32

    ESP32 深度睡眠

    使用的是ESP32S2 idf 5.2.2 官方代码历程deep_sleep 进入深度睡眠 睡眠后功耗为1.9mA,一直降不下去。
    发表于 07-11 09:50

    ESP32S2最小模块,采用官方例子进入深度睡眠,功耗为什么降不到和官方手册一致

    使用的是ESP32S2 idf 5.2.2 官方代码历程deep_sleep 进入深度睡眠 睡眠后功耗为1.9mA,一直降不下去。
    发表于 07-10 18:02

    请问ESP8266可以在深度睡眠期间连接到接入点吗?

    ESP8266可以在深度睡眠期间连接到接入点吗?
    发表于 07-08 08:09

    ESP8266在深度睡眠模式下是否会保持其GPIO状态?

    我想知道是否有人知道ESP8266在深度睡眠模式下是否会保持其 GPIO 状态。 简单示例:假设有一个 LED 连接到 GPIO4 之一。我想点亮 LED,然后进入深度
    发表于 07-08 06:39

    ESP32能取代STM32吗?哪个更好?

    不能!首先二者不存在哪个更好的问题,因为这两个芯片使用场景各不相同,在嵌入式系统领域,ESP32和STM32都是常见的单片机系列,它们各自具有一定的优势和适用场景。本文主要探讨ESP32是否能够取代
    的头像 发表于 07-06 08:04 1.1w次阅读
    <b class='flag-5'>ESP32</b>能取代STM32吗?哪个更好?

    乐鑫esp32系列在睡眠模式下保持蓝牙连接的功耗测试

    本教程适用于ESP32-S3、ESP32-C3、ESP32-C6睡眠模式介绍ESP32系列常见的休眠方式有三种,分别为Modem-sleep
    的头像 发表于 06-21 08:04 2627次阅读
    乐鑫<b class='flag-5'>esp32</b>系列在<b class='flag-5'>睡眠</b>模式下保持蓝牙连接的功耗测试

    使用esp32c3,用不同的io口唤醒深度睡眠,发现唤醒的原因都是io0唤醒的,这是怎么回事?

    使用esp32c3,用不同的io口唤醒深度睡眠,发现唤醒的原因都是io0唤醒的,这是怎么回事?
    发表于 06-18 08:25

    esp32c3唤醒深度睡眠之后如何连接WiFi?

    我使用GPIO2来唤醒深度睡眠,唤醒之后使用wifi_init_sta()函数想连接WiFi,发现一直复位,如何解决这个问题? switch (esp
    发表于 06-18 07:37