Клавиатура, дающая случайный ввод
У меня есть такая клавиатура:
вот еще один более детальный взгляд на нижнюю часть.
По сути, я хочу, чтобы светодиод питал силу нажатия.
это мой код:
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, то же самое происходит и со всем остальным. Кто-нибудь может мне помочь?
@ArchyInUse, 👍0
1 ответ
Ваша функция outputAllBut
неверна. Он переводит все выходы, кроме указанного, в высокий уровень, но не переводит указанный выход в низкий уровень. В результате, после многократного вызова, вы всегда будете иметь высокий уровень на всех выходах (поскольку у вас больше нигде нет кода, который бы их отключал), так что это просто вопрос времени, какой из них будет считаться «включенным». " при каждом нажатии кнопки.
Примечание: переключение выходов между низким и высоким уровнем для чтения матрицы опасно, поскольку одновременное нажатие нескольких кнопок может вызвать короткое замыкание . Вместо этого вам следует всегда держать их все на низком уровне и контролировать, какой из них активен, устанавливая для него режим вывода, а для остальных — режим ввода.
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
ваш ответ помог ситуации, но я все еще получаю смешанные сигналы. моя кнопка 2 почему-то нажималась только один раз, @ArchyInUse