2015-11-03 78 views
0

我有一個簡單的8個按鈕連接Teensy 3.2板(通過Teensyduino插件使用Arduino)。 8個按鈕位於引腳1-8上,它們的公共地線(焊接在每個引腳上的一條線)位於GND引腳上。我有代碼讓任何一個按鈕的工作。目前設置爲按第二個按鈕類型「A」。通過按鈕進行Arduino擊鍵,如何去抖動,何時使用矩陣?

當您按下按鈕時,我想讓按鈕1到8分別輸出A,B,C ...等。我被告知我的設置存在兩個問題,第一個問題是複製每個按鈕的代碼是一個不好的方法,第二個問題是它遇到了彈跳問題(每5次按一次就會產生一次按鍵)。我還想設置這個,所以在將來我可以編寫一個第三方應用程序,根據用戶的偏好配置密鑰。

添加這些需求我不知道下一步該去哪裏。我是初學者,我不知道如何正確納入反彈班,或者如果這是正確的方式去滿足需求。

是矩陣的去路還是有一種優雅的方式來手動設置每個按鈕並補償反彈?謝謝〜現在的代碼如下:

#define CHECK_EVERY_MS 20 
#define MIN_STABLE_VALS 5 

unsigned long previousMillis; 
char stableVals; 
char buttonPressed; 

void setup() { 
    // make pin 2 an input and turn on the 
    // pullup resistor so it goes high unless 
    // connected to ground: 
    pinMode(2, INPUT_PULLUP); 
    Keyboard.begin(); 
} 

void loop() { 
    if ((millis() - previousMillis) > CHECK_EVERY_MS) 
    { 
     previousMillis += CHECK_EVERY_MS; 
     if (digitalRead(2) != buttonPressed) 
     { 
      stableVals++; 
      if (stableVals >= MIN_STABLE_VALS) 
      { 
       buttonPressed = !buttonPressed; 
       stableVals = 0; 

       if (buttonPressed) 
       { 
        //Send an ASCII 'A', 
        Keyboard.write(65); 
       } 
      } 
     } 
     else 
      stableVals = 0; 
    } 
} 

--------- CODE EDIT 1

#include <Bounce2.h> 

// Instantiate a Bounce object 
Bounce debouncer[8]; 
bool prevValues[8]; 

// Keyboard values for btn 1 2 3 4 5 6 7 8 
char keyboardValues[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'}; 

void setup() { 
// First setup all the pins as input with pullup 
    pinMode(BUTTON_PIN_1,INPUT_PULLUP); 
    pinMode(BUTTON_PIN_2,INPUT_PULLUP); 
    pinMode(BUTTON_PIN_3,INPUT_PULLUP); 
    pinMode(BUTTON_PIN_4,INPUT_PULLUP); 
    pinMode(BUTTON_PIN_5,INPUT_PULLUP); 
    pinMode(BUTTON_PIN_6,INPUT_PULLUP); 
    pinMode(BUTTON_PIN_7,INPUT_PULLUP); 
    pinMode(BUTTON_PIN_8,INPUT_PULLUP); 

// Setup Bounce instance - First attach them to the debouncer 
    debouncer[0].attach(BUTTON_PIN_1); 
    debouncer[1].attach(BUTTON_PIN_2); 
    debouncer[2].attach(BUTTON_PIN_3); 
    debouncer[3].attach(BUTTON_PIN_4); 
    debouncer[4].attach(BUTTON_PIN_5); 
    debouncer[5].attach(BUTTON_PIN_6); 
    debouncer[6].attach(BUTTON_PIN_7); 
    debouncer[7].attach(BUTTON_PIN_8); 

    Keyboard.begin(); 
    // Then set the interval (e.g. 10 ms) 
    unsigned char i; 
    for (i = 0; i < 8; i++) 
     prevValues[i] = 0; 
} 

void loop() { 
    // Update the Bounce instances 
    unsigned char i; 
    for (i = 0; i < 8; i++) 
     debouncer[i].update(); 

    bool debounced_btn_1 = debouncer[0].read(); 
    bool debounced_btn_2 = debouncer[1].read(); 
    bool debounced_btn_3 = debouncer[2].read(); 
    bool debounced_btn_4 = debouncer[3].read(); 
    bool debounced_btn_5 = debouncer[4].read(); 
    bool debounced_btn_6 = debouncer[5].read(); 
    bool debounced_btn_7 = debouncer[6].read(); 
    bool debounced_btn_8 = debouncer[7].read();  


    for (i = 0; i < 8; i++) 
    { 
     bool currVal = debouncer[i].read(); 
     if ((!currVal) && (prevValues[i])) 
     { // If now it is pressed (value = 0) and it wasn't before (prevvalue = 1) 
      Keyboard.write(keyboardValues[i]); 
     } 
    } 

} 

回答

1

正如我已經建議你,這個解決方案工作得很好,如果你有隻使用一個按鈕。如果您需要更多按鈕,則應爲每個按鈕複製此代碼。

另一種方法是直接檢查端口值(一次8位)。我認爲這是表演的最佳解決方案,但它不太可讀。

在我看來,bounce2解決方案是最好的。你只需要

  1. 下載Bounce2庫並正確安裝
  2. 用它在你的草圖。

例如,您可以使用數組來存儲所有保鏢。實施例具有8個引腳:

#include <Bounce2.h> 

// Instantiate a Bounce object 
Bounce debouncer[8]; 

void setup() { 
    // First setup all the pins as input with pullup 
    pinMode(BUTTON_PIN_1,INPUT_PULLUP); 
    pinMode(BUTTON_PIN_2,INPUT_PULLUP); 
    ... 

    // After setting up the button, setup the Bounce instance 
    // First attach them to the debouncer 
    debouncer[0].attach(BUTTON_PIN_1); 
    debouncer[1].attach(BUTTON_PIN_2); 
    ... 

    // Then set the interval (e.g. 10 ms) 
    unsigned char i; 
    for (i = 0; i < 8; i++) 
     debouncer[i].interval(10); 

    // other initializations 
    ... 
} 

void loop() { 
    // Update the Bounce instances 
    unsigned char i; 
    for (i = 0; i < 8; i++) 
     debouncer[i].update(); 

    // From now on you can access the debounced 
    // values directly from the array, for instance 

    bool debounced_btn_1 = debouncer[0].read(); 

    bool debounced_btn_8 = debouncer[7].read(); 

    ... 
} 

在你的情況下,由於要發送一個鍵盤命令,可以存儲所有在一個數組中的值(其可以被修改,當然),然後在需要的時候發送它們;你應該還記得過去的狀態,只是在按鈕按下發送值...

bool prevValues[8]; 

// Keyboard values for btn 1 2 3 4 5 6 7 8 
char keyboardValues[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'}; 

void setup() { 
    // Pins initializations 
    ... 

    for (i = 0; i < 8; i++) 
     prevValues[i] = 0; 
} 

void loop() { 
    // Update the Bounce instances 
    ... 


    for (i = 0; i < 8; i++) 
    { 
     bool currVal = debouncer[i].read(); 
     if ((!currVal) && (prevValues[i])) 
     { // If now it is pressed (value = 0) and it wasn't before (prevvalue = 1) 
      Keyboard.write(keyboardValues[i]); 
     } 
    } 

    ... 
} 
+0

我已經更新在「代碼編輯1」我最大的原理的理解的代碼。我知道你的信息很好,但我認爲我把它弄錯了或錯過了導致聲明錯誤的事情? – sylcat

+0

在您的代碼中,您1)錯過了爲設置(i = 0; i <8; i ++)debouncer [i] .interval(10);'寫入設置的時間間隔函數。 2)八個'bool debounced_btn_1 = debouncer [0] .read();'調用是沒用的(你已經在下一個循環中讀取它們)。 3)你從未將'BUTTON_PIN_1'聲明爲'BUTTON_PIN_8':你的銷子是什麼? – frarugi87

+0

目前我的按鈕位於2到9,公共線位於GND – sylcat