Почему моя Arduino не правильно распознает нажатия на аналоговую клавиатуру 3x4?

Как я могу изменить свой код для правильного считывания чисел с клавиатуры 3x4 вместо отображения только 1 или 10 на каждую кнопку? Код работает верно, когда я проверяю считывание значений напрямую с порта.
Изображение к вопросу
Изображение к вопросу
  • 9 декабря 2023 г. 20:26
Ответы на вопрос 2
Существует несколько возможных причин, почему Arduino может неправильно распознавать нажатия на аналоговую клавиатуру 3x4 и отображать только 1 или 10.

1. Неправильное подключение: Убедитесь, что все провода от клавиатуры правильно подключены к пинам ардуино. Проверьте, что каждая кнопка подключена к уникальному пину и общему пину (обычно GND).

2. Неисправность клавиатуры: Проверьте, что клавиатура работает должным образом. Протестируйте каждую кнопку, используя мультиметр или другой метод, чтобы удостовериться, что она создает правильное соединение при нажатии.

3. Неправильные значения порта: Возможно, в вашем коде неправильно заданы значения порта. Проверьте документацию для вашей конкретной клавиатуры или используйте мультиметр, чтобы определить правильные значения при нажатии каждой кнопки.

Для изменения кода для правильного считывания чисел с клавиатуры 3x4 вам нужно правильно связать значения кнопок с числами. Вам нужно знать, какое значение ожидается при нажатии каждой кнопки на клавиатуре. Например, если при нажатии кнопки "1" должно быть возвращено значение 1, вам нужно обновить соответствующую часть кода.

Вот пример кода, который может помочь вам:

```c++
const int ROWS = 4; // количество строк на клавиатуре
const int COLS = 3; // количество столбцов на клавиатуре

char keys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};

byte pin_rows[ROWS] = {9, 8, 7, 6}; // пины подключены к строкам
byte pin_cols[COLS] = {5, 4, 3}; // пины подключены к столбцам

void setup() {
  Serial.begin(9600);

  for (int r = 0; r < ROWS; r++) {
    pinMode(pin_rows[r], INPUT_PULLUP); // установка пинов строк в режим INPUT_PULLUP
  }

  for (int c = 0; c < COLS; c++) {
    pinMode(pin_cols[c], OUTPUT); // установка пинов столбцов в режим OUTPUT
    digitalWrite(pin_cols[c], HIGH); // исключение пинов столбцов из цепи
  }
}

void loop() {
  for (int c = 0; c < COLS; c++) {
    digitalWrite(pin_cols[c], LOW); // подключение пина столбца к земле
    
    for (int r = 0; r < ROWS; r++) {
      if (digitalRead(pin_rows[r]) == LOW) { // кнопка нажата
        Serial.print("Pressed: ");
        Serial.println(keys[r][c]); // вывод значения кнопки
        
        // задержка для подавления дребезга контактов
        delay(200);
      }
    }

    digitalWrite(pin_cols[c], HIGH); // исключение пина столбца из цепи
  }
}
```

В этом коде создается массив с размещением кнопок на клавиатуре, а также массивы для пинов строк и столбцов. При нажатии кнопки выводится соответствующее значение. Этот код может быть изменен для вашей конкретной клавиатуры, используя правильные значения.  Проверьте правильность подключения и сверьте
Имеет место дребезг контактов . 
Перед прочтением значение нужно нормализовать.
И я бы тестером уточнил какое именно напряжение на выходе при нажатии кнопки. Не исключено что там не все так точно как написано на плате.

P.S. Я бы резисторы поменял. Слишком плотно значения расположены.
Плохой контакт, неточный номинал и определение кнопки будет затруднено.
Похожие вопросы