Arduino 中的深度睡眠

arduinosoftware & codinghardware更新于 2026/1/11 16:37:17

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


相关文章