Во-первых, причина, по которой ваш код действует так, как будто кнопка была нажата только один раз, заключается в следующих строках
// 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/