將 Arduino pin 10 設為 OUTPUT
(數位輸出)。將一顆 LED 如電路圖所示接上 pin 10 ,並寫程式讓 LED 每隔 0.5 秒閃爍一次
程式碼與 Lab 4-1-1 Pull-down Resistor 相同。
啟用 Arduino 數位接腳的內建上拉電阻。根據 Atmel 公司的技術文件,此內建上拉電阻值為 20K歐姆 ~ 50K歐姆 間。內建上拉電阻預設沒有啟用,須將接腳設定為 INPUT_PULLUP ,才可啟用內建上拉電阻。
沿用 Lab 4-1-1 Pull-down Resistor 的硬體 電路 。將程式改為: 一開始 LED 滅。之後,按一下開關 LED 亮。再按一下開關 LED 滅。
ledState
與 prevSWState
為全域變數。ledState
負責記錄 LED 的狀態。初始值為 LOW
,也就是熄滅。prevSWState
負責記錄按鈕的前一個狀態。初始值為 RELEASED
。swState
負責記錄按鈕目前的狀態。初始值為 RELEASED
。setup
LED
) 設定為 OUTPUT
。 pin 2 (SWITCH
) 設定為 INPUT
。並且將 LED 設定為熄滅。loop
setup
後,會不斷地執行 loop
,所以 loop
不斷地讀入按鈕 (SWITCH
) 的狀態 (即第 23 行的 digitalRead(SWITCH)
)。若 digitalRead(SWITCH)
讀到的按鈕狀態為 HIGH
(即按鈕被按下),則將 swState
為 PRESSED
。否則,將 swState
為 RELEASED
。swState
會被設為 PRESSED
。if
條件句成立, prevSWState
會被設定為 swState
的值,也就是 PRESSED
。if
條件不成立。LOW
,所以第 26 行會被執行。 swState
被設定為 RELEASED
。swState
為 RELEASED
,所以第 29 行的 if
條件句不成立,prevSWState
仍維持 PRESSED
。swState
與 prevSWState
分別為 RELEASED
與 PRESSED
,所以第 33 行的 if
條件句成立。
ledState
的值被轉換成 HIGH
。 (第 34 行) 。然後將新的 LED 狀態寫入 LED
(即 pin 6) ,點亮 LED。prevSWState
設為 RELEASED
。 所以下一個迴圈中 (假設按鈕沒有再被按下) ,第 33 行的 if
條件句不成立 (因為 swState
與 prevSwState
皆為 RELEASED
)。進而維持 LED 被點亮的狀態。用上述的程式與電路實驗後發現,有時候會發生 LED 該熄滅的時候沒有熄滅,該點亮的時候沒有點亮。這是因為開關的彈跳現象造成的誤動作。可以用程式解決這個問題。
當 Arduino 偵測到開關被按下時,延遲 20 ms ,忽略掉那段訊號不穩定的時間後,再讀一次開關的狀態。確認開關真的被按下後,在進行狀態切換。
沿用 Lab 4-5 LED 跑馬燈 的電路。