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

, 👍-1

Обсуждение

попробуйте 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


2 ответа


1

При подключении INPUT_PULLUP кнопки будут выглядеть ВЫСОКИМ, поэтому в вашем коде вам нужно проверить, находятся ли они в НИЗКОМ состоянии, что и будет делать заземление кнопки.

,

Да, это тоже была проблема. Ранее я пробовал установить контакты на ВЫСОКИЙ/НИЗКИЙ, но это сработало только при первом нажатии кнопки, после этого все работало, как и раньше (не удалось правильно прочитать состояние кнопки). Улучшением кода также может быть добавление проверки предыдущего состояния., @szilard1996


0

Посмотрев множество руководств и опробовав множество подходов с разными 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 )

,