各種ESP32睡眠模式以及如何將ESP32置于深度睡眠模式
ESP8266在構建基于物聯(lián)網(wǎng)的項目中非常受歡迎,但現(xiàn)在ESP32由于其低成本的BLE兼容功能而受到很多關注。它還配備了32個GPIO引腳和32位雙核CPU。雖然,它提供了很多功能,但在正常使用模式下,它似乎很耗電。當應用程序由市電供電時,不必著急,但是當它們由電池供電時,我們必須非常注意ESP32的功耗。
ESP32提供了不同的睡眠模式,使用它我們可以節(jié)省大量的電力,并且可以使用電池源運行我們的物聯(lián)網(wǎng)應用程序更長的時間。在本文中,我們將討論ESP32的不同睡眠模式,并將檢查在正常和深度睡眠模式下的電流消耗。要了解更多關于ESP32的信息,請查看各種基于ESP32的項目。
了解ESP32硬件
從上圖可以看出,ESP32配備了一個雙核32位微處理器,擁有448 KB的ROM, 520 KB的SRAM和4MB的閃存。此外,它具有內置的Wi-Fi模塊,藍牙,RTC和許多其他外圍設備,這使得它在使用ESP32的幾個物聯(lián)網(wǎng)應用中很受歡迎。
ESP32還有一個被稱為ULP的低功耗協(xié)處理器。ULP代表超低功耗,集成在ESP32板中。這個處理器的特點是它可以獨立于主核心處理器運行,它也可以訪問gpio和一些外圍設備。它也可以在ESP32處于深度睡眠模式時運行。當由電池供電時,這有助于節(jié)省大量電力。
ESP32睡眠模式
ESP32可以配置為五種不同的功率模式。每種模式都有不同的功耗額定值。ESP32的不同功率模式有:
?主動模式
?調制解調器睡眠模式
?淺睡眠模式
?深度睡眠模式
?休眠模式
ESP32不同功率模式的比較(根據(jù)pressif數(shù)據(jù)表)如下:
活躍的模式:
在ESP32的主動模式下,CPU、藍牙、Wi-Fi、無線電、RTC和ULP協(xié)處理器等所有器件都處于ON狀態(tài)。這是ESP32最低效的功耗模式。當設備由主電源供電時,首選此模式。根據(jù)快訊數(shù)據(jù)表,它聲稱在這種模式下電流消耗為95-240毫安。
Modem睡眠模式:
在這種模式下,除了Wi-Fi、藍牙、無線電模塊和外圍設備外,所有設備都處于活動狀態(tài)。這種模式在低速下消耗約2毫安,在高速下消耗約50毫安。
當模塊處于這種模式時,如果我們需要藍牙/Wi-Fi連接保持激活狀態(tài),那么我們必須在一定的間隔間隔喚醒模塊,這將使模塊在激活模式和調制解調器睡眠模式之間切換。這種睡眠模式被稱為聯(lián)想睡眠模式。
淺睡眠模式:
在ESP32的淺睡眠模式下,數(shù)字外設、大部分RAM和cpu都是時鐘門控的。當輕睡眠模式退出時,外設和cpu恢復運行,它們的內部狀態(tài)被保留。時鐘門控是一種通過禁用觸發(fā)器的時鐘脈沖來節(jié)省數(shù)字電路功耗的技術,從而禁用開關狀態(tài)。由于切換狀態(tài)消耗大量的電力,因此如果您禁用它,我們可以節(jié)省大量的電力。
ESP32的這種電源模式消耗大約0.8 mA的電流。
深度睡眠模式:
ESP32的深度睡眠模式是非常有效的,消耗非常少的功率時,由電池供電。在這種模式下,一切都被關閉,包括CPU、Wi-Fi、藍牙、外圍設備等。只有ULP協(xié)處理器、RTC和RTC內存在此模式下打開。
我們可以用ULP編寫程序并將其存儲在它的RTC存儲器中,這樣它就可以訪問外設、定時器等。當在深度睡眠模式下工作時,ESP32可以通過使用定時器,外部中斷等事件喚醒。
ESP32深度睡眠功耗約為10-150uA電流,非常令人印象深刻。
冬眠:
在ESP32的這種模式下,除了RTC定時器和一些RTC GPIO引腳外,所有東西都被禁用,當模塊需要喚醒時,這些引腳將很有用。在這種模式下,沒有辦法保存任何數(shù)據(jù),不像深度睡眠模式,我們可以使用RTC內存保存數(shù)據(jù)。
ESP32的這種電源模式消耗的電流最小,約為5ua。
ESP32深度睡眠模式硬件實現(xiàn)
在本節(jié)中,我們將實際演示ESP32的深度睡眠電源模式,并將其電流消耗與有源電源模式進行比較。有幾種方法可以喚醒ESP32模塊從深度睡眠模式,如定時器喚醒,觸摸喚醒,外部喚醒等。在本教程中,我們將專注于Timer喚醒。
在基于定時器的喚醒中,ESP32將進入深度睡眠模式,在一定的時間間隔后,ESP32將自動喚醒并恢復到正常狀態(tài)。這里我們還可以定義一些變量,這些變量可以存儲在RTC內存中,并且可以在每次重新啟動時使用。
在這里,我們用ESP32連接了兩個led,并用面包板電源模塊為ESP32供電。在第一次啟動時,紅色LED將發(fā)光,這將表明ESP32首次啟動。之后,對于所有重啟,綠色LED將發(fā)光,這表明它在RTC內存中保留了啟動編號的值。
從深度睡眠中喚醒ESP32的編程
完整的代碼ESP32喚醒使用定時器在最后給出。下面是對代碼的逐步解釋,該代碼需要上傳到ESP32,以便使ESP32進入深度睡眠模式,然后使用Timer方法喚醒。
首先,我們需要定義睡眠時間,ESP32將進入深度睡眠。為此,首先設置轉換因子以將秒轉換為微秒。然后提供以秒為單位的睡眠時間間隔。在我的例子中,模塊將在6秒內進入深度睡眠模式。
接下來,在RTC內存中定義任意變量,以便在下次重新啟動時保存數(shù)據(jù)。為此,我們需要如下聲明。在我的情況下,我已經(jīng)在串行監(jiān)視器中顯示了ESP32的重啟次數(shù)。
然后創(chuàng)建一個條件檢查是否為第一次啟動。在第一次啟動時,紅色LED將發(fā)光,這將表明ESP32首次啟動。之后,對于所有重啟,綠色LED將發(fā)光,這表明它在RTC內存中保留了啟動編號的值。
在最后一步中,配置我們之前定義的深度睡眠定時器參數(shù)。這可以使用函數(shù)esp_sleep_enable_timer_wakeup來完成,然后調用函數(shù)esp_deep_sleep_start()來啟動ESP32的深度睡眠模式,如下所示。
ESP32睡眠模式測試
活躍的模式:
在這里,你可以看到在主動模式下的電流消耗量約為60mA。
ESP32深度睡眠模式:
現(xiàn)在,將ESP32置于深度睡眠模式后,電流消耗顯著降低到11mA。
本文編譯自iotdesignpro