Клавиатура, дающая случайный ввод

У меня есть такая клавиатура:

вот еще один более детальный взгляд на нижнюю часть.

По сути, я хочу, чтобы светодиод питал силу нажатия.

это мой код:

int LED = 1;
int inputs[4] {
  6,
  4,
  2,
  0
};
int outputs[4] {
  13,
  12,
  10,
  8
};
void outputAllBut(short int);
int numberInputCheck();
int inputCheck();

void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(outputs[i], OUTPUT);
    pinMode(inputs[i], INPUT_PULLUP);
  }
  pinMode(LED, OUTPUT);
}

void loop() {
  while (true) {
    int x = numberInputCheck();

    if (x == 500) {
      break;
    }

    delay(500);

    for (int i = 0; i < x; i++) {
      digitalWrite(LED, HIGH);
      delay(500);
      digitalWrite(LED, LOW);
      delay(300);
    }
  }
}

int numberInputCheck() {
  while (true) {
    for (int i = 0; i < 4; i++) {
      outputAllBut(i);
      for (int m = 0; m < 4; m++) {
        if (digitalRead(inputs[m]) == LOW) {
          switch (i) {
          case 0:
            if (m == 3) {
              return 500;
            } else {
              return m + 7;
            }
          case 1:
            if (m == 3) {
              return 500;
            } else {
              return m + 4;
            }
          case 2:
            if (m == 3) {
              return 500;
            } else {
              return m + 1;
            }
          case 3:
            return 500;
          }
        }
      }
    }
  }
}

void outputAllBut(short int b) {
  for (int i = 0; i < 4; i++) {
    if (i != b) {
      digitalWrite(outputs[i], HIGH);
    }
  }
}

int inputCheck() {
  for (int i = 0; i < 4; i++) {
    if (digitalRead(inputs[i]) == LOW) {
      return i;
    }
  }
  return 5;
}

для справки: функция numberInputCheck может пойти не так, я хочу, чтобы она дождалась ввода и вернула число, которое я нажал. i — это строки, а m — столбцы. Моя проблема в том, что всякий раз, когда я нажимаю на клавиатуре одну из цифр, светодиод включается случайное количество раз, и, похоже, никакой закономерности нет.

m+1, m+4 & m+7 — это потому, что m — это мои столбцы, поэтому, если я нажимаю 0 и строка равна 0, я добавляю 1, то же самое происходит и со всем остальным. Кто-нибудь может мне помочь?

, 👍0


1 ответ


1

Ваша функция outputAllBut неверна. Он переводит все выходы, кроме указанного, в высокий уровень, но не переводит указанный выход в низкий уровень. В результате, после многократного вызова, вы всегда будете иметь высокий уровень на всех выходах (поскольку у вас больше нигде нет кода, который бы их отключал), так что это просто вопрос времени, какой из них будет считаться «включенным». " при каждом нажатии кнопки.

Примечание: переключение выходов между низким и высоким уровнем для чтения матрицы опасно, поскольку одновременное нажатие нескольких кнопок может вызвать короткое замыкание . Вместо этого вам следует всегда держать их все на низком уровне и контролировать, какой из них активен, устанавливая для него режим вывода, а для остальных — режим ввода.

,

ваш ответ помог ситуации, но я все еще получаю смешанные сигналы. моя кнопка 2 почему-то нажималась только один раз, @ArchyInUse