ESP32 睡眠種類有哪些? #
ESP32的工作模式一般可分成以下五種:
1. Active 正常模式:
一般的運作狀態,可開啟藍芽及 WiF。
2. Modem-Sleep 通訊關閉:
沒有啟動藍芽或 WiFi 的狀態,為手動關閉通訊模組時的狀態。
3. Light-Sleep 輕度睡眠:
主 CPU 、記憶體呈”暫停”狀態,同時通訊部份也是關閉狀態,此狀態可以大幅省電。
4. Deep-Sleep 深度睡眠:
主 CPU、記憶體呈現”關閉”狀態,僅 RTC 週邊及 RTC 記憶體是開啟狀態,此時系統會比輕度睡眠更加省電。
5. Hibernation休眠:
主 CPU、記憶體、RTC 週邊、RTC 記憶體全部都關閉。
輕度及深度休眠的不同處? #
1. CPU :
當輕度睡眠時,CPU 為”暫停”,而深度睡眠時 CPU 則是完全”關閉”,暫停與關閉的差異就是CPU在睡眠前的狀態是否還存在,”暫停”在喚醒後還可以接續執行,”關閉”則代表 CPU 完全斷電,在喚醒後必須從頭執行。
2. 主記憶體 :
輕度睡眠時記憶體內的變數會被”保留”,喚醒後仍可取用這些變數的值,而深度睡眠時主記憶體內容會被”清除”,喚醒後是無法存取睡眠前的任何變數。
3. 程式流程 :
輕度睡眠時,喚醒後的程式會”接續”執行睡眠後的指令,而深度睡眠喚醒後,由於CPU及記憶體都已重設,因此必須”從頭”開始執行。
4. 腳位狀態 :
輕度睡眠時,腳位的狀態會被”保留”,但深度睡眠時,所有腳位的狀態都被”清除”。
喚醒方式有哪些? #
主要喚醒方式可以分成以下五種 :
1. TIMER:由 RTC 計時器喚醒
就跟睡前定鬧鐘一樣,利用「esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP)」就可以設定未來進入睡眠後,應該多久後喚醒。
2. EX0:RTC 單一腳位喚醒
利用 RTC 來感測某特定腳位是 HIGH 或 LOW 時來喚醒,例如:esp_sleep_enable_ext0_wakeup(GPIO_NUM_33, HIGH),代表當GPIO33為HIGH時就喚醒。
3. EX1:RTC 多腳位喚醒
當需要喚醒腳位超過一隻時,就必須使用這個功能,由於很多腳位要用一個 BITMASK 變數來代替,因此必須了解如何計算 BITMASK ,以下圖為例子 :
在觸發腳 9,6,2 腳位編號下面寫上 1,其餘不會觸發喚醒的腳位寫 0,那麼這個 2 進位的數字就是「1001000100」,換成 10 進位=2^9+2^6+2^2=580,再換成 16 進位為 0x244,那麼 BITMASK 即等於 0x244。
4. TOUCHPAD:RTC 觸控腳喚醒
ESP32 內建 10 個觸控腳,可以感測人體靜電,當有人觸摸時,數值會降到 30 以下,因此我們可以設定觸控門檻值為 30,當有人觸摸時,系統就會被喚醒。
5. ULP:協同 CPU 喚醒
ESP32 當進入睡眠狀態,雖然腳位也關閉了,但 VCC 及 GND 還是保持送電狀態,若希望感測器在休眠時,也關閉感測器,可以將感測器的 VCC 腳利用某個 IO 送 HIGH 來取代。
另外建議電力不要從 ESP32 的 USB 接入,因為當 ESP32 休眠時,模組上面的 USBTTL 並沒有一起休眠,並會耗用電力,若希望電力能撐更久的話,就避免接到 USB,而是接到 ESP32 的 VIN、GND 腳,或者直接使用有付電池插孔的 ESP32。
》資料來源:【ESP32 專欄】ESP32 MQTT 與深度睡眠