隨著物聯(lián)網(wǎng)革命每天都在蓬勃發(fā)展,連接設(shè)備的數(shù)量正在迅速增加。未來(lái),大部分設(shè)備將相互連接并實(shí)時(shí)通信。這些設(shè)備面臨的問(wèn)題之一是功耗。這個(gè)功耗因素是任何物聯(lián)網(wǎng)設(shè)備和物聯(lián)網(wǎng)項(xiàng)目的關(guān)鍵和決定性因素之一。
眾所周知,ESP8266 是構(gòu)建任何物聯(lián)網(wǎng)項(xiàng)目的最受歡迎的模塊之一,因此在本文中,我們將了解如何在任何物聯(lián)網(wǎng)應(yīng)用中使用 ESP8266 來(lái)節(jié)省電力。在這里,我們每隔 15 秒將 LM35 溫度傳感器數(shù)據(jù)上傳到 ThingSpeak 云,在這 15 秒內(nèi),ESP8266 保持在 DeepSleep 模式以節(jié)省電量
降低功耗的不同方法
有幾種方法可以優(yōu)化嵌入式和物聯(lián)網(wǎng)設(shè)備的功耗。可以在硬件和軟件上進(jìn)行優(yōu)化。有時(shí)我們無(wú)法優(yōu)化硬件組件以降低功耗,但我們可以通過(guò)更改和優(yōu)化代碼指令和功能在軟件方面做到這一點(diǎn)。不僅如此,開(kāi)發(fā)人員還可以修改時(shí)鐘頻率以降低微控制器功耗。
我們可以編寫(xiě)一個(gè)固件,讓硬件在沒(méi)有數(shù)據(jù)交換時(shí)休眠,并在特定的時(shí)間間隔內(nèi)執(zhí)行定義的任務(wù)。在睡眠模式下,連接的硬件消耗的電量非常少,因此電池可以持續(xù)很長(zhǎng)時(shí)間。如果您想了解有關(guān)功耗技術(shù)的更多信息,還可以閱讀微控制器中的最小化功耗。
ESP8266 模塊是使用最廣泛的 Wi-Fi 模塊,具有許多小尺寸的功能,具有不同的模式,包括睡眠模式,并且可以通過(guò)對(duì)硬件和軟件進(jìn)行一些修改來(lái)訪問(wèn)這些模式。
在這里,我們將解釋ESP8266 中可用的不同睡眠模式,并通過(guò)使用深度睡眠模式定期向Thingspeak 服務(wù)器發(fā)送溫度數(shù)據(jù)來(lái)演示它們。
所需組件
ESP8266 Wi-Fi 模塊
LM35溫度傳感器
跳線
ESP8266 中的睡眠模式類(lèi)型
Esp8266 模塊工作在以下模式:
主動(dòng)模式:在該模式下,整個(gè)芯片上電,芯片可以接收、發(fā)送數(shù)據(jù)。顯然,這是最耗電的模式。
調(diào)制解調(diào)器睡眠模式:在此模式下,CPU 處于運(yùn)行狀態(tài),Wi-Fi 無(wú)線電被禁用。此模式可用于需要 CPU 工作的應(yīng)用中,如PWM中。它使 Wi-Fi Modem 電路在與 Wi-Fi AP(接入點(diǎn))連接時(shí)關(guān)閉,沒(méi)有數(shù)據(jù)傳輸,以優(yōu)化功耗。
Light-sleep 模式:在此模式下,CPU 和所有外設(shè)都處于暫停狀態(tài)。外部中斷等任何喚醒都會(huì)喚醒芯片。在沒(méi)有數(shù)據(jù)傳輸?shù)那闆r下,可以關(guān)閉 Wi-Fi Modem 電路并暫停 CPU 以節(jié)省功耗。
深度睡眠模式:在此模式下,只有RTC正常工作,芯片的所有其他組件都斷電。此模式在數(shù)據(jù)在較長(zhǎng)時(shí)間間隔后傳輸?shù)那闆r下很有用。
ESP8266 中的深度睡眠模式
Modem-sleep 和 Light-sleep 在您需要讓 ESP8266 模塊運(yùn)行而某些功能關(guān)閉時(shí)很有用。但是,如果您需要一些嚴(yán)格的電源控制,請(qǐng)選擇深度睡眠模式。整體平均電流小于1mA。在 2.5V 時(shí),電流要求僅為 20 μA。
使用深度睡眠模式的步驟:
將模塊與 Wi-Fi AP 連接
執(zhí)行讀取傳感器值、發(fā)布 MQTT 消息等任務(wù)。
休眠定義的微秒數(shù)
再次重復(fù)上述過(guò)程
睡眠時(shí)間以微秒為單位定義。根據(jù) ESP8266 SDK,您只能休眠 4,294,967,295 μs,即約 71 分鐘。
設(shè)置 ESP8266 模塊:
將 ESP8266 的 RST 引腳與 GPIO 16 即 D0 引腳連接。GPIO 16 是具有 WAKE 功能的重要引腳。
將LM35 溫度傳感器連接到 NodeMCU 的 A0 引腳。
當(dāng) ESP 模塊的 RST 引腳為高電平時(shí),它處于運(yùn)行狀態(tài)。一旦它在 RST 引腳上接收到 LOW 信號(hào),ESP 就會(huì)重新啟動(dòng)。
使用深度睡眠模式設(shè)置定時(shí)器,一旦定時(shí)器結(jié)束,D0 引腳向 RST 引腳發(fā)送 LOW 信號(hào),模塊將通過(guò)重啟喚醒。
現(xiàn)在,硬件已經(jīng)準(zhǔn)備就緒并且配置良好。溫度讀數(shù)將在 Thingspeak 服務(wù)器上發(fā)送。為此,請(qǐng)?jiān)?thingspeak.com 上創(chuàng)建一個(gè)帳戶,并通過(guò)以下步驟創(chuàng)建一個(gè)頻道。
現(xiàn)在,復(fù)制 Write API 密鑰。這將在 ESP 代碼中使用。
ESP8266 深度睡眠模式編程
首先包括所需的所有重要庫(kù)。
#include
一旦包含所有用于訪問(wèn)函數(shù)的庫(kù),然后分配 API 寫(xiě)入密鑰,配置您的 Wi-Fi 名稱和密碼。然后聲明所有變量以供進(jìn)一步使用要存儲(chǔ)數(shù)據(jù)的位置。
字符串 apiWritekey = "*************"; // 在此處替換為您的 THINGSPEAK WRITEAPI 密鑰 char ssid[] = "******"; // 你的 wifi SSID 名稱 char password[] = "******" ;// wifi 密碼
現(xiàn)在,使用wifi.begin()函數(shù)將模塊連接到 Wi-Fi 網(wǎng)絡(luò),然后使用 while 循環(huán)不斷檢查直到模塊沒(méi)有連接到 Wi-Fi。
void connect1() { WiFi.disconnect(); 延遲(10); WiFi.begin(ssid, 密碼); 而(WiFi.status()!= WL_CONNECTED){
制作另一個(gè)函數(shù)將數(shù)據(jù)發(fā)送到 thingspeak 服務(wù)器。在這里,將發(fā)送一個(gè)字符串,其中包含 API 寫(xiě)入密鑰、字段編號(hào)和必須發(fā)送的數(shù)據(jù)。然后使用 client.print() 函數(shù)發(fā)送這個(gè)字符串。
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("主機(jī):api.thingspeak.com\n");
調(diào)用 connect1 函數(shù),該函數(shù)將調(diào)用該函數(shù)來(lái)連接 Wi-Fi,然后讀取溫度并將其轉(zhuǎn)換為攝氏度。
無(wú)效設(shè)置() { Serial.begin(115200); Serial.println("設(shè)備處于喚醒模式"); 連接1(); int 值 = 模擬讀取(A0); 浮動(dòng)電壓=(值/1024.0)*5.0; tempC = 伏*100.0;
現(xiàn)在,調(diào)用 data() 函數(shù)將數(shù)據(jù)上傳到 thingspeak 云上。最后,調(diào)用的重要函數(shù)是 ESP.deepSleep();這將使模塊在定義的時(shí)間間隔內(nèi)休眠,以微秒為單位。
數(shù)據(jù)(); Serial.println("深度睡眠 15 秒"); ESP.deepSleep(15e6);
循環(huán)功能將保持為空,因?yàn)樗腥蝿?wù)都必須執(zhí)行一次,然后在定義的時(shí)間間隔后重置模塊。
本教程末尾提供了工作視頻和完整代碼。上傳 ESP8266 模塊中的代碼。上傳程序前先拔掉RST和D0的連接線,否則會(huì)報(bào)錯(cuò)。
在 ESP8266 中測(cè)試 DeepSleep
上傳程序后,您會(huì)看到溫度讀數(shù)每 15 秒上傳到 ThingSpeak 云,然后模塊進(jìn)入深度睡眠模式。
// 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("正在連接");
序列號(hào).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;
數(shù)據(jù) +="&field1=";
數(shù)據(jù) += 字符串(tempF);
數(shù)據(jù) += "\r\n\r\n";
client.print("POST /update HTTP/1.1\n");
client.print("主機(jī):api.thingspeak.com\n");
client.print("連接:關(guān)閉\n");
client.print("X-THINGSPEAKAPIKEY: "+apiWritekey+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("內(nèi)容長(zhǎng)度:");
client.print(Data.length());
client.print("\n\n");
客戶端.打印(數(shù)據(jù));
Serial.println("上傳到 Thingspeak 服務(wù)器....");
}
client.stop();
}
void setup() {
Serial.begin(115200);
Serial.println("設(shè)備處于喚醒模式");
while (!Serial) { }
connect1();
int 值 = 模擬讀取(A0);
浮動(dòng)電壓=(值/1024.0)*5.0;//轉(zhuǎn)換為伏特
tempC = volts*100.0; //轉(zhuǎn)換為攝氏溫度
Serial.print("Temperature C: ");
Serial.println(tempC);
數(shù)據(jù)();
Serial.println("深度睡眠 15 秒");
ESP.deepSleep(15e6);
}
無(wú)效循環(huán)(){
}
-
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2894文章
43316瀏覽量
366519 -
睡眠模式
+關(guān)注
關(guān)注
0文章
8瀏覽量
6575 -
Wi-Fi模塊
+關(guān)注
關(guān)注
0文章
33瀏覽量
11114 -
ESP8266
+關(guān)注
關(guān)注
50文章
959瀏覽量
44545
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論