功耗是设备长时间连续运行而不断电的关键因素。因此,为了解决这个问题,几乎每个控制器都带有睡眠模式,这有助于开发人员设计电子设备以实现最佳功耗。休眠模式通过关闭未使用的模块将器件置于省电模式。
今天我们将了解Arduino睡眠模式(Sleep Mode)并使用Ammeter演示功耗。 Arduino睡眠模式也称为Arduino省电模式(Power Save mode)或Arduino待机模式(Standby Mode)。
Arduino睡眠模式
睡眠模式允许用户停止或关闭微控制器中未使用的模块,从而显着降低功耗。 Arduino UNO、Arduino Nano和Pro-mini配备了ATmega328P,它有一个欠压检测器(BOD),用于监控睡眠模式时的电源电压。
ATmega328P有六种睡眠模式:
要进入任何睡眠模式,我们需要在睡眠模式控制寄存器(SMCR.SE)中启用睡眠位。然后,睡眠模式选择位选择Idle、ADC noise reduction、Power-Down、Power-Save、Standby和External Standby的睡眠模式。
内部或外部Arduino中断或复位可以将Arduino从睡眠模式唤醒。
空闲(Idle)模式
要进入空闲休眠模式,请写入控制器“000”的SM [2,0]位。此模式停止CPU,但允许SPI、2线串行接口、USART、看门狗、计数器、模拟比较器工作。空闲模式基本上停止CLKCPU和CLKFLASH。通过使用外部或内部中断,可以随时唤醒Arduino。
空闲睡眠模式的Arduino代码:
LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF, SPI_OFF, USART0_OFF, TWI_OFF);
有一个用于在arduino中设置各种低功耗模式的库。因此,首先从给定链接下载并安装库,然后使用上面的代码将Arduino置于空闲睡眠模式。通过使用上面的代码,Arduino将进入8秒的睡眠状态并自动唤醒。正如您在代码中所看到的,空闲模式会关闭所有定时器、SPI、USART和TWI(2线接口)。
ADC降噪模式(ADC noise reduction)
要使用此睡眠模式,请将SM [2,0]位写入“001”。该模式会停止CPU,但允许ADC、外部中断、USART、2线串行接口、看门狗和计数器运行。 ADC降噪模式基本上停止CLKCPU、CLKI / O和CLKFLASH。我们可以通过以下方法从ADC降噪模式唤醒控制器:
● 外部复位
● 看门狗系统复位
● 看门狗中断
● 欠压复位
● 2线串行接口地址匹配
● INT上的外部电平中断
● 引脚更改中断
● 定时器/计数器中断
● SPM / EEPROM就绪中断
掉电模式(Power-Down Mode)
掉电模式会停止所有生成的时钟,并且只允许异步模块的操作。可以通过将SM [2,0]位写入'010'来启用它。在此模式下,外部振荡器关闭,但2线串行接口、看门狗和外部中断继续运行。它只能通过以下方法之一禁用:
● 外部复位
● 看门狗系统复位
● 看门狗中断
● 欠压复位
● 2线串行接口地址匹配
● INT上的外部电平中断
● 引脚更改中断
用于掉电周期模式的Arduino代码:
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
该代码用于打开省电模式。通过使用上面的代码,Arduino将进入8秒的睡眠状态并自动唤醒。
我们还可以使用具有中断的掉电模式,其中Arduino将进入休眠状态,但仅在提供外部或内部中断时才会唤醒。
用于掉电中断模式的Arduino代码:
void loop()
{
// Allow wake up pin to trigger interrupt on low.
attachInterrupt(0, wakeUp, LOW);
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
// Disable external pin interrupt on wake up pin.
detachInterrupt(0);
// Do something here
}
省电模式(Power-Save)
要进入省电模式,我们需要将SM [2,0]引脚写入'011'。该睡眠模式类似于掉电模式,只有一个例外,即如果启用定时器/计数器,即使在睡眠时它也将保持运行状态。可以使用定时器溢出唤醒设备。
如果您没有使用时间/计数器,建议使用掉电模式而不是省电模式。
待机模式(Standby)
待机模式与掉电模式相同,它们之间的唯一区别是外部振荡器在此模式下保持运行。要启用此模式,请将SM [2,0]引脚写入“110”。
扩展待机模式(Extended Standby)
此模式类似于省电模式,只有振荡器保持运行的一个例外。当我们将SM [2,0]引脚写入'111'时,器件将进入扩展待机模式。从延长待机模式唤醒器件需要6个时钟周期。
需要的组件
● Arduino UNO开发板
● DHT11温湿度传感器
● USB电流表
● 面包板
● 连接线
USB电流表
USB电流表是一种即插即用设备,用于测量任何USB端口的电压和电流。加密狗插入USB电源(计算机USB端口)和USB设备(Arduino)之间。该器件具有与电源引脚串联的0.05欧姆电阻,通过它可以测量所消耗的电流值。该设备配有四个七段显示屏,可立即显示连接设备消耗的电流和电压值。这些值以每三秒的间隔刷新。
电路原理图
在上面的演示中演示了Arduino深度睡眠模式,Arduino插入USB电流表,然后将USB电流表插入笔记本电脑的USB端口。 DHT11传感器的数据引脚连接到Arduino的D2引脚。
代码说明
首先包含DHT11传感器和LowPower库。要下载LowPower库,请单击此链接。然后我们定义了DHT11的数据引脚所连接的Arduino引脚编号,并定义了一个DHT对象。
#include
#include
#define dataPin 2
dht DHT;
在void setup()函数中,我们使用serial.begin(9600)启动了串行通信,这里9600是波特率。我们使用Arduino的内置LED作为睡眠模式的指示器。因此,我们将引脚设置为输出,将数字写入设置为低电平。
void setup() {
Serial.begin(9600);
pinMode(LED_BUILTIN,OUTPUT);
digitalWrite(LED_BUILTIN,LOW);
}
在void loop()函数中,我们将内置LED设为HIGH,并从传感器读取温度和湿度数据。在这里,DHT.read11();函数是从传感器读取数据。计算完数据后,我们可以通过将值保存到任何变量来检查这些值。在这里,我们采用了两个浮点型变量't'和'h'。因此,温度和湿度数据在串口监视器上串行打印。
void loop() {
Serial.println("Get Data From DHT11");
delay(1000);
digitalWrite(LED_BUILTIN,HIGH);
int readData = DHT.read11(dataPin); // DHT11
float t = DHT.temperature;
float h = DHT.humidity;
Serial.print("Temperature = ");
Serial.print(t);
Serial.print(" C | ");
Serial.print("Humidity = ");
Serial.print(h);
Serial.println(" % ");
delay(2000);
在启用睡眠模式之前,我们正在打印“Arduino: - I am going for a Nap”并使内置LED为低电平。之后,在代码中使用下面提到的命令启用Arduino睡眠模式。
下面的代码启用Arduino的空闲周期性睡眠模式,并提供8秒的睡眠。它将ADC、定时器、SPI、USART、2线接口转为OFF状态。
然后它会在8秒后自动从睡眠中唤醒Arduino并打印出“Arduino:- Hey I just Woke up”。
Serial.println("Arduino:- I am going for a Nap");
delay(1000);
digitalWrite(LED_BUILTIN,LOW);
LowPower.idle(SLEEP_8S, ADC_OFF, TIMER2_OFF, TIMER1_OFF, TIMER0_OFF,
SPI_OFF, USART0_OFF, TWI_OFF);
Serial.println("Arduino:- Hey I just Woke up");
Serial.println("");
delay(2000);
}
因此,通过使用此代码,Arduino将在一分钟内唤醒24秒,并在36秒的剩余时间内保持睡眠状态,这将显着降低Arduino气象站的功耗。
因此,如果我们将Arduino与睡眠模式一起使用,我们可以将设备运行时间显著增加。
编辑:hfy
全部0条评论
快来发表一下你的评论吧 !