Arduino 休眠模式
Arduino 中深度睡眠的等效項是關機模式,這是所有睡眠模式中功耗最低的模式。雖然這在另一篇文章中已經介紹過,但為了完整起見,這裡簡要介紹一下 Arduino 的睡眠模式。
Arduino 的微控制器 ATmega328P 有 6 種睡眠模式,其中 5 種可以使用avr/sleep.h 庫。
空閒模式
ADC 噪聲抑制
關機模式
省電模式
待機模式
擴充套件待機模式
每種模式都有不同的喚醒方式和不同的功耗。
空閒模式最容易喚醒,而待機模式和關機模式最難喚醒(只能使用外部中斷或看門狗定時器從待機模式喚醒模組)。關機模式也是最節能的睡眠模式。
TWI 地址匹配指的是 I2C 或 Wire 地址匹配。只有當微控制器是 I2C 從機,並且主控傳送與該微控制器對應的地址來喚醒它時,微控制器才能透過這種方式喚醒。建議您閱讀 ATmega328P 的資料手冊,瞭解更多關於睡眠模式的資訊。
現在,您可以直接使用avr/sleep.h 庫並探索 Arduino 中的睡眠模式。這裡提供了一個示例。
然而,就像往常一樣,有人已經努力建立了一個庫。該庫名為Low-Power。它可以在 GitHub 上找到這裡。
它在 Arduino IDE 的庫管理器中不可用。安裝此類庫的方法已在這裡解釋。
安裝此庫後,轉到:檔案 → 示例 → Low-Power → 示例。
您會發現兩個與關機模式相關的示例。在一個示例中,我們使用外部中斷喚醒 Arduino,而在另一個示例中,我們使用看門狗定時器喚醒 Arduino。
讓我們逐步完成外部中斷示例。建議您自己嘗試powerDownWakePeriodic 示例(非常簡單)−
我們包含LowPower 庫,並將引腳 2 定義為中斷引腳。
#include "LowPower.h" // Use pin 2 as wake up pin const int wakeUpPin = 2;
一個空處理程式用於引腳 2 中斷。
void wakeUp() { // Just a handler for the pin interrupt. }
在 setup 中,我們只需將pin2 的模式設定為INPUT。
void setup() { // Configure wake up pin as input. // This will consumes few uA of current. pinMode(wakeUpPin, INPUT); }
在迴圈中,我們將中斷處理程式附加到pin2(中斷 0 對應於 pin2。更簡潔的方法是attachInterrupt(digitalPinToInterrupt(wakeUpPin), wakeUp, LOW))。
因此,當引腳 2 上接收到低電平時,將觸發中斷,Arduino 應該喚醒。
然後我們將 Arduino 設定為永久睡眠。我們正在停用 ADC 和掉電檢測器。如果 Vcc 線上的電壓低於閾值,則掉電檢測器會將 ATmega328P 晶片置於復位模式。您可以這裡瞭解更多資訊。
透過停用掉電檢測器,我們確保 Vcc 的任何波動都不會重置模組。無論如何,ADC 模組都不能從關機模式喚醒微控制器。只有在 Arduino 喚醒後(即中斷後),才會執行接下來的幾行。
void loop() { // Allow wake up pin to trigger interrupt on low. attachInterrupt(0, wakeUp, LOW); // Enter power down state with ADC and BOD module disabled. // Wake up when wake up pin is low. LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); // Disable external pin interrupt on wake up pin. detachInterrupt(0); // Do something here // Example: Read sensor, data logging, data transmission. }
為了測試這一點,您只需在 Arduino 休眠後,透過將其短路到 GND,在引腳 2 上傳送低電平訊號。您可以將電流表串聯到 Arduino 電源,以驗證睡眠模式下的電流是否下降。