Arduino Pro Micro не распознает INPUT или INPUT_PULLUP
Я пытался создать блок контроллера с несколькими кнопками
. К сожалению, когда я попытался подключить кнопки, Arduino Pro Micro
не распознал их нажатие. Я даже пытался подключить провод напрямую (и напрямую резистор от GND к портам) от GND к портам, но это, похоже, не имеет значения.
OUTPUT работает
на тех же портах, а INPUT/INPUT_PULLUP
— нет.
Что-то не так с кодом?
Мой Arduino Pro Micro
— китайская подделка. Клавиатура и мышь работают, ВЫХОД работает. Кажется, это не работает с вводом.
PS: Раньше я работал с Arduino UNO (а также с семейством ESP (ESP8266, ESP32)).
PS2: Иногда, если я прикоснусь к задней стороне микроконтроллера, некоторые значения зарегистрируются (как будто я нажал все кнопки одновременно)
#define LED_PIN 4
#define BUTTON_1 10
#define BUTTON_2 16
#define BUTTON_3 14
#define BUTTON_4 9
byte ledState = LOW;
void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_1, INPUT_PULLUP);
pinMode(BUTTON_2, INPUT_PULLUP);
pinMode(BUTTON_3, INPUT_PULLUP);
pinMode(BUTTON_4, INPUT_PULLUP);
}
void loop() {
byte one = digitalRead(BUTTON_1);
byte two = digitalRead(BUTTON_2);
byte three = digitalRead(BUTTON_3);
byte four = digitalRead(BUTTON_4);
if (one == HIGH) {
Serial.println("BUTTON_1");
}
if (two == HIGH) {
Serial.println("BUTTON_2");
}
if (three == HIGH) {
Serial.println("BUTTON_3");
}
if (four == HIGH) {
Serial.println("BUTTON_4");
}
digitalWrite(LED_PIN, ledState);
ledState = !ledState;
delay(1000);
}
Изменить: исправил код
Упоминание: я подключил кнопки следующим образом (я должен упомянуть об этом, потому что у Arduino Pro Micro нет отдельного контакта 3 В/5 В, у него есть только выход RAW, который, насколько я понимаю, может поджарить плату) < /п>
Урок, из которого я вдохновился проводкой кнопок: https://arduinogetstarted.com/tutorials/arduino-button
@szilard1996, 👍-1
Обсуждение2 ответа
При подключении INPUT_PULLUP кнопки будут выглядеть ВЫСОКИМ, поэтому в вашем коде вам нужно проверить, находятся ли они в НИЗКОМ состоянии, что и будет делать заземление кнопки.
Да, это тоже была проблема. Ранее я пробовал установить контакты на ВЫСОКИЙ/НИЗКИЙ, но это сработало только при первом нажатии кнопки, после этого все работало, как и раньше (не удалось правильно прочитать состояние кнопки). Улучшением кода также может быть добавление проверки предыдущего состояния., @szilard1996
Посмотрев множество руководств и опробовав множество подходов с разными Arduinos (Uno, потому что его легче создавать прототипы) (и сделав небольшой перерыв, чтобы попробовать еще раз с нуля с новым мышлением), я заставил это работать.
>Раньше я мог это сделать, потому что использовал микроконтроллеры, которые также имели выход 3/5 В (например, Uno, Mega, Nano, STM32, ESP8266, ESP32), поэтому я мог выполнить схему повышения/понижения, но поскольку у Arduino Micro нет таких контактов (на выходе у него только RAW, что может поджарить плату, если она имеет внешнее питание), мне пришлось использовать этот метод, в котором я использую только контакт GND и цифровой вход без каких-либо подключенных резисторов. на кнопку.
Спасибо за ответы и предложения!
Новый код (без светодиодной функциональности):
#include "Keyboard.h"
// определение номеров контактов кнопок
// TODO: переименовать переменные в соответствии с функциональностью
#define BUTTON_10 10
#define BUTTON_16 16
#define BUTTON_14 14
#define BUTTON_9 9
// даем им первое состояние HIGH
int previousButtonState10 = HIGH;
int previousButtonState16 = HIGH;
int previousButtonState14 = HIGH;
int previousButtonState9 = HIGH;
void setup() {
// инициализация кнопок как INPUTS с помощью PULLUP (внутренний подтягивающий резистор от Arduino)
pinMode(BUTTON_10, INPUT_PULLUP);
pinMode(BUTTON_16, INPUT_PULLUP);
pinMode(BUTTON_14, INPUT_PULLUP);
pinMode(BUTTON_9, INPUT_PULLUP);
// только для теста
// TODO: переместите это только в ту функцию, которая понадобится, когда будет добавлено больше функций
Keyboard.begin();
}
void loop() {
// проверяем, была ли нажата какая-либо из кнопок и сохраняем состояние в переменной
previousButtonState10 = checkButton(BUTTON_10, previousButtonState10);
previousButtonState16 = checkButton(BUTTON_16, previousButtonState16);
previousButtonState14 = checkButton(BUTTON_14, previousButtonState14);
previousButtonState9 = checkButton(BUTTON_9, previousButtonState9);
}
// функция: считывает состояние кнопки и сравнивает его с предыдущим состоянием, чтобы узнать, была она нажата или нет
// параметры: buttonPin => номер контакта кнопки; previousButtonState => состояние, соответствующее каждой кнопке
// return: возвращает красное состояние, поэтому его можно сохранить как previousState в соответствующем параметре
int checkButton(int buttonPin, int previousButtonState) {
int buttonState = digitalRead(buttonPin);
if (buttonState == LOW && previousButtonState == HIGH) {
Keyboard.println(buttonPin);
// некоторое минимальное устранение дребезга
// TODO: будут проблемы при использовании millis() в будущем
delay(50);
}
if (buttonState == HIGH && previousButtonState == LOW) {
// не требуется, но некоторые функции могут быть добавлены в будущем
// Keyboard.println("выпуск");
delay(50);
}
return buttonState;
}
Теперь я могу продолжить работу над улучшением и расширением кода, чтобы сделать "Макродоску" проект с движением мыши (а еще мне нужно припаять к плате кнопки и светодиоды :P )
- Нажать клавишу Windows, используя «keyboard.press();»
- Отправка мультимедийных клавиш клавиатуры с помощью библиотеки клавиатур
- Распиновка аналога Arduino Pro Micro
- Keyboard.h: Нет такого файла или каталога - Arduino pro micro (leonardo)
- Нужен ли подтягивающий/понижающий резистор для цепи светодиода кнопки?
- Библиотека джойстиков Arduino не распознается играми (Steam)
- Как добавить потенциометр и дополнительные кнопки к пользовательскому игровому контроллеру?
- Arduino Leonardo/Pro Micro сон и USB
попробуйте
byte one = digitalRead(BUTTON_1);
, @jsotolaИли ближе к той форме, которая у вас есть:
digitalRead(BUTTON_1) == HIGH;
хотя форма, которую предлагает jsotola, лучше. У вас опечатка, если только вы еще не знали, что это неправильно, и вам нужно объяснение, почему расположение)
имеет значение., @timemageКак уже упоминалось, действительно важно, где вы ставите круглые скобки. Поскольку ни один из контактов вашей кнопки не является контактом 1, сравнение их с HIGH (== 1) всегда приводит к 0, и именно этот 0 использовался для всех цифровых операций чтения., @KIIV
Извините... Тем временем я изменил код (после публикации я заметил, что не скопировал хороший код... похоже, это так, потому что
if
выглядели следующим образом, но Вместо этого я начал использовать переменные:if(digitalRead(BUTTON_1) == HIGH)
, чтобы исключить проблемы компилятора (а когда я удалил скобки, я удалил неправильные) => Я тем временем исправил код, но все же это не работает), @szilard1996С вашей последней схемой/кодом (а) при нажатии кнопки будут НИЗКИМ, а не ВЫСОКИМ (б) ваша схема показывает подключение кнопки к контакту 7, но в вашем коде нет записи для контакта 7 и (в) задержка 1 Вторая секунда в цикле означает, что вам, возможно, придется удерживать кнопку до 1 секунды, чтобы увидеть ответ. Если прикосновение к контактам на плате имеет тот же эффект, что и нажатие кнопки, то кнопки находятся в плавающем состоянии, что указывает на неправильное подключение., @6v6gt
Сбивает с толку показывать Uno, когда в тексте вы говорите, что у вас Pro Micro, а затем еще и помечаете вопрос Леонардо., @Nick Gammon
@6v6gt Конечно, изображение предназначено для UNO, потому что оно из руководства (концепция подключения и код должны быть схожими, в фоновом режиме Arduino IDE должна использовать компилятор/правильную библиотеку, когда я выбираю плату). Упоминание: изображение НЕ мое, я использую только ту же технику подключения, что и на картинке., @szilard1996
@NickGammon Я использую Arduino Micro Pro (маленькую версию Leonardo, поэтому я отметил также Leonardo в вопросе)., @szilard1996
ХОРОШО. Понятно, что вы использовали картинку из урока, а не свой реальный макет. Одна из классических ошибок с этими тактильными кнопками — их поворот на 90 градусов, в результате чего создается впечатление, что они постоянно находятся во включенном состоянии. У вас все еще наблюдается явление, когда вы прикасаетесь к доске сзади к контактам, имитируя нажатие кнопок?, @6v6gt