2016年7月20日 星期三

[Arduino] Debounce 處理按下按鈕瞬間的訊號彈跳行為



程式logic是:
1. 檢查輸入是否有變化
2. 若輸入有變化,檢查是否離上次有變化的時間有一定的間隔(debounceDelay)
3. 若有一定的間隔,將當下的時間點latch住(lastDebounceTime),並檢查是否由High 變為Low
4. 若由High變為Low,則為按下按鈕的事件發生

void loop() {

  input_pin12 = digitalRead(12);

  if(digitalRead(12)==input_reg_pin12){ //1. 檢查輸入是否有變化
           //do nothing
  }else{
 
        if((millis()-lastDebounceTime)>debounceDelay){
        //2. 檢查是否離上次有變化的時間有一定的間隔
                  lastDebounceTime = millis();     //3-1 將當下的時間點latch住
                  if(input_reg_pin12==HIGH){    //3-2 檢查是否由High 變為Low
                             Serial.println("pin 12 triggered");    
                  }  
         }
         input_reg_pin12 = input_pin12;
  }//end of loop

reference:
https://www.arduino.cc/en/Tutorial/Debounce