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 电源,以验证睡眠模式下的电流是否下降。