Arduino - 休眠模式

Arduino像电脑和手机一样,也具备休眠功能。
在休眠状态下,系统几乎完全停止运作,只保留基本的侦测功能,因此只消耗少许电力。

主要功能函数如下:

  //引用库文件
  #include <avr/sleep.h>
  // 设置休眠模式
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);
  // 进入休眠状态
  sleep_mode (); 

注意: sleep_mode 为宏指令,它会自动自动开启休眠功能、进入睡眠状态、禁用休眠功能。 按照官方解释,在某些条件下, sleep_mode 宏会导致个别操作步骤开启休眠功能并发出sleep指令进入休眠,所以,另外提供了以下三个指令来分步完成sleep_mode ()工作:

  // 开启休眠功能
  sleep_enable();
  // 进入休眠状态
  sleep_cpu (); 
  //关闭休眠功能 
  sleep_disable();

也就是说,貌似使用sleep_mode会出现意外情况,所以,根据情况自己选择吧。

测试代码如下:

#include <avr/wdt.h>  
#include <avr/sleep.h>
int ledPin = 13;
int shu=0;

ISR(WDT_vect){
  //看门狗唤醒执行函数
  shu++;
}

void setup() {  
pinMode(ledPin, OUTPUT);   
set_sleep_mode(SLEEP_MODE_PWR_DOWN); //设置休眠模式。
sleep_enable(); //开启休眠功能。
//ACSR |=_BV(ACD);//关掉ACD,据说很省电。不知道唤醒以后要不要重新开,怎么开?
//ADCSRA=0;//关掉ADC,据说很省电。不知道唤醒以后要不要重新开,怎么开?
//按照官方解释,sleep_enable()最好写在中断(attachInterrupt())前,防止中断在开始休眠前就提前释放而造成休眠后无法唤醒。
//开始设置看门狗中断,用来唤醒。   
MCUSR &= ~(1<<WDRF);
WDTCSR |= (1<<WDCE) | (1<<WDE);
WDTCSR = 1<<WDP1 | 1<<WDP2;
WDTCSR |= _BV(WDIE); 
}  

void loop()  
{  
  if (shu>=5){
  digitalWrite(ledPin, HIGH);    
  delay(500);     
  digitalWrite(ledPin, LOW);    
  shu=0;
  }
  sleep_cpu();//进入休眠状态,从此处开始进入休眠。
  //这里不需要喂狗。目的就是等狗超时后执行唤醒函数。 
} 

或者代码可以如下:

#include <avr/wdt.h>  
#include <avr/sleep.h>
int ledPin = 13;
int shu=0;

ISR(WDT_vect){
  //看门狗唤醒执行函数
  shu++;
}

void setup() {  
pinMode(ledPin, OUTPUT);   
set_sleep_mode(SLEEP_MODE_PWR_DOWN); //设置休眠模式。
//开始设置看门狗中断,用来唤醒。   
MCUSR &= ~(1<<WDRF);
WDTCSR |= (1<<WDCE) | (1<<WDE);
WDTCSR = 1<<WDP1 | 1<<WDP2;
WDTCSR |= _BV(WDIE); 
}  

void loop()  
{  
  if (shu>=5){
  digitalWrite(ledPin, HIGH);    
  delay(500);     
  digitalWrite(ledPin, LOW);    
  shu=0;
  }
  sleep_mode(); //进入休眠状态,从此处开始进入休眠。
  //这里不需要喂狗。目的就是等狗超时后执行唤醒函数。 
} 
  • 8
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卢光庆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值