Leonardo Keyboard Befehl nur einmal senden

Hi all,

ich beschäftige mich seit einiger Zeit mit Arduinos. Ich habe hier einen Leonardo und möchte mit einigen Tastern und Schaltern, Keys an den PC schicken.

Mit Tastern ist das ja kein Problem, klappt auch wunderbar. Aber wie bekomme ich das mit Schaltern hin?

Der Arduino soll nicht die ganze Zeit einen einen Key schicken, sondern nur ein mal.

Z.B.

Schalter 1 High: EINMAL Key "L" Schalter 1 Low: EINMAL Key "L" Schalter 1 High: EINMAL Key "L" usw

hoffe ihr versteht was ich meine :-)

Gruß DombasKitt

Du möchtest eine Ablaufsteuerung bauen!

Also: Du suchst einen endlichen Automaten. Einen einfachen endlichen Automaten.

Behandle die Schalter wie die normalen Tasten, entprelle die mit Bounce2,
sende einen Key bei fell() für die Tasten, bei rose() und fell() für die Schalter.

hier mal mein Code.

Sollte mit Tastern ja funktionieren. Aber wie mache ich das mit Schaltern.

Ich habe jetzt einen 3 Poligen Schalter 1-0-1.

Wie kann ist umsetzten, dass ich den Befehl nur einmal sende?

Bei 0 soll nichts passieren. Bei 1 soll er eine Befehl nur einmal senden.

#include "Keyboard.h"

// set pin numbers for the five buttons:
const int button1 = 2;
const int button2 = 3;
const int button3 = 4;
const int button4 = 5;
const int button5 = 6;

void setup() { // initialize the buttons' inputs:
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(button3, INPUT);
  pinMode(button4, INPUT);
  pinMode(button5, INPUT);

  Serial.begin(9600);
  // initialize mouse control:
  Keyboard.begin();
}

void loop() {
  if (digitalRead(button1) == HIGH) {
    Keyboard.write('a');
  }
  if (digitalRead(button2) == HIGH) {
    Keyboard.write('s');
  }
  if (digitalRead(button3) == HIGH) {
    Keyboard.write('d');
  }
  if (digitalRead(button4) == HIGH) {
    Keyboard.write('f');
  }
  if (digitalRead(button5) == HIGH) {
    Keyboard.write('g');
  }
}

Für einen Schalter baust du noch eine Statusvariable ein, die gesetzt wird, wenn der Schalter verändert wird. Du fragst immer mit ab, ob sich der Schalter verändert hat. Der Beispielcode ist für einen 3-Positionsschalter 1-0-1 auf 2-Pin.

byte statusschalter1=0

void loop() {
  if ((digitalRead(schalter1) == HIGH) && (statusschalter1!=1)) {
    Keyboard.write('a');
    statusschalter1=1;
  }
  if ((digitalRead(schalter2) == HIGH) && (statusschalter1!=2)) {
    Keyboard.write('a');
    statusschalter1=2;
  }
  if ((digitalRead(schalter1) == LOW) && ((digitalRead(schalter2) == LOW)&& (statusschalter1!=0) {
    statusschalter1=0;
  }

WEITERE PROGRAMMSCHRITTE

}

[/quote]

DombasKitt: hier mal mein Code. Sollte mit Tastern ja funktionieren.

Nur mit automatischem sehr schnellen Autorepeat und external pull-down Widerständen (was unnötiger Hardware Aufwand ist).

Aber wahrscheinlich liest du das genauso wenig wie meinen letzen Post.

Viel Erfolg.

@ Theseus

Ah ... besten Dank, jetzt hab ich das verstanden! Wusste nicht wie ich das mit dem Status realisieren kann.

@ Whandall

Habe deinen Beitrag auch gelesen, aber ich konnte im ersten Moment nichts mit anfangen, da mir die Grundstruktur einer solchen abfrage nicht bekannt war.

Wollte natürlich nicht, dass du dich ungelesen fühlst. Auch dir ein Dankeschön, da das entprellen mit Sicherheit meine nächste Frage gewesen wäre ;-)

Dein Autorepeat hat mit Entprellen nichts zu tun, dir fehlt der Test auf den Wechsel des Tastenzustands. So etwas liefert die oben genannte Library (und auch das Entprellen).