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+ 浏览量

启动您的职业生涯

完成课程后获得认证

开始学习
广告