风筝
发表于: 2020-12-4 16:24:36 | 显示全部楼层

通过使用不同的省电模式,您可以将ESP8266的功耗降低64%。


如果您打算使用电池作为下一个项目的电源,请阅读以下文章,其中介绍了ESP8266的不同电源模式,包括调制解调器睡眠、轻度睡眠和深度睡眠。


您将学习如何使用每种电源模式以及可以节省多少电量。


为什么ESP8266功耗很重要?

ESP8266的功耗在15µA至400mA之间,具体取决于不同的使用情况。

在使用WiFi的空闲状态下,NodeMCU V2的电流消耗约为70mA。在3.3V的工作电压下,NodeMCU V2在空闲状态下需要以下功耗:

W= U * I = 3.3V * 70mA = 231mW

因此,NodeMCU每年的能耗为:E = W * 365 * 24 = 2.024 kWh

假设每千瓦时的成本约为0.34美元。如果我想用一个NodeMCU建造一个气象站,那么每年的电费将超过0.7美元,几乎是零。那么,为什么需要关注功耗呢?如何设置才能将每年的成本降至低于1美元?


如果您想建立一个室外气象站并使用电池来操作整个系统,则不必担心功耗。如果您购买了1000mAh的锂电池(工作电压:3.7V),则需要多长时间才需要更换电池组?

T = 1000mAh / 70mA = 14.3小时

因此,您必须每天更换电池。只有理论上您才能使用电池的全部能量。有三个主要影响因素会缩短系统的理论寿命。


1.  ESP8266的最低供电电压为2.5V

在放电期间,电池的电源电压将从3.7V降至0V。如果电源电压降到2.5V以下,ESP8266将关闭,并且不会再次打开。您必须给电池充电。因此,如果您的电池的技术规格为1000mAh,则永远不会使用完整的1000mAh。

下图显示了电池的放电曲线。首先,取决于电池,我们看到阶跃电压下降,然后是电压的近乎稳定的趋势。如果使用约70%至80%的容量,则电压会显着下降,并会降至ESP8266的工作电压以下。

ESP8266_battery_discharging_curve.png

2.  系统不会始终处于空闲模式。您将不得不偶尔执行一次任务,也许是开发板将数据发送到服务器。因此,将会有很短的时间间隔,其中功耗会很高。

3.  每个电池都有基于电池化学物质和电池周围温度的老化,这会随着时间的推移降低电池的可用容量。


延长电池充电时间的方法

您有两种方法可以延长电池充电时间。

1.   购买容量更大的电池。

2.   减少ESP8266微控制器的功耗。


1)让我们假设您购买的电池是6000 mAh而不是1000 mAh。您将使系统的寿命延长6倍。因此,您必须每89个小时更换一次电池,因此需要3.6天。这并不能解决电源问题。我们必须减少ESP8266的功耗。


2)让我们更深入地了解ESP8266的功耗。 ESP8266具有几种睡眠模式以及与这些模式相关的电源解决方案。总共有三种不同的睡眠模式。下表的来源是ESP8266 Espressif生产商的手册。


调制解调器睡眠
轻度睡眠
深度睡眠
Wi-Fi
OFF
OFF
OFF
系统时钟
ON
OFF
OFF
RTC
ON
ON
ON
CPU
ON
挂起
OFF
基板电流
15 mA
0.4 mA
20 uA
平均电流DTIM = 1
16.2 mA
1.8 mA

平均电流DTIM = 2
15.4 mA
0.9 mA

平均电流DTIM = 3
15.2 mA
0.55 mA


请记住,这些是直接从数据手册获得的值,我们不知道这些低值是在什么条件下测量的。因此,我创建了自己的实验来比较不同的省电模式。 NodeMCU的电源为9V恒定电压,而WeMos D1 Mini的电源为6.5V。基于这些汇总值,可以计算出以百分比为单位的功耗降低。


如果不想详细介绍,请参考下表,了解ESP8266 NodeMCU和WeMos D1 Mini的总体性能。


ESP8266 NodeMCU
ESP8266 WeMos D1 Mini
参考模式
39.58
37.81
调制解调器睡眠模式
35.61 (-10.02%)
27.10 (-28.32%)
深度睡眠
22.03 (-44.34%)
13.69 (-63.80%)

以下文章详细说明了不同的省电模式以及实验的实施和执行方式。




测量功耗模式的影响实验

在本篇文章中,我还希望测量使用不同电源模式可以节省的电流消耗。因此,我创建了两个实验:

1.  在示例程序中测量一个周期的详细电流消耗,以得知程序代码中那些步骤导致大电流消耗。

2.  测量示例多个周期的平均电流消耗,以减少异常值对测量的影响。

对于本实验,我不仅要了解不同电源模式的影响,还要了解ESP8266 NodeMCU和ESP8266 WeMos D1 Mini之间的功耗差异。因此,我对两个微控制器都进行了所有测量。


下图显示了NodeMCU和WeMos D1 Mini的硬件接线。

Measure-Power-Modes-NodeMCU_Steckplatine.png

Measure-Power-Modes-WeMosD1Mini_Steckplatine.png


在图像的左侧,您可以看到微控制器与DHT22温湿度传感器模块之间的接线。该微控制器通过UART通信与NodeMCU连接,NodeMCU通过USB连接到PC,以记录测量结果并获得稳定的电源,而与被测电路无关。


为了测量电流消耗,我使用了INA219电流和电压传感器。图片右侧的ESP8266 NodeMCU通过I2C连接到INA219。 INA219串联连接到经过测试的微控制器和外部电源,ESP8266 NodeMCU的外部电源调整为9V,ESP8266 WeMos D1 Mini的外部电源调整为6.5V。


ESP8266电源模式Arduino脚本代码

您需要的第一个脚本是NodeMCU的测量脚本。如果要测量实验多个周期的平均电流消耗,则可以使用Measure_Current_Average程序,也可以是Measure_Current_Detail以仅按实验周期进行测量。


然后,此测量脚本测量下三个模式的影响。

1.  参考实验不使用电源模式。

2.  调制解调器睡眠对使用调制解调器睡眠电源模式的影响。

3.  深度睡眠对测量深度睡眠模式下的电流消耗的影响。


对于程序示例,我使用一个脚本,该脚本每10秒测量一次DHT22传感器的温度和湿度,然后通过MQTT将测量结果发送到Raspberry Pi。当然,您可以使用任何其他脚本来比较电源模式对电流消耗的影响。


ESP8266的参考测量

第一次测量不使用任何电源模式。下图显示了参考测量的一个周期。所有图片的y轴都没有单位,因为它会多次缩放,因此单位没有任何意义。但是,为了比较不同功率模式的影响,不需要任何单位。

Reference_Detail.png

您会看到整体上WeMos D1 Mini在一个周期内的电流消耗较低,因为在空闲状态下,NodeMCU和WeMos之间存在间隙。在程序的一个周期中,还有两个不同的时间,电流消耗达到峰值。第一次是当微控制器建立与Raspberry Pi的WiFi连接时。建立连接后,微控制器读取不需要高电流的传感器值。当温度和湿度通过MQTT发送到Raspberry Pi时,功耗第二次上升。


详细查看一个周期后,下图显示了超过65个周期的电流行为。每次测量是一个周期电流的总和。

Reference_Average.png


目前对这两个微控制器在30到50之间,并且有一些异常值。从图片中我们可以看到,在大多数情况下,与WeMos D1 Mini相比,NodeMCU的电流消耗更高。但是,WeMos的功耗也可能更高。因此,我计算了两个微控制器的每个周期的平均电流,结果如下:

1.  NodeMCU的平均电流消耗:39.58

2.。 WeMos D1 Mini的平均电流消耗:37.81

设定基准后,我们介绍ESP8266的不同的省电模式。对于调制解调器睡眠和深度睡眠,我计算了详细的平均功耗以比较不同的结果。


调制解调器睡眠Modem-sleep

ESP8266自动访问调制解调器的睡眠模式。唤醒触发器也会自动设置。因此,您不必配置接口。


如果要将NodeMCU设置为Modem-sleep,则必须通过STA模式(站点模式)设置WiFi连接。 STA模式用于使ESP8266连接到由路由器等接入点建立的WiFi网络。

  1. #include "ESP8266WiFi.h"
  2. #include "WiFiClient.h"

  3. void setup() {
  4.   Serial.begin(115200);
  5.   
  6. }

  7. void loop() {
  8.   WiFi.mode( WIFI_OFF );
  9.   WiFi.forceSleepBegin();
  10.   Serial.println("WiFi is down");
  11.   delay(20000);

  12.   WiFi.forceSleepWake();
  13.   delay(1);
  14.   // Bring up the WiFi connection
  15.   WiFi.mode(WIFI_STA);
  16.   WiFi.begin("XXX", "XXX");

  17.   // Wait until the connection has been confirmed before continuing
  18.   while (WiFi.status() != WL_CONNECTED) {
  19.     delay(500);
  20.     Serial.print(".");
  21.   }

  22.   // Debugging - Output the IP Address of the ESP8266
  23.   Serial.println("WiFi connected");
  24.   Serial.print("IP address: ");
  25.   Serial.println(WiFi.localIP());
  26.   delay(2000);
  27. }
复制代码

在调制解调器睡眠模式下,ESP8266通过DTIM信标机制保持与当前Wi-Fi的连接。


DTIM信标机制

A08-IMG08-BcastDeliveryDTIM.png


信标是网络主机发送的广播传输。信标传输是周期性的,通常以传输单位(TU)的倍数设置。信标传输术语是DTIM(Delivery Traffic Indication Map)间隔。该间隔是基本信标传输间隔的倍数。


例如:如果基本信标传输间隔为100ms,DTIM间隔为2,则每隔一个信标就是一个DTIM信标。每个信标在每个信标传输中都有一个减计数器(Beacon DTIM cnt)。当计数器计数为零时,ESp8266处于调制解调器睡眠模式。如果计数器的值为0,则它​​是DTIM信标,并且ESP8266唤醒WiFi以接收数据。


DTIM间隔也可以大于2。DTIM间隔越大,ESO8266处于调制解调器睡眠模式并节省能量的时间就越长。


调制解调器睡眠电流测量

在了解了调制解调器休眠电源功能的工作原理之后,我们想知道节能模式如何影响实验中的电流消耗。下图显示了MQTT实验中一个周期的详细信息。

ModemSleep_Detail.png


与参考测量相比,我们看到电流尖峰也将近200,因为调制解调器睡眠功能不会影响将微控制器连接到WiFi网络或通过MQTT传输传感器数据到Raspberry Pi所需的功耗。


但是我们看到的是,当发送数据时,微控制器的WiFi被关闭,因此电流消耗从参考测量的75降低到25。


在下一张图片中还可以清楚地看到总体功耗的降低,这表明与参考测量相比,调制解调器睡眠功能的多个周期的测量。

ModemSleep_Average.png


如果将ESP8266 NodeMCU的功耗与WeMos D1 Mini进行比较,我们会发现WeMos在调制解调器睡眠模式下的能耗更低,NodeMCU的平均能耗为27.10至35.61。因此,如果我们想最大程度地延长电池供电实验的寿命,那么使用调制解调器睡眠模式会产生积极影响。


轻度睡眠

轻度睡眠模式与调制解调器睡眠模式非常相似。仅有的两个区别是:

1.  ESP8266系统时钟的电源

2.  内部CPU处于挂起状态


因此,开发板将不会响应来自其他硬件接口的信号和中断。 ESP8266需要从外部GPIO唤醒。唤醒过程需要少于3ms。通过GPIO唤醒ESP8266的接口为:void gpio_pin_wakeup_enable(uint32 i, GPIO_INT_TYPE intr_state);


这两个差异导致功耗从15mA大幅下降至0.4mA。


以下示例将NodeMCU连接和断开与本地WiFi的连接,并将睡眠模式设置为浅睡眠。

  1. void setup() {
  2.   Serial.begin(115200);
  3. }

  4. void loop() {
  5.   // Disable light sleep
  6.   wifi_set_sleep_type(NONE_SLEEP_T);
  7.   delay(2000);

  8.   // Enable light sleep
  9.   wifi_set_sleep_type(LIGHT_SLEEP_T);
  10.   delay(2000);
  11. }
复制代码

深度睡眠

如果要使用外部电源并节省尽可能多的能量,请进入深度睡眠模式!从理论上讲,ESP8266的功耗降至20µA * 3.3V = 66µW。您的1000mAh外接电池续航时间更长。

T = 1000mAh / 20µA = 50,000h = 2083天= 5.7年

与其他两种模式不同,系统无法自动进入深度睡眠模式。用户可以调用接口函数system_deep_sleep立即启用深度睡眠。在这种模式下,芯片将关闭Wi-Fi连接和数据连接。只有RTC模块仍在工作,负责定期唤醒。


要启用深度睡眠模式,您只需要使用以下代码行:ESP.deepSleep(uint32 time_in_us);在此处定义一个时间,ESP8266从深度睡眠模式醒来的时间。深度睡眠的最大时间为4,294,967,295 µs,约为71分钟。


在定义的时间之后,ESP8266将被来自D0引脚(GPIO16)的复位脉冲唤醒,该引脚被定义为唤醒线路。因此,您必须将D0与RST物理连接。


下面图片显示了如何在深度睡眠阶段之后将D0引脚与RST连接以唤醒ESP8266 NodeMCU和WeMos D1 Mini微控制器。

Deep-sleep.png


深度睡眠电流测量

因为从理论上讲,ESP8266的深度睡眠模式是微控制器具有最低功耗的模式,所以我们想知道与参考示例相比功耗有多低。


下图再次详细显示了实验的一个周期。就像在调制解调器睡眠模式下一样,当微控制器建立WiFi连接并发送测量值时,功耗不会降低,但是当ESP8266进入深度睡眠模式时,电流消耗将下降到甚至更低。

DeepSleep_Detail.png

当我们比较实验的多次运行时,我们看到相同的结果。

DeepSleep_Average.png


深度睡眠减少了多少的电流消耗?

与不使用电源模式相比,深度睡眠模式可将NodeMCU的ESP8266电流消耗降低至WeMos D1 Mini的ESP8266电流消耗降低64%。因此,如果您的项目取决于电池的寿命,则深度睡眠模式的使用至关重要。


重要的是,在实验中,微控制器仅进入睡眠模式10秒钟,然后在下一个周期继续循环功能。在一个真实的项目中,例如一个室外气象站,睡眠时间将是几分钟而不是几秒钟。因此,深度睡眠模式的影响将更大,从而导致更低的电流消耗。


上图中的第二个重要事实是,与NodeMCU相比,在深度睡眠模式下,WeMos再次消耗了几乎一半的电量。我认为很明显,WeMos消耗的功率更少,因为整个微控制器更小,所需的零件更少。


总结

在本文中,您学习了如何通过深度睡眠模式来延长电池供电项目的寿命。如果您计划做一个电池供电的项目,我建议将WeMos D1 Mini与深度睡眠节能模式结合使用。


希望您喜欢本篇文章,并在当前或下一个项目中使用深度睡眠模式。如有任何疑问,请随时在本帖下面进行回复。


跳转到指定楼层
lala5
发表于: 2021-2-2 12:45:43 | 显示全部楼层

你好楼主! 一直很喜欢看你的文章,有个疑问就是esp8266的深度睡眠只能是用外部硬件唤醒吗? 在睡眠模式下是不是IO口都不能被MCU调用?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 56 | 回复: 109



手机版|

GMT+8, 2024-12-21 20:35 , Processed in 0.073351 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表