1. 程式人生 > >arduino按鈕感測器常見的幾種消抖方法

arduino按鈕感測器常見的幾種消抖方法

先上電路圖: 

22d100034b78eda98cc0 (81.33 KB, 下載次數: 2)

下載附件

2017-8-3 22:57 上傳

再上arduino程式碼: #define BUTTON 12//定義按鈕在 12號引腳,連線一個下拉電阻 int val = 0;//變數val 儲存按鈕的狀態 int old_val = 0;//暫存val變數的上一個時間狀態 int state = 0;//列印到串列埠的資料,按鈕每被按下一次,state自增1 void setup(){ pinMode(BUTTON, INPUT); Serial.begin(9600);//用於串列埠輸出 } void loop(){ val = digitalRead(BUTTON);//讀取輸入數值並且儲存 if((val==HIGH)&&(old_val==LOW))//檢查按鈕的變化情況 { printState(); } old_val=val;//val現在是舊的了,讓我們暫存一下 } void printState() { state++; Serial.println(state); } 程式碼解析: 實現的效果是,當按鈕被按下並擡起時,向串列埠列印一個整數。這個是完全沒有新增消抖的原始程式碼。 上傳程式碼之後,會出現,明明只按了一下按鈕,串列埠卻會打印出多個整數。 這便是由於按鈕的機械結構所造成的“”抖動”(想了解更詳細請參考百度百科)。 “消抖正式開始” 第一種:採用延時函式delay(軟體消抖) 電路完全一樣,程式碼如下: #define BUTTON 12//定義按鈕在 12號引腳,連線一個下拉電阻 int val = 0;//變數val 儲存按鈕的狀態 int old_val = 0;//暫存val變數的上一個時間狀態 int state = 0;//列印到串列埠的資料,按鈕每被按下一次,state自增1 void setup(){ pinMode(BUTTON, INPUT); Serial.begin(9600);//用於串列埠輸出 } void loop(){ val = digitalRead(BUTTON);//讀取輸入數值並且儲存 if((val==HIGH)&&(old_val==LOW))//檢查按鈕的變化情況 { printState(); delay(20);//只多了這一行 } old_val=val;//val現在是舊的了,讓我們暫存一下 } void printState() { state++; Serial.println(state); } 只添加了一個延時函式,讓程式等待一段時間(這裡是20ms),等按鈕狀態穩定之後,再繼續執行下面的程式碼。 優點:簡單 缺點:延時函式阻塞了程式的執行,不太完美 第二種:使用Bounce2庫(軟體消抖) 庫下載地址:http://playground.arduino.cc/code/bounce 程式碼如下: #include #define BUTTON 12//按鈕連線的針腳 Bounce debouncer = Bounce();//例項化一個抖動物件 int val=0;//變數val儲存按鈕的狀態,因為是下拉電阻,預設是LOW(即0) int old_val=0;//儲存val變數的上一個時間狀態 int state=0;//列印到串列埠的資料,按鈕每被按下一次,state自增1 void setup() { pinMode(BUTTON,INPUT); debouncer.attach(BUTTON);//將抖動物件繫結到按鈕針腳 debouncer.interval(5);//間隔是5ms Serial.begin(9600);//用於串列埠輸出 } void loop() { debouncer.update();//更新 val=debouncer.read();////讀取輸入數值並且儲存 if((val==HIGH)&&(old_val==LOW))//檢查按鈕的變化情況 { printState(); } old_val=val;//val現在是舊的了,暫存一下 } void printState() { state++; Serial.println(state); } 不一樣的地方已經使用紅色文字,該種方法的消抖是最接近於完美的消抖方法。 第三種方法:硬體消抖 程式碼和原始的程式碼一樣(未新增任何消抖程式碼)。 電路圖如下: 

唯一的區別是:新增上了一個陶瓷電容(100nf),和下拉電阻並聯,利用電容的快速充放電特性來過濾掉按鈕的抖動(100nf是測試得來的數值,小夥伴門可以自己嘗試)。 優點:不需要更改程式碼,簡單快捷 缺點:增加額外元件