对于长时间不关闭而连续运行的设备而言,功耗是一个关键问题。因此,要克服此问题,几乎每个控制器都带有睡眠模式,该模式可帮助开发人员设计电子产品以实现最佳功耗。睡眠模式通过关闭未使用的模块将设备置于省电模式。
之前我们已经解释了ESP8266的节电模式。今天,我们将学习Arduino睡眠模式,并通过使用Ammeter演示功耗。Arduino睡眠模式也称为Arduino省电模式或Arduino待机模式。
Arduino睡眠模式
睡眠模式允许用户停止或关闭微控制器中未使用的模块,从而大大降低了功耗。Arduino UNO,Arduino Nano和Pro-mini随附ATmega328P,并且具有欠压检测器(BOD),可在睡眠模式时监视电源电压。
ATmega328P有六种睡眠模式:
要进入任何睡眠模式,我们需要启用睡眠模式控制寄存器(SMCR.SE)中的睡眠位。然后,睡眠模式选择位在空闲,ADC降噪,掉电,省电,待机和外部待机之间选择睡眠模式。
内部或外部Arduino中断或复位可以将Arduino从睡眠模式唤醒。
空闲模式
要进入空闲睡眠模式,请写控制器000的SM位。此模式停止CPU,但允许SPI,2线串行接口,USART,看门狗,计数器,模拟比较器运行。空闲模式基本上停止了CLK CPU和CLK FLASH。通过使用外部或内部中断,可以随时唤醒Arduino。
用于空闲睡眠模式的Arduino代码:
LowPower.idle(SLEEP_8S,ADC_OFF,TIMER2_OFF,TIMER1_OFF,TIMER0_OFF,SPI_OFF,USART0_OFF,TWI_OFF);
在arduino中有一个用于设置各种低功耗模式的库。因此,首先从给定的链接下载并安装库,然后使用上面的代码将Arduino置于空闲睡眠模式。通过使用上面的代码,Arduino将进入八秒钟的睡眠状态并自动唤醒。正如您在代码中看到的那样,空闲模式会关闭所有定时器,SPI,USART和TWI(2线接口)。
ADC降噪模式
要使用该睡眠模式,将SM位写为001。该模式停止CPU,但允许ADC,外部中断,USART,2线串行接口,看门狗和计数器运行。ADC降噪模式基本上可以停止CLK CPU,CLK I / O和CLK FLASH。我们可以通过以下方法将控制器从 ADC降噪 模式唤醒:
- 外部复位
- 看门狗系统重置
- 看门狗中断
- 掉电复位
- 2线串行接口地址匹配
- INT上的外部电平中断
- 引脚更改中断
- 定时/计数器中断
- SPM / EEPROM准备中断
掉电模式
掉电模式将停止所有生成的时钟,并且仅允许异步模块运行。可以通过将SM位写为010来使能。在这种模式下,外部振荡器关闭,但2线串行接口,看门狗和外部中断继续运行。只能通过以下一种方法禁用它:
- 外部复位
- 看门狗系统重置
- 看门狗中断
- 掉电复位
- 2线串行接口地址匹配
- INT上的外部电平中断
- 引脚更改中断
掉电定期模式的Arduino代码:
LowPower.powerDown(SLEEP_8S,ADC_OFF,BOD_OFF);
该代码用于打开掉电模式。通过使用上面的代码,Arduino将进入八秒钟的睡眠状态并自动唤醒。
我们还可以将掉电模式与中断一起使用,在该模式下,Arduino会进入睡眠状态,但仅在提供外部或内部中断时才唤醒。
掉电中断模式的Arduino代码:
void loop() { //允许唤醒引脚在低电平时触发中断。 attachInterrupt(0,唤醒,LOW); LowPower.powerDown(SLEEP_FOREVER,ADC_OFF,BOD_OFF); //禁止唤醒引脚上的外部引脚中断。 detachInterrupt(0); //在这里做某事 }
省电模式
要进入省电模式,我们需要将SM引脚写入'011'。该睡眠模式类似于掉电模式,只有一个例外,即如果启用了定时器/计数器,即使在睡眠时它也将保持运行状态。可以使用定时器溢出将设备唤醒。
如果您不使用时间/计数器,建议使用掉电模式而不是省电模式。
待机模式
待机模式与掉电模式相同,它们之间的唯一区别是外部振荡器保持在该模式下运行。为了使能该模式,将SM引脚写入“ 110”。
扩展待机模式
该模式与省电模式相似,只是振荡器一直处于运行状态。当我们将SM引脚写入“ 111”时,器件将进入扩展待机模式。该设备将花费六个时钟周期从扩展待机模式中唤醒。
按照电路图连接电路后,以下是该项目的要求。使用Arduino IDE将睡眠模式代码上传到Arduino。Arduino将进入空闲睡眠模式。然后,检查USB电流表中的电流消耗。否则,您也可以使用钳形表。
所需组件
- Arduino UNO
- DHT11温湿度传感器
- USB电流表
- 面包板
- 连接线
要了解有关将DHT11与Arduino结合使用的更多信息,请点击链接。在这里,我们使用USB Ammeter来测量Arduino在睡眠模式下消耗的电压。
USB电流表
USB电流表是一种即插即用设备,用于测量来自任何USB端口的电压和电流。加密狗插入USB电源(计算机USB端口)和USB设备(Arduino)之间。该器件具有一个与电源引脚串联的0.05ohm电阻器,通过该电阻器可以测量汲取的电流值。该设备带有四个七段显示器,可立即显示所连接设备消耗的电流和电压值。这些值每隔三秒翻转一次。
规范:
- 工作电压范围:3.5V至7V
- 最大额定电流:3A
- 体积小巧,便于携带
- 无需外部电源
应用:
- 测试USB设备
- 检查负载水平
- 调试电池充电器
- 工厂,电子产品和个人使用
电路原理图
在上述设置中,我们将Arduino插入USB电流表以演示Arduino深度睡眠模式。然后将USB电流表插入笔记本电脑的USB端口。DHT11传感器的数据引脚连接到Arduino的D2引脚。
代码说明
最后给出了带有视频的项目的完整代码。
通过包括用于DHT11传感器和所述库中的代码起始 低功率 库。要下载低功耗库,请单击链接。然后,我们定义了DHT11的数据引脚所连接到的Arduino引脚号,并创建了一个DHT对象。
#包括
在 void setup 函数中,我们使用 serial.begin(9600) 启动了串行通信 , 这里的9600是波特率。我们正在使用Arduino的内置LED作为睡眠模式的指示器。因此,我们将引脚设置为输出,并将数字写为低电平。
void setup(){ Serial.begin(9600); pinMode(LED_BUILTIN,OUTPUT); digitalWrite(LED_BUILTIN,LOW); }
在 空循环 功能中,我们将内置LED设为高电平,并从传感器读取温度和湿度数据。在这里, DHT.read11(); 命令正在从传感器读取数据。计算数据后,我们可以将其保存到任何变量中来检查值。在这里,我们采用了两个浮点型变量 't' 和 'h' 。因此,温度和湿度数据将在串行监视器上串行打印。
void loop(){ Serial.println(“从DHT11获取数据”); 延迟(1000); digitalWrite(LED_BUILTIN,HIGH); int readData = DHT.read11(dataPin); // DHT11 浮点数t = DHT.temperature; 浮点h = DHT。湿度; Serial.print(“ Temperature =”); Serial.print(t); Serial.print(“ C-”); Serial.print(“ Humidity =”); Serial.print(h); Serial.println(“%”); delay(2000);
在启用睡眠模式之前,我们先打印 “ Arduino:-我要打个ap”, 然后将内置LED调低。之后,使用代码中下面提到的命令启用Arduino睡眠模式。
下面的代码启用Arduino的 空闲定期睡眠模式 ,并提供八秒钟的睡眠。它将ADC,定时器,SPI,USART,2线接口变为OFF状态。
然后,它会在8秒钟后自动将Arduino从睡眠中唤醒,并显示 “ Arduino:-嘿,我刚醒来”。
Serial.println(“ Arduino:-我要午睡”); 延迟(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:-嘿,我刚醒来”); Serial.println(“”); delay(2000); }
因此,通过使用此代码,Arduino将在一分钟内仅唤醒24秒,并且将在36秒的其余时间内保持睡眠状态,这将大大降低Arduino气象站的功耗。
因此,如果我们将Arduino与睡眠模式一起使用,我们可以使设备运行时间大约增加一倍。