Почему мои утверждения 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 для встроенного светодиода.

, 👍0

Обсуждение

Измените 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


1 ответ


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