如何在任何物联网应用中使用ESP8266来节省电力
随着物联网革命每天都在蓬勃发展,连接设备的数量正在迅速增加。未来,大部分设备将相互连接并实时通信。这些设备面临的问题之一是功耗。这个功耗因素是任何物联网设备和物联网项目的关键和决定性因素之一。
众所周知,ESP8266 是构建任何物联网项目的最受欢迎的模块之一,因此在本文中,我们将了解如何在任何物联网应用中使用 ESP8266 来节省电力。在这里,我们每隔 15 秒将 LM35 温度传感器数据上传到 ThingSpeak 云,在这 15 秒内,ESP8266 保持在 DeepSleep 模式以节省电量
降低功耗的不同方法
有几种方法可以优化嵌入式和物联网设备的功耗。可以在硬件和软件上进行优化。有时我们无法优化硬件组件以降低功耗,但我们可以通过更改和优化代码指令和功能在软件方面做到这一点。不仅如此,开发人员还可以修改时钟频率以降低微控制器功耗。
我们可以编写一个固件,让硬件在没有数据交换时休眠,并在特定的时间间隔内执行定义的任务。在睡眠模式下,连接的硬件消耗的电量非常少,因此电池可以持续很长时间。如果您想了解有关功耗技术的更多信息,还可以阅读微控制器中的最小化功耗。
ESP8266 模块是使用最广泛的 Wi-Fi 模块,具有许多小尺寸的功能,具有不同的模式,包括睡眠模式,并且可以通过对硬件和软件进行一些修改来访问这些模式。
在这里,我们将解释ESP8266 中可用的不同睡眠模式,并通过使用深度睡眠模式定期向Thingspeak 服务器发送温度数据来演示它们。
所需组件
ESP8266 Wi-Fi 模块
LM35温度传感器
跳线
ESP8266 中的睡眠模式类型
Esp8266 模块工作在以下模式:
主动模式:在该模式下,整个芯片上电,芯片可以接收、发送数据。显然,这是最耗电的模式。
调制解调器睡眠模式:在此模式下,CPU 处于运行状态,Wi-Fi 无线电被禁用。此模式可用于需要 CPU 工作的应用中,如PWM中。它使 Wi-Fi Modem 电路在与 Wi-Fi AP(接入点)连接时关闭,没有数据传输,以优化功耗。
Light-sleep 模式:在此模式下,CPU 和所有外设都处于暂停状态。外部中断等任何唤醒都会唤醒芯片。在没有数据传输的情况下,可以关闭 Wi-Fi Modem 电路并暂停 CPU 以节省功耗。
深度睡眠模式:在此模式下,只有RTC正常工作,芯片的所有其他组件都断电。此模式在数据在较长时间间隔后传输的情况下很有用。
ESP8266 中的深度睡眠模式
Modem-sleep 和 Light-sleep 在您需要让 ESP8266 模块运行而某些功能关闭时很有用。但是,如果您需要一些严格的电源控制,请选择深度睡眠模式。整体平均电流小于1mA。在 2.5V 时,电流要求仅为 20 μA。
使用深度睡眠模式的步骤:
将模块与 Wi-Fi AP 连接
执行读取传感器值、发布 MQTT 消息等任务。
休眠定义的微秒数
再次重复上述过程
睡眠时间以微秒为单位定义。根据 ESP8266 SDK,您只能休眠 4,294,967,295 μs,即约 71 分钟。
设置 ESP8266 模块:
将 ESP8266 的 RST 引脚与 GPIO 16 即 D0 引脚连接。GPIO 16 是具有 WAKE 功能的重要引脚。
将LM35 温度传感器连接到 NodeMCU 的 A0 引脚。
当 ESP 模块的 RST 引脚为高电平时,它处于运行状态。一旦它在 RST 引脚上接收到 LOW 信号,ESP 就会重新启动。
使用深度睡眠模式设置定时器,一旦定时器结束,D0 引脚向 RST 引脚发送 LOW 信号,模块将通过重启唤醒。
现在,硬件已经准备就绪并且配置良好。温度读数将在 Thingspeak 服务器上发送。为此,请在 thingspeak.com 上创建一个帐户,并通过以下步骤创建一个频道。
现在,复制 Write API 密钥。这将在 ESP 代码中使用。
ESP8266 深度睡眠模式编程
首先包括所需的所有重要库。
#include
一旦包含所有用于访问函数的库,然后分配 API 写入密钥,配置您的 Wi-Fi 名称和密码。然后声明所有变量以供进一步使用要存储数据的位置。
字符串 apiWritekey = "*************"; // 在此处替换为您的 THINGSPEAK WRITEAPI 密钥 char ssid[] = "******"; // 你的 wifi SSID 名称 char password[] = "******" ;// wifi 密码
现在,使用wifi.begin()函数将模块连接到 Wi-Fi 网络,然后使用 while 循环不断检查直到模块没有连接到 Wi-Fi。
void connect1() { WiFi.disconnect(); 延迟(10); WiFi.begin(ssid, 密码); 而(WiFi.status()!= WL_CONNECTED){
制作另一个函数将数据发送到 thingspeak 服务器。在这里,将发送一个字符串,其中包含 API 写入密钥、字段编号和必须发送的数据。然后使用 client.print() 函数发送这个字符串。
void data() { if (client.connect(server,80)) { String tsData = apiWritekey; tsData +="&field1="; tsData += String(tempF); tsData += "\r\n\r\n"; client.print("POST /update HTTP/1.1\n"); client.print("主机:api.thingspeak.com\n");
调用 connect1 函数,该函数将调用该函数来连接 Wi-Fi,然后读取温度并将其转换为摄氏度。
无效设置() { Serial.begin(115200); Serial.println("设备处于唤醒模式"); 连接1(); int 值 = 模拟读取(A0); 浮动电压=(值/1024.0)*5.0; tempC = 伏*100.0;
现在,调用 data() 函数将数据上传到 thingspeak 云上。最后,调用的重要函数是 ESP.deepSleep();这将使模块在定义的时间间隔内休眠,以微秒为单位。
数据(); Serial.println("深度睡眠 15 秒"); ESP.deepSleep(15e6);
循环功能将保持为空,因为所有任务都必须执行一次,然后在定义的时间间隔后重置模块。
本教程末尾提供了工作视频和完整代码。上传 ESP8266 模块中的代码。上传程序前先拔掉RST和D0的连接线,否则会报错。
在 ESP8266 中测试 DeepSleep
上传程序后,您会看到温度读数每 15 秒上传到 ThingSpeak 云,然后模块进入深度睡眠模式。
// esp8266 deepsleep
#include
String apiWritekey = "*************";
字符 ssid[] = "XXXXXXXXXX"; // 输入你的 wifi 家庭路由器 ssid
字符密码[] = "XXXXXXXXXX" ; // 输入你的 wifi 家庭路由器 ssid
char server[] = "api.thingspeak.com";
双温度F;
双温度C;
WiFiClient客户端;
void connect1() {
WiFi.disconnect();
延迟(10);
Serial.print("正在连接");
序列号.println(ssid);
WiFi.begin(ssid, 密码);
而(WiFi.status()!= WL_CONNECTED){
延迟(500);
Serial.print(".");
}
Serial.println("");
Serial.print("NodeMcu 连接到 wifi...");
}
void data() {
if (client.connect(server,80))
{
String Data = apiWritekey;
数据 +="&field1=";
数据 += 字符串(tempF);
数据 += "\r\n\r\n";
client.print("POST /update HTTP/1.1\n");
client.print("主机:api.thingspeak.com\n");
client.print("连接:关闭\n");
client.print("X-THINGSPEAKAPIKEY: "+apiWritekey+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("内容长度:");
client.print(Data.length());
client.print("\n\n");
客户端.打印(数据);
Serial.println("上传到 Thingspeak 服务器....");
}
client.stop();
}
void setup() {
Serial.begin(115200);
Serial.println("设备处于唤醒模式");
while (!Serial) { }
connect1();
int 值 = 模拟读取(A0);
浮动电压=(值/1024.0)*5.0;//转换为伏特
tempC = volts*100.0; //转换为摄氏温度
Serial.print("Temperature C: ");
Serial.println(tempC);
数据();
Serial.println("深度睡眠 15 秒");
ESP.deepSleep(15e6);
}
无效循环(){
}