风筝
发表于: 2019-4-20 21:23:38 | 显示全部楼层

随着物联网革命每天都在蓬勃发展,连接设备的数量正在迅速增加。将来,多数设备将实现互连并实时通信。这些设备面临的其中一个问题就是功耗。此功耗因数是任何物联网设备和物联网项目的关键和决定性因素之一。

How-to-use-Deep-Sleep-Mode-in-ESP8266-for-Power-Saving.jpg


我们知道ESP8266是搭建任何物联网项目最受欢迎的模块之一,因此在本文中我们将学习如何在物联网应用中使用ESP8266时降低功耗。本文中,我们以15秒的间隔将LM35温度传感器数据上传到ThingSpeak云,在这15秒内,ESP8266将处于深度睡眠(Deep Sleep)模式以降低功耗。


最小化功耗的几种不同方法

有几种方法可以优化嵌入式和物联网设备的功耗。优化可以在硬件和软件上完成。有时我们无法优化硬件组件以降低功耗,但我们肯定可以通过更改和优化代码指令和功能在软件方面实现。不仅如此,开发人员还可以修改时钟频率以降低微控制器的功耗。


我们可以编写固件,以便在没有数据交换时使硬件进入休眠状态,并在特定时间间隔内执行定义的任务。在休眠模式下,连接的硬件消耗的电量非常少,因此电池可以持续很长时间。


ESP8266模块是使用最广泛的Wi-Fi模块,功能强大,具有不同的功耗模式,包括睡眠模式,这些模式可以通过硬件和软件的一些修改来访问。要了解有关ESP8266的更多信息,您可以使用ESP826 Wi-Fi模块查看论坛中其他一些基于物联网的项目,其中一些列表如下:

●    Atmega16微控制器连接ESP8266 NodeMCU实现发送电子邮件

●    使用ESP8266和Arduino的基于物联网的患者监护系统

●    如何使用Arduino、ESP8266和气体传感器制作物联网烟雾探测系统


本文中,我们将介绍ESP8266中可用的一些不同睡眠模式,并通过使用深度睡眠模式定期向Thingspeak服务器发送温度数据来演示这些睡眠模式。


需要的组件

●    ESP8266 Wi-Fi模块

●    LM35温度传感器

●    跳线


ESP8266中的睡眠模式类型

ESP8266模块可以在以下模式运行:

1.   活动模式:在此模式下,整个芯片上电,芯片可以接收、传输数据。显然,这是耗电量最大的模式。

2.   调制解调器睡眠模式:在此模式下,CPU可以运行,但禁用Wi-Fi无线电。此模式可用于需要CPU工作的应用程序,如PWM。它使Wi-Fi调制解调器电路在与Wi-Fi AP(接入点)连接时关闭,无数据传输以优化功耗。

3.   轻度睡模式:在此模式下,CPU和所有外围设备都暂停。任何唤醒(如外部中断)都会唤醒芯片。在没有数据传输的情况下,可以关闭Wi-Fi调制解调器电路并暂停CPU以节省功耗。

4.   深度睡眠模式:在此模式下,只有RTC功能正常,芯片的所有其他组件都断电。在长时间间隔后传输数据的情况下,此模式非常有用。

Difference-Between-Three-Sleep-Modes-in-ESP8266-for-saving-Power.png


ESP8266中的深度睡眠模式

当某些功能关闭时,需要ESP8266模块运行时,调制解调器睡眠模式和轻度睡眠模式非常有用。但如果您需要一些更高的功耗控制,那么请选择深度睡眠模式。总平均电流小于1mA。在2.5V时,电流仅需20μA。


使用深度睡眠模式的步骤:

1.    将模块与Wi-Fi AP连接

2.    执行读取传感器值,发布MQTT消息等任务。

3.    根据定义的微秒数睡眠一段时间

4.    再次重复上述过程


睡眠时间以微秒为单位。根据ESP8266 SDK,您只能睡眠 4,294,967,295 μs,大约71分钟。


设置ESP8266模块:

将ESP8266的RST引脚与GPIO 16连接,即D0引脚。 GPIO 16是具有WAKE功能的重要引脚。

Circuit-Diagram-for-using-Deep-Sleep-Mode-in-ESP8266-for-Power-Saving.png

将LM35温度传感器与NodeMCU的A0引脚相连。

Circuit-Hardware-for-using-Deep-Sleep-Mode-in-ESP8266-for-Power-Saving.jpg

当ESP模块的RST引脚上为高电平时,它处于运行状态。一旦在RST引脚上接收到LOW信号,ESP就会重新启动。


使用深度睡眠模式设置定时器,一旦定时器结束,D0引脚将低电平信号发送到RST引脚,模块将通过重新启动来唤醒。


现在,硬件已准备就绪且配置良好。温度读数将发送到Thingspeak服务器上。为此,请在thingspeak.com上创建一个帐户,并通过以下步骤创建一个频道。


现在,复制Write API密钥。该密钥将在ESP代码中使用。

Setting-up-the-ESP8266-Module.gif


ESP8266深度睡眠模式编程

我们将使用Arduino IDE编程ESP8266模块,这非常容易实现。确保已安装所有ESP8266开发板的文件。


首先包括所需的所有重要库。

  1. #include <ESP8266WiFi.h>
复制代码

一旦包含所有库,就可以使用相关的函数,然后分配API写密钥、配置您的Wi-Fi名称和密码。然后声明所有变量以供进一步使用存储数据的位置。

  1. String apiWritekey = "*************"; // replace with your THINGSPEAK WRITEAPI key here
  2. char ssid[] = "******"; // your wifi SSID name
  3. char password[] = "******" ;// wifi pasword
复制代码

现在,使用wifi.begin()函数创建一个连接模块和Wi-Fi网络的函数,然后while循环持续检查WIFI状态,直到模块连接到Wi-Fi。

  1. void connect1() {
  2.   WiFi.disconnect();
  3.   delay(10);
  4.   WiFi.begin(ssid, password);
  5.   while (WiFi.status() != WL_CONNECTED) {
复制代码

创建另一个函数将数据发送到thingpeak服务器。这里将发送一个字符串,其中包含API写密钥、字段编号和必须发送的数据。然后使用client.print()函数发送此字符串。

  1. void data() {
  2.   if (client.connect(server,80))
  3.   {  
  4.     String tsData = apiWritekey;
  5.            tsData +="&field1=";
  6.            tsData += String(tempF);
  7.            tsData += "\r\n\r\n";
  8.      client.print("POST /update HTTP/1.1\n");
  9.      client.print("Host: api.thingspeak.com\n");
复制代码

调用connect1函数,该函数将调用函数连接Wi-Fi,然后读取温度读数并将其转换为摄氏温度。

  1. void setup() {
  2.   Serial.begin(115200);
  3.   Serial.println("device is in Wake up mode");
  4.   connect1();
  5.   int value = analogRead(A0);
  6.   float volts=(value/1024.0)*5.0;      
  7.   tempC = volts*100.0;   
复制代码

现在,调用data()函数向thingpeak云上传数据。最后,调用的重要函数是ESP.deepSleep();该函数将使模块在定义的时间间隔内休眠,该时间间隔以微秒为单位。

  1. data();
  2. Serial.println("deep sleep for 15 seconds");
  3. ESP.deepSleep(15e6);
复制代码

循环函数将保持为空,因为所有任务必须执行一次,然后在定义的时间间隔后复位模块。


在本文的末尾处给出了完整代码。上传代码到ESP8266模块中。在上传程序之前移除RST和D0连接线,否则会出错。


在ESP8266中测试深度睡眠模式

上传程序后,您将看到温度读数每15秒后上传到ThingSpeak云,然后模块进入深度睡眠模式。

Testing-Deep-Sleep-in-ESP8266.png

以上就是在ESP8266模块中使用深度睡眠的全部内容。深度睡眠是非常重要的功能,它已被包含在大多数设备中。您可以参考本教程并将此方法应用于不同的项目。如有任何疑问或建议,请在本帖下面进行回复。


代码

本文使用的完整代码如下: main.zip (867 Bytes, 下载次数: 108)

跳转到指定楼层
智定义科技
发表于: 2020-2-22 03:15:29 | 显示全部楼层

博主你好!
Serial.println("deep sleep for 15 seconds");
ESP.deepSleep(15e6);
可以告诉我15e6是怎么计算出来的吗?
回复

使用道具 举报

风筝
发表于: 2020-2-22 08:46:52 | 显示全部楼层

智定义科技 发表于 2020-2-22 03:15
博主你好!
Serial.println("deep sleep for 15 seconds");
ESP.deepSleep(15e6);

deepSleep的参数是以微秒为单位 15e6是数学方式 代表15秒
回复

使用道具 举报

加布歹
发表于: 2020-3-20 16:04:54 | 显示全部楼层

博主你好,怎么实现休眠半个小时啊?
回复

使用道具 举报

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

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-20 18:21 , Processed in 0.152192 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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