Матрица кнопок 2×4 работает только наполовину — видны только 4 кнопки из 8

Собираю кастомные педали+КПП. Педали газа и сцепления на датчиках холла, педаль тормоза на тензадатчике через плату HX77, КПП в виде матрицы кнопок 2х4. Вот в нём то и проблема. Код написал при помощи форумов и ИИ.

В общем проблема следующая, кнопки на КПП не все отображаются в игровом устройстве только 4 из 8.

Вот сам код

#include <HX711.h>
#include <Joystick.h>

// Калибровка датчика HX711 (подберите под свой датчик)
#define calibration_factor -2300
#define DOUT  A2
#define CLK   A1

// Пины педалей
#define throttlePin A0   // Газ
#define clutchPin    A3   // Сцепление


// Пины матрицы кнопок 2?4
const int rowPins[2] = {8, 9};      // Строки (D8, D9)
const int colPins[4] = {10, 11, 12, 13}; // Столбцы (D10, 11, D12, D13)

// Карта клавиш матрицы
byte KEY_MAP[2][4] = {
  {0, 1, 2, 3},  // Первая строка
  {4, 5, 6, 7}   // Вторая строка
};

// Объекты
HX711 scale;
Joystick_ Joystick(
  JOYSTICK_DEFAULT_REPORT_ID,
  JOYSTICK_TYPE_JOYSTICK,
  4,  // Оси: X, Y, Z, Rz
  3,  // Потенциометры: газ, тормоз, сцепление
  false, false, true, false, false, false,  // Оси X, Y, Z, Rx, Ry, Rz
  false, true, true, true, false             // Руль, газ, тормоз, сцепление, дроссель
);

// Переменные для педалей
int throttleValue = 0;
int lastThrottleValue = 270;

int brakeValue = 0;
int lastBrakeValue = 150;

int clutchValue = 0;
int lastClutchValue = 180;

// Матрица состояний кнопок
bool buttonStates[2][4] = {false};

void setup() {
  // Инициализация джойстика
  Joystick.setBrakeRange(0, 2048);
  Joystick.setThrottleRange(0, 1023);
  Joystick.begin();

  // Инициализация Serial (для отладки)
  Serial.begin(38400);

  // Инициализация датчика веса (тормоз)
  scale.begin(DOUT, CLK);
  scale.set_scale(calibration_factor);
  scale.tare();

  // Настройка пинов матрицы кнопок
  for (int i = 0; i < 2; i++) {
    pinMode(rowPins[i], OUTPUT);
  }
  for (int i = 0; i < 4; i++) {
    pinMode(colPins[i], INPUT_PULLUP);
  }
}

void loop() {
  // --- Чтение педалей ---

  // Газ (throttle)
  throttleValue = analogRead(throttlePin);
  if (throttleValue > 666) throttleValue = 670;
  else if (throttleValue < 273) throttleValue = 270;
  if (lastThrottleValue != throttleValue) {
    Joystick.setThrottle(throttleValue);
    lastThrottleValue = throttleValue;
  }

  // Тормоз (brake) — с датчика HX711
  brakeValue = (int)scale.get_units();
  if (brakeValue < 8) brakeValue = 0;  // Фильтрация шумов
  if (lastBrakeValue != brakeValue) {
    Joystick.setBrake(brakeValue);
    lastBrakeValue = brakeValue;
  }

  // Сцепление (clutch)
  clutchValue = analogRead(clutchPin);
  if (clutchValue < 185) clutchValue = 180;
  if (lastClutchValue != clutchValue) {
    Joystick.setZAxis(clutchValue);  // Ось Z = сцепление
    lastClutchValue = clutchValue;
  }

  // --- Сканирование матрицы кнопок 2?4 ---
  for (int row = 0; row < 2; row++) {
    // 1. Выключаем все строки
    for (int r = 0; r < 2; r++) {
      digitalWrite(rowPins[r], HIGH);
    }
    // 2. Активируем текущую строку (LOW)
    digitalWrite(rowPins[row], LOW);
    delayMicroseconds(20);  // Даём сигналу стабилизироваться

    // 3. Читаем столбцы
    for (int col = 0; col < 4; col++) {
      bool isPressed = !digitalRead(colPins[col]);  // Инверсия из-за INPUT_PULLUP

      // Если состояние изменилось — обновляем и отправляем в джойстик
      if (buttonStates[row][col] != isPressed) {
        buttonStates[row][col] = isPressed;

        // Присваиваем ID кнопке (от 0 до 7)
        int buttonId = row * 4 + col;
        Joystick.setButton(buttonId, isPressed);

        // Отладка: вывод в Serial Monitor
        Serial.print("Button ");
        Serial.print(buttonId);
        Serial.print(": ");
        Serial.println(isPressed ? "PRESSED" : "RELEASED");
      }
    }
  }

  delay(10);  // Необязательная задержка для стабильности
}    

Ответы (0 шт):