我們用開關控制燈的亮滅的時候,希望只需要按一下按鍵就可以做到燈一直亮著。而在《arduino魔法書》中——有彈性的按鍵這一節主要講了消除抖動函式,但是沒有講這個程式的原理。
書中的**如下
constint led = 9
;const
int button = 2
;boolean lastbutton =low;
boolean currentbutton =low;
boolean ledon = false
;void
setup()
boolean debounce(boolean last)
return
current;
}void
loop()
lastbutton =currentbutton;
digitalwrite(led,ledon);
//put your main code here, to run repeatedly:
}
首先,我們假設沒有抖動,只關注 loop()函式的部分,
currentbutton = debounce(lastbutton);
這時等價於
current = digitalread(button);
首先需要想的是:
當按下的時候,燈能夠一直亮著。
如果使用digitalread來讀當前的值,當按完以後,燈就會熄滅。所以,利用乙個條件語句:條件是:按下按鍵,動作(或者結果)是燈持續亮。
用**表示如下
所以必須更改原來的條件和動作。先考慮動作,不妨把燈亮變成乙個狀態量,而不是臨時讀取的量,這裡定義為 ledon.
那麼接下來需要想的是如何更改 ledon 這個值呢?那就是通過按鍵的狀態變化來考慮了。另外,我們也想要燈亮時再次按下按鍵的時候,能夠熄滅燈。所以可以用到乙個反轉語句:
ledon = !ledon;
接下來就是條件的問題了:無論你是想持續點亮燈還是熄滅燈,這時候按鍵的狀態總是 high,而之前的狀態總是 low.
所以你可以用以下語句決定是否執行反轉語句:
if(lastbutton = low&& currentbutton = high);
來進行判斷。
然後之下的語句:lastbutton = currentbutton,此時,lastbutton 的值變為 high,然後重新返回 loop()函式的第一行,進入debounce()函式,此時,你已經不再按鍵了,所以返回的 currentbutton 的值為low,然後已經返回值後執行下一條語句,也就是if()的條件語句,因為lastbutton = high ,currentbutton = low ,所以不滿足條件,直接執行 lastbutton = currentbutton,這時,lastbutton 和 currentbutton 的值都為 low。
下一次你再進行按鍵的時候,就會反轉 ledon的數值,ledon熄滅。
之所以要消除抖動,是因為如果不消除抖動,currentbutton 的值是不確定的,所以會導致結果的無法**,不能人為地掌控。
如何消除抖動呢,書中寫道5ms之後,抖動一般都會消失,所以 delay(5); 之後再次讀取數值。
但是需要時時刻刻讀取嗎?不需要,所以可以加乙個條件語句。
也就是 if (last! = current)
如果沒必要進行5ms的等待了再次讀取,那麼程式變成這樣:
boolean debounce(boolean last)
此時如果last = current ,返回值都是沒有消除抖動的,所以消除抖動需要有乙個 if 也需要延時delay.
那麼,如果沒有if 語句呢?我認為是可行的。經過實驗我認為只要延長時間,讀兩次數即可。
之所以會存在抖動,我認識是抖動的時間遠遠地長於程式執行一條語句的時間,此時需要延時再進行讀數。
外部中斷控制LED燈開關
在51微控制器中,有2路外部中斷輸入int0 p3.2 和int1 p3.3 2路中斷觸發訊號 低電平觸發和下降沿觸發。中斷允許暫存器ie 0 禁止中斷 1 使能中斷 tf1 定時 計數器t1溢位中斷請求標誌位 0 無中斷請求 1 有中斷請求 tr1 定時 計數器t1啟動位 0 停止 定時 計數器 ...
python控制燈開關 通過樹莓派控制電燈開關
需要的材料 1.杜邦線 2.繼電器 3.電燈 4.銅線若干 gpio說明 繼電器說明 輸入部分 vcc 接5v電源正極 按繼電器電壓供電 gnd 接5v電源負極 in 繼電器模組訊號觸發端 低電平觸發有效 高電平與低電平含義 高電平觸發指的是用vcc端的正極電壓與觸發端連線的一種觸發方式,當觸發端有...
Arduino藍芽控制三色燈
最近開始研究arduino,網上關於arduino的材料,特別是中文的,不是很多。所以想要把自己實現的每一步都給記錄一下。以後如果忘了,可以再看看。看到網上有不少人實現用藍芽控制小燈,所以自己也動手小geek一下。藍芽模組用的是 買的,40塊錢乙個,雖說也有貴的,但是便宜的感覺功能上差不多。這裡用到...