Arduino Когда продолжайте нажимать кнопку, отображается непрерывная буква

Прежде всего извините за мой слабый английский

У меня есть Arduino Leonardo, и у меня есть кнопка, хорошо?

Когда я нажимаю кнопку, буква «W» печатается в блокноте, хорошо?

Я хочу, когда я продолжаю удерживать кнопку, печатается буква «w», почему? как в играх, когда я продолжаю удерживать букву «W», игрок будет двигаться, затем, когда я отпущу палец, игрок остановится. Пожалуйста, пожалуйста, пожалуйста, мне нужна ваша помощь, потому что я новичок

это мой код

#include "Keyboard.h"

const int buttonPin = 4;          // input pin for pushbutton
int previousButtonState = HIGH;   // for checking the state of a pushButton

void setup() {
  // make the pushButton pin an input:
  pinMode(buttonPin, INPUT);
  // initialize control over the keyboard:
  Keyboard.begin();
}

void loop() {
  // read the pushbutton:
  int buttonState = digitalRead(buttonPin);
  // if the button state has changed,
  if ((buttonState != previousButtonState)
      // and it's currently pressed:
      && (buttonState == HIGH)) {
    // type out a message
    Keyboard.print("W");
  }
  // save the current button state for comparison next time:
  previousButtonState = buttonState;
} 

person SirMajed    schedule 04.02.2020    source источник
comment
Также вопрос задан на forum.arduino.cc/index.php?topic=662835.   -  person per1234    schedule 04.02.2020


Ответы (1)


Во-первых, причина, по которой ваш код действует только так, как если бы кнопка была нажата один раз, заключается в следующих строках:

// if the button state has changed,
  if ((buttonState != previousButtonState)
      // and it's currently pressed:
      && (buttonState == HIGH)) {

таким образом, это будет верно только один раз после нажатия кнопки. Если вы удалите предыдущую проверку состояния и проверите только, находится ли кнопка в данный момент на высоком уровне, это будет вызывать нажатие каждый раз, когда ваша программа зацикливается. Однако это будет иметь побочные эффекты, например, короткое нажатие сработает несколько раз.

К счастью, в библиотеке клавиатуры есть еще одна функция для решения этой проблемы: Keyboard.press()

При вызове Keyboard.press() работает так, как если бы на клавиатуре была нажата и удерживалась клавиша. Полезно при использовании клавиш-модификаторов. Чтобы завершить нажатие клавиши, используйте Keyboard.release() или Keyboard.releaseAll(). https://www.arduino.cc/reference/en/language/functions/usb/keyboard/keyboardpress/

Итак, если вы измените свой код следующим образом:

void loop() {
  // read the pushbutton:
  int buttonState = digitalRead(buttonPin);

  // if the button state has changed,
  if (buttonState != previousButtonState){
    if( buttonState == HIGH ) {
      Keyboard.press('w');
    }else{
      Keyboard.release('w');
    }
  }
  // save the current button state for comparison next time:
  previousButtonState = buttonState;
}

это будет действовать точно так же, как если бы кнопка клавиатуры была нажата.

Обратите внимание, что в настоящее время скрипт, скорее всего, будет действовать так, как если бы кнопка нажималась несколько раз за одно нажатие из-за подпрыгивания. Вы можете решить эту проблему, добавив небольшую задержку после нажатия и отпускания кнопки. Это даст кнопке время, чтобы перейти в новое состояние. Подробнее о отказе читайте здесь: https://www.allaboutcircuits.com/textbook/digital/chpt-4/contact-bounce/

person Fitzi    schedule 04.02.2020
comment
Я добавил ваш цикл, но когда я нажимаю кнопку, буква «W» просто продолжает печататься, она не может остановиться, пока я не отключу Arduino. - person SirMajed; 04.02.2020