2015-11-03 1 views
0

У меня есть простой набор из 8 кнопок, подключенных к плате Teensy 3.2 (который использует Arduino через плагин Teensyduino). 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

Я обновляю код под «Code Edit 1», насколько мне известно, принципов. Я знаю, что ваша информация отличная, но я думаю, что я неправильно ее испортил или пропустил что-то, что вызывает ошибки объявления? – sylcat

+0

В вашем коде вы 1) пропустили запись заданных интервальных функций 'for (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