我有一個簡單的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」我最大的原理的理解的代碼。我知道你的信息很好,但我認爲我把它弄錯了或錯過了導致聲明錯誤的事情? – sylcat
在您的代碼中,您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
目前我的按鈕位於2到9,公共線位於GND – sylcat