Почему мои утверждения if действуют так, будто условие всегда истинно?
Вот мой код. Моя проблема в том, что клавиши «нажимаются», хотя на Arduino ничего не переключается.
// UNO-HIDKeyboard-Library — Версия: Последняя
// Эта программа была создана pcs3rd.
// Пожалуйста, не меняйте эту строку.
#include <HIDKeyboard.h>
HIDKeyboard keyboard; // Инициируем клавиатуру
// Закрепление определений и переменных...
int key0 = 2; // Кнопка 0 (не используется, но необязательна)
int key1 = 3; // Кнопка 1
int key2 = 4; // Кнопка 2
int key3 = 5; // Кнопка 3
int key4 = 6; // Кнопка 4
int key5 = 7; // Кнопка 5
int key6 = 8; // Кнопка 6
int key7 = 9; // Кнопка 7
int key8 = 10; // Кнопка 8
int led0 = 13; // Индикатор.
int state0 = 0; // Кнопка 0
int state1 = 0; // Кнопка 1
int state2 = 0; // Кнопка 2
int state3 = 0; // Кнопка 3
int state4 = 0; // Кнопка 4
int state5 = 0; // Кнопка 5
int state6 = 0; // Кнопка 6
int state7 = 0; // Кнопка 7
int state8 = 0; // Кнопка 8
void setup() {
keyboard.begin(); // Запускаем эмуляцию клавиатуры
Serial.begin(9600); // Начинаем последовательный вывод
delay(300); // Подождите, пока вас распознают как ПК.
pinMode(key1, INPUT_PULLUP); // устанавливаем режим вывода
pinMode(key2, INPUT_PULLUP); // устанавливаем режим вывода
pinMode(key3, INPUT_PULLUP); // устанавливаем режим вывода
pinMode(key4, INPUT_PULLUP); // устанавливаем режим вывода
pinMode(key5, INPUT_PULLUP); // устанавливаем режим вывода
pinMode(key6, INPUT_PULLUP); // устанавливаем режим вывода
pinMode(key7, INPUT_PULLUP); // устанавливаем режим вывода
pinMode(key8, INPUT_PULLUP); // устанавливаем режим вывода
pinMode(led0, OUTPUT); // устанавливаем режим вывода
Serial.println("Startup Completed!");
}
void loop() {
// записываем информацию о состоянии в vars
state0 = digitalRead(key0); // Кнопка 0
state1 = digitalRead(key1); // Кнопка 1
state2 = digitalRead(key2); // Кнопка 2
state3 = digitalRead(key3); // Кнопка 3
state4 = digitalRead(key4); // Кнопка 4
state5 = digitalRead(key5); // Кнопка 5
state6 = digitalRead(key6); // Кнопка 6
state7 = digitalRead(key7); // Кнопка 7
state8 = digitalRead(key8); // Кнопка 8
if (state0 == HIGH) { // Кнопка 0
digitalWrite(led0, HIGH);
// клавиатура.pressSpecialKey(0x68); (Вместо 0x68 можно ввести сканкод)
Serial.println("state0");
delay(30);
}
if (state1 == HIGH) { // Кнопка 1
digitalWrite(led0, HIGH);
keyboard.pressSpecialKey(0x68);
Serial.println("state1");
delay(30);
}
if (state2 == HIGH) { // Кнопка 2
digitalWrite(led0, HIGH);
keyboard.pressSpecialKey(0x69);
Serial.println("state2");
delay(30);
}
if (state3 == HIGH) { // Кнопка 3
digitalWrite(led0, HIGH);
keyboard.pressSpecialKey(0x6A);
Serial.println("state3");
delay(30);
}
if (state4 == HIGH) { // Кнопка 4
digitalWrite(led0, HIGH);
keyboard.pressSpecialKey(0x6B);
Serial.println("state4");
delay(30);
}
if (state5 == HIGH) { // Кнопка 5
digitalWrite(led0, HIGH);
keyboard.pressSpecialKey(0x6C);
Serial.println("state5");
delay(30);
}
if (state6 == HIGH) { // Кнопка 6
digitalWrite(led0, HIGH);
keyboard.pressSpecialKey(0x6D);
Serial.println("state6");
delay(30);
}
if (state7 == HIGH) { // Кнопка 7
digitalWrite(led0, HIGH);
keyboard.pressSpecialKey(0x6E);
Serial.println("state7");
delay(30);
}
if (state8 == HIGH) { // Кнопка 8
digitalWrite(led0, HIGH);
keyboard.pressSpecialKey(0x0F);
Serial.println("state8");
delay(30);
}
digitalWrite(led0, LOW);
Serial.println("scan");
delay(30);
}
Тем не менее, несмотря на наличие операторов «if», код все равно выполняется, как показано на моем мониторе:
Запуск завершен!
state0
hstate1
istate2
jstate3
kstate4
lstate5
mstate6
nstate7
state8
scan
state0
hstate1
istate2
jstate3
kstate4
lstate5
mstate6
nstate7
state8
scan
Есть ли какие-либо намеки на то, что может происходить? Я переформатировал код для удобства чтения, но он практически такой же, как и раньше. Кроме того, я не использую контакт 0 или один. Я использую 13 для встроенного светодиода.
@pcs3rd, 👍0
Обсуждение1 ответ
Выводы микроконтроллера имеют тенденцию показывать НИЗКИЙ уровень, когда они оставлены плавающими (но не всегда!). Однако контакт 1 используется для связи с преобразователем USB-UART, и я полагаю, что в состоянии ожидания он установлен на ВЫСОКИЙ уровень. Итак, если вы не нажимаете никаких кнопок, клавиши 2–8 по умолчанию будут находиться в состоянии НИЗКИЙ, а клавиша 1 — в состоянии ВЫСОКИЙ. Следовательно, когда defaultCase = HIGH;
, срабатывает первый if
. Когда defaultCase = LOW;
запускаются все if
, кроме первого. Решение — не используйте цифровой контакт 1 (редактируйте: избегайте контакта 0 и, возможно, также 13).
Изменить: ответ выше относится к исходному коду без включенных подтягивающих резисторов.
Итак, я попытался переместить все свои контакты на 2-9, но все еще тряслось, несмотря на все команды., @pcs3rd
@pcs3rd: ты пробовал это с новой версией кода? Если да, пожалуйста, обратите внимание на недавний комментарий Юрая. Теперь у вас включены подтягивания, и все контакты должны показывать ВЫСОКИЙ уровень, если вы не начнете нажимать кнопки (при условии, что кнопки подключены к земле). Ваши if
ы должны проверять ==LOW
, чтобы работать правильно., @ex-punctis
Ой. тогда, наверное, в этом проблема, @pcs3rd
- Печать string and integer LCD
- Почему мои часы реального времени показывают неверное время с моего ПК?
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Отправьте несколько значений int из Python в Arduino, используя pySerial
- Глобальные переменные занимают много места в динамической памяти.
- (Код ультразвукового датчика: такого файла или каталога нет)
- rfid_default_keys проверить с помощью RC522
- Команда strtok() с Serial связью
Измените
state1 == HIGH
и т. д. наstate1 == 1
. Это решает проблему?, @MichaelT@MichaelT, как я только что обнаружил благодаря последовательному выводу, нет, это ничего не меняет. Но я обнаружил, что код застревает в первом операторе, когда я устанавливаю проверку на ВЫСОКИЙ, но он проходит через все операторы, если я устанавливаю НИЗКИЙ, @pcs3rd
как ты подключил "ключи"? на контакт 5 В? у вас есть подтягивающие резисторы? ты действительно подключил какую-то кнопку к контакту 1? и HID на Уно?, @Juraj
Добро пожаловать в Arduino:SE. Возможно, вам будет полезен этот пост на нашем мета-сайте: [Как задать хороший вопрос для Arduino Stack Exchange](https://arduino.meta.stackexchange.com/questions/2523/how-to-ask-a-good- вопрос для обмена стека Arduino)., @sempaiscuba
Уно умеет хидить, только не одновременно со всем остальным, посмотрите на люфа. и у меня нет подключенных ключей, поэтому ни один код в операторах не должен выполняться @Juraj. Кроме того, вопрос не в коде, а в том, почему код в операторе if выполняется, даже если Контакты gpio не переключены на ., @pcs3rd
после того, как вы отредактировали вопрос, вы все еще ошибаетесь: контакты input_pullup ВЫСОКИЕ, если они не подключены к земле, @Juraj