之前沒玩過省電睡眠模式,所以,先找資料來看,必竟我們要做的是一個不需要開啟的電路,所以就得讓設備處於待機睡眠狀態。
找到一個範例,不難,試燒到自己手邊的板子裡,可以簡單運作。範例網址如下
https://github.com/blevien/attiny85-sleep
加上中文註解後的程式碼如下:
#include <avr/interrupt.h>
#include <avr/sleep.h>
//程式碼來源: https://github.com/blevien/attiny85-sleep
//modified from http://playground.arduino.cc/Learning/arduinoSleepCode
int ledPin = 0; // 程式執行的 LED 腳位 pin 0
int interruptPin = 4; // 告知中斷的 LED 腳位
int wakePin = 2; // 發生中斷的開關,低電位執行。
void setup(){
pinMode(ledPin, OUTPUT); // sets the digital pin as output
pinMode(interruptPin, OUTPUT); // sets the digital pin as output
pinMode(wakePin, INPUT); // sets the digital pin as input
digitalWrite(wakePin, HIGH); //將中斷腳預設成高電位
}
void sleepNow(){
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
// sleep mode is set here
sleep_enable();
// enables the sleep bit in the mcucr register so sleep is possible
attachInterrupt(0, wakeUpNow, LOW);
// 使用中斷0 (pin 2) 當第二腳接地時,執行wakeUpNow 。pin 2是要查表 INT0,ATtiny85只有一隻INT
digitalWrite(ledPin, LOW); //關燈
sleep_mode(); // 進入睡眠
sleep_disable(); // 離開睡眠時,關掉。
detachInterrupt(0); // 關閉中斷0 pin 2 ,如此在一般執行時,才不會被執行 (原始code寫pin 3,應該是pin 2才是)
delay(250); // 小停一下,才可以看到珠斷提示燈亮
digitalWrite (interruptPin, LOW) // 關閉中斷提示燈
}
void wakeUpNow(){ // 醒來要做的事放這邊,然後會回到loop,這邊能放的東西有限制,不能放需要持序執行的
//execute code here after wake-up before returning to the loop() function
// timers and code using timers (serial.print and more...) will not work here.
digitalWrite(interruptPin, HIGH);
}
void loop(){ //主程式
digitalWrite(ledPin, HIGH); // sets the LED on
delay(5000); // waits for a second
sleepNow(); // 在此呼叫睡眠函式
}
這邊有一個特別注意的是INT0,在ATtiny85只有一隻中斷腳,查了pintout後,會知道這隻腳的位置。
原程式沒有給電路圖,不過看完程式就知道電路要怎麼接了。從量到的電流來看,在睡眠模式下會省些電。不過上面的電流值是不正確的,因為目前電源是透過一塊nano供電,所以,上面電流是包含Nano的運行需求。
接下來想一下,是否可以拿這程式改成我要的。