Hier ein Sketch, der bei mir funktioniert.
So ähnlich, wie deine Version (also noch ohne die elegante Variante mit Array aus Structs).
Es sind erst mal nur 3 Tasten. Wenn du mehr brauchst kannst du es ja erweitern.
#include "Keyboard.h"
const byte buttonPin8 = 8; // KEY_LEFT_ARROW
const byte buttonPin9 = 9; // KEY_RIGHT_ARROW
const byte buttonPin10 = 10; // KEY_LEFT_ALT + KEY_LEFT_ARROW
boolean previousButtonState8 = LOW;
boolean previousButtonState9 = LOW;
boolean previousButtonState10 = LOW;
unsigned long lastMillis;
unsigned long waitTime = 40; // Entprellzeit
void setup() {
pinMode(buttonPin8, INPUT_PULLUP);
pinMode(buttonPin9, INPUT_PULLUP);
pinMode(buttonPin10, INPUT_PULLUP);
Keyboard.begin();
}
void loop() {
// Einlesen der Taster
boolean buttonState8 = digitalRead(buttonPin8);
boolean buttonState9 = digitalRead(buttonPin9);
boolean buttonState10 = digitalRead(buttonPin10);
// Auswertung und Ausgabe
if ( (buttonState8 != previousButtonState8) && (millis() - lastMillis > waitTime) ) {
if (buttonState8 == LOW) { // Taste wurde gedrückt
Keyboard.press(KEY_LEFT_ARROW);
lastMillis = millis();
}
else { // Taste wurde losgelassen
Keyboard.release(KEY_LEFT_ARROW);
lastMillis = millis();
}
}
if ( (buttonState9 != previousButtonState9) && (millis() - lastMillis > waitTime) ) {
if (buttonState9 == LOW) {
Keyboard.press(KEY_RIGHT_ARROW);
lastMillis = millis();
}
else {
Keyboard.release(KEY_RIGHT_ARROW);
lastMillis = millis();
}
}
if ( (buttonState10 != previousButtonState10) && (millis() - lastMillis > waitTime) ) {
if (buttonState10 == LOW) {
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_LEFT_ARROW);
lastMillis = millis();
}
else {
Keyboard.release(KEY_LEFT_ALT);
Keyboard.release(KEY_LEFT_ARROW);
lastMillis = millis();
}
}
previousButtonState8 = buttonState8;
previousButtonState9 = buttonState9;
previousButtonState10 = buttonState10;
}
Ein paar Hinweise:
Autowiederholung
- also jene Funktion, die dafür sorgt, dass länger gedrückte Tasten "ständig wiederholt" werden - darum muss man sich nicht extra kümmern, wenn der Leonardo/Micro an einen "normalen" PC angeschlossen wird. Denn der PC kümmert sich schon selbst darum. Das Programm muss sich aber so verhalten, wie ein "normales" Keyboard - das ist beim Beispiel oben der Fall. Allerdings hängt das Verhalten auch ein wenig vom verwendeten Betriebssystem ab (Windows reagiert zum Beispiel etwas anders als ein Mac).
Mehrere Tasten gleichzeitig
Das Beispiel oben funktioniert gut, wenn du niemals mehr als eine Taste gleichzeitig drücken willst. Ich spreche von Tasten(Buttons, Pushbuttons) am Arduino und nicht von "Keyboard-Tasten".
Meistens macht es ja auch relativ wenig Sinn PfeilLinks und PfeilRechts gleichzeitig zu drücken, aber bei bestimmten Programmen sind auch solche "eigenartigen" Tastenkombinationen möglich.
Wenn du im Beispiel oben mehrere Tasten gleichzeitig drückst, wird immer eine Taste "dominant".
Falls du also mehrere Tasten gleichzeitig verwenden willst, muss man das wahrscheinlich anders lösen, falls immer nur eine Taste gedrückt werden soll, dann kann es so funktionieren.