【Arduino】不使用delay來讓led閃爍,millis()函式使用分享。

【Arduino】millis()使用分享

在最一開始接觸Arduino,大家都會使用delay來讓led閃爍

但慢慢地你會開始讓Arduino控制更多東西,結果發現你的程式因為delay讓處理器空轉,導致Arduino無法做其他事。

這時候該怎麼辦呢?

下列分享給你一個不使用delay就可以讓led閃爍的方法~

不用delay,那要用甚麼?

我們要用millis()這個函示來完成這個小專案

millis()說明

當我們呼叫這個函式時,他會回傳Arduino從開機到現在所經過的時間(毫秒ms),大約50天後數字會溢出(也就是會歸零)。

我個人覺得millis()有點像是時間軸的感覺~

millis()函式應用

我會透過三個步驟來達到計時的目的:

  1. 先呼叫millis(),並把這個值先賦於給startTime,相當於我們在時間軸上做了一個標記。
  2. 當程式進到迴圈時,就可以將”現在時間”-“開始時間”,就可以獲得”經過時間”,Duration=millis()-startTime。
  3. 最後我們可以用判斷式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


}

最後!! 你喜歡這篇文章,或是這篇文章對你有幫助的話,也歡迎分享出去給需要的人,訂閱免費電子報獲得最新資訊😄😄😄

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *