隨著物聯網革命每天都在蓬勃發展,連接設備的數量正在迅速增加。未來,大部分設備將相互連接并實時通信。這些設備面臨的問題之一是功耗。這個功耗因素是任何物聯網設備和物聯網項目的關鍵和決定性因素之一。
眾所周知,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);
}
無效循環(){
}
-
物聯網
+關注
關注
2910文章
44752瀏覽量
374575 -
睡眠模式
+關注
關注
0文章
9瀏覽量
6618 -
Wi-Fi模塊
+關注
關注
0文章
33瀏覽量
11164 -
ESP8266
+關注
關注
50文章
962瀏覽量
45134
發布評論請先 登錄
相關推薦
評論