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 電源,以驗證睡眠模式下的電流是否下降。

更新於:2021年8月2日

8K+ 瀏覽量

啟動您的職業生涯

完成課程後獲得認證

開始學習
廣告