在最一開始接觸Arduino,大家都會使用delay來讓led閃爍。
但慢慢地你會開始讓Arduino控制更多東西,結果發現你的程式因為delay讓處理器空轉,導致Arduino無法做其他事。
這時候該怎麼辦呢?
下列分享給你一個不使用delay就可以讓led閃爍的方法~
內容目錄
不用delay,那要用甚麼?
我們要用millis()這個函示來完成這個小專案
millis()說明
當我們呼叫這個函式時,他會回傳Arduino從開機到現在所經過的時間(毫秒ms),大約50天後數字會溢出(也就是會歸零)。
我個人覺得millis()有點像是時間軸的感覺~
millis()函式應用
我會透過三個步驟來達到計時的目的:
- 先呼叫millis(),並把這個值先賦於給startTime,相當於我們在時間軸上做了一個標記。
- 當程式進到迴圈時,就可以將”現在時間”-“開始時間”,就可以獲得”經過時間”,Duration=millis()-startTime。
- 最後我們可以用判斷式if,來判斷Duration是否達到條件。
LED on/off 控制流程
範例程式
const int LedPin=13;
int startTime;
int Duration;
int OnTime=500; //可自訂led On的時間
int OffTime=500; //可自訂led Off的時間
boolean ledStatus;
void setup() {
Serial.begin(115200);
pinMode(LedPin,OUTPUT);
startTime=millis();
ledStatus=HIGH;
}
void loop() {
Duration=millis()-startTime;
if(Duration<=OnTime&&ledStatus==HIGH){
digitalWrite(LedPin,HIGH);
Serial.println("ON");
if(Duration==OnTime){
ledStatus=LOW;
startTime=millis();
}
}
else if(Duration<=OffTime&&ledStatus==LOW){
digitalWrite(LedPin,LOW);
Serial.println("OFF");
if(Duration==OffTime){
ledStatus=HIGH;
startTime=millis();
}
}
}
影片
影片中使用上面的範例程式,以及更改onTime、offTime,會使led閃爍出不同效果。
下面影片則是用可變電阻來改變on/off時間。
總結一下,為了避免使用delay讓Arduino停滯,所以希望用”條件判斷”的方式來做控制,當時間還沒有到設定的條件時,就可以去做其他控制等等,因此才用millis()來檢視現在時間以及計算。
網路上還有許多大大們有更不錯的寫法,也歡迎大家來多多研究分享,謝謝大家~
更簡單的寫法
2022/5/31更新
這邊是看到網路上這篇文章”Arduino教程:使用millis()代替delay()”
跟我之前寫得比起來真的簡單很多,其中心思想是差不多的,但程式簡化很多。
利用time_now=millis();來刷新新的標記點的感覺,period是從time_now往後算計時的時間,
還有要注意的是time_now一定要使用unsigned long變數,不然會有溢出的狀況,導致時間亂掉。
unsigned long time_now = 0;
int period=300;//計時的時間
void setup() {
Serial.begin(115200);
time_now = millis();
}
void loop() {
if(millis() > time_now + period){
time_now = millis();
Serial.println("Hello");
}
//Run other code
}
最後!! 你喜歡這篇文章,或是這篇文章對你有幫助的話,也歡迎分享出去給需要的人,訂閱免費電子報獲得最新資訊😄😄😄