Arduino 中的深度睡眠
Arduino 中的深度睡眠相当于掉电模式,它是所有睡眠模式中功耗最低的。虽然这已经在另一篇文章中介绍过了,但为了完整起见,这里还是简单介绍一下 Arduino 的睡眠模式。
Arduino 的微控制器 ATmega328P 有 6 种睡眠模式,其中 5 种可通过 avr/sleep.h 库实现。
空闲模式
ADC 降噪
掉电模式
省电模式
待机模式
延长待机时间
每种模式都有不同的唤醒方式和功耗。
空闲模式最容易唤醒,而待机和掉电模式最难唤醒(只能通过模块可通过外部中断或看门狗定时器从待机模式退出。掉电模式也是最省电的睡眠模式。
TWI 地址匹配指的是 I2C 或有线地址匹配。只有当微控制器作为 I2C 从设备时,主设备发送与该微控制器对应的地址来唤醒它,微控制器才能通过这种方式唤醒。建议您查阅 ATmega328P 的数据手册,了解更多关于睡眠模式的信息。
现在,您可以直接使用 avr/sleep.h 库,探索 Arduino 中的睡眠模式。 此处给出了一个示例。
然而,正如往常一样,有人努力创建了一个库。这个库名为Low-Power。您可以在 GitHub 上的此处找到它。
Arduino IDE 的库管理器中没有它。安装此类库的方法已在此处说明。
安装此库后,请前往:文件 → 示例 → 低功耗 →示例。。

您将看到两个与 PowerDown 模式相关的示例。在一个示例中,我们使用外部中断唤醒 Arduino,而在另一个示例中,我们使用 WatchDog 定时器唤醒 Arduino。
让我们演示一下外部中断示例。建议您自己尝试一下 powerDownWakePeriodic 示例(它非常简单)。
我们包含 LowPower 库,并将引脚 2 定义为中断引脚。
#include "LowPower.h" // 使用引脚 2 作为唤醒引脚 const int wakeUpPin = 2;
引脚 2 中断使用空的处理程序。
void wakeUp()
{
// 仅用于引脚中断的处理程序。
}
在设置过程中,我们只需将 pin2 的模式设置为 INPUT。
void setup()
{
// 将唤醒引脚配置为输入。
// 这将消耗几 uA 的电流。
pinMode(wakeUpPin, INPUT);
}
在循环中,我们将中断处理程序附加到引脚2(中断 0 对应引脚2。更简洁的做法是attachInterrupt(digitalPinToInterrupt(wakeUpPin), wakeUp, LOW))。
因此,当引脚2接收到低电平信号时,中断就会触发,Arduino 应该会被唤醒。
然后,我们将 Arduino 设置为永久睡眠。我们将禁用 ADC 和掉电检测器。如果 Vcc 线路上的电压低于阈值,掉电检测器会将 ATmega328P 芯片置于复位模式。您可以在此处了解更多信息。
通过禁用掉电检测器,我们确保 Vcc 的任何波动都不会重置模块。ADC 模块无论如何都无法将微控制器从掉电模式唤醒。此后的几行代码仅在 Arduino 唤醒后(即中断后)执行。
void loop()
{
// 允许唤醒引脚在低电平触发中断。
attachInterrupt(0, wakeUp, LOW);
// 进入关机状态,ADC 和 BOD 模块禁用。
// 当唤醒引脚为低电平时唤醒。
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
// 在唤醒引脚上禁用外部引脚中断。
detachInterrupt(0);
// 在此处执行操作
// 示例:读取传感器数据、记录数据、传输数据。
}
为了测试这一点,您只需在 Arduino 进入睡眠状态后,将引脚 2 短接至 GND,发送一个低电平信号即可。您可以将电流表与 Arduino 电源串联,以验证电流在睡眠模式下是否下降。

