今天來說說Delay的一些相關問題
很多人會為了求方便而直接在程式後面加上delay,從前的我也是這樣,但這個會嚴重影響整個程式的執行續
用範例裡面的Blink打個比方好了, 他在digitalWrite(LED_BUILTIN,HIGH)後面直接加上個delay, 整個執行續就會直接卡在這個delay中,直到delay時間結束才會繼續處理後續的程式碼
如果你有控制的程式在這delay下方,又剛好需要做控制時,那麼程式碼不會讀取到,就會造成資料遺失的問題。
下面則是以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去做其他的事件觸發了