close

 

今天來說說Delay的一些相關問題


很多人會為了求方便而直接在程式後面加上delay,從前的我也是這樣,但這個會嚴重影響整個程式的執行續

用範例裡面的Blink打個比方好了, 他在digitalWrite(LED_BUILTIN,HIGH)後面直接加上個delay, 整個執行續就會直接卡在這個delay中,直到delay時間結束才會繼續處理後續的程式碼

如果你有控制的程式在這delay下方,又剛好需要做控制時,那麼程式碼不會讀取到,就會造成資料遺失的問題。

Blink.png


下面則是以millis()取代delay的方法

 

  • const int ledpin = 13;

用arduino內建13pin的LED燈做控制

 

  • int ledState = LOW;

追蹤LED現在目前的狀態

 

  • unsigned long previousMillis = 0;

          由於millis()返回的是一個unsigned long的形式,所以變量需要相同的變量類型

         這是用來存取最後的時間點

 

  • unsigned long interval = 1000;

          這就是我們需要等待的時間

 

  • void setup() {
      pinMode(ledPin, OUTPUT);

         這就是最初始化得部份,把ledPin設定成輸出

 

  • void loop

          開始進入無限循環中

 

  • unsigned long currentMillis = millis();

         記住喔!! 不是從此刻才開始記錄時間 是從城市開始運行就已經在計數了,50天左右會overflow

 

  • if( currentMillis - previousMillis > interval )

          這代表說 如果現在的時間(持續進行的時間)減去你剛剛的時間(每進一次迴圈previousMillis =currentMillis ),超過1秒的話,進入此迴圈,這行看似複雜,但你只要在你的Arduino IDE上試著              打   過一次,然後分別在這迴圈底下打上

          Serial.println(currentMillis);

Serial.println(previousMillis); 

其實就只是過一秒的意思啦!!!!!!!!!

 

 

  • 底下剩餘的就只是判斷狀態而已,如果現在狀態為高電位,就改成低電為輸出,反之也是,這樣才會有一秒閃爍的感覺啊~~~                                                      

           


會了這個你就可以自己試試看做""1個LED閃爍頻率1s,1個LED閃爍頻率0.5s""外加一個button去做其他的事件觸發了

 

 

創作者介紹
創作者 superme55557 的頭像
superme55557

superme55557的部落格

superme55557 發表在 痞客邦 留言(0) 人氣()