Arduino Когда удерживаешь нажатой кнопку, показывается непрерывное письмо - PullRequest
0 голосов
/ 04 февраля 2020

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

У меня есть Arduino Leonardo, и у меня есть кнопка pu sh ok?

Когда я нажимаю на кнопку буква ' 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;
} 

1 Ответ

0 голосов
/ 04 февраля 2020

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

// 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/

...