Arduino FSX

Hallo,

habe so eben eine Drucktaster an meine Arduino angeschlossen und es so Programmier, dass wenn ich die Drucktaster betätige eine Tastatur befehl ausgibt.
Das Problem an der Geschichte ist, Arduino soll eine einziges mal den Tastatur befehl ausgeben auch wenn ich die Drucktaster permanent gedrückt halte.
z.B.
Drucktaster gedrückt = Tastatur Befehl "A", egal wie lang ich die Drucktaster gedrückt halte, es soll nur ein einziges mal den Befehl "A" ausgeben.
Drucktaster loslassen = keine Funktion.

Vielen dank im voraus.

#include <Keyboard.h>

void setup() {
 pinMode(2, INPUT_PULLUP);
 Keyboard.begin();
}

void loop() {
 if(digitalRead(2)==LOW){
   Keyboard.write(0x41);
 }
}

tarkankantur:
Drucktaster gedrückt = Tastatur Befehl "A", egal wie lang ich die Drucktaster gedrückt halte, es soll nur ein einziges mal den Befehl "A" ausgeben.

Du könntest das erreichen, indem Du nach dem Ausgeben von 'A' eine Schleife einfügst, die durchlaufen wird, solange der Taster gedrückt ist (bzw. bleibt). Also ungefähr

while(digitalRead(tasterpin)==0) { delay(10); }

Nachteil dieser Schleife ist, dass der Arduino sonst nichts tun kann. Vorteil ist, dass es sehr einfach ist und funktioniert.

Gruß

Gregor

PS: Wie bist Du auf den Betreff gekommen? Was ist FSX?

Du kannst auch nur beim Flankenwechsel von High nach Low nur einmal den Befehl ausgeben.

#define InputPin 2

boolean LastStatePIN2=HIGH;
boolean StatePin2=HIGH;


void setup() {
  pinMode(InputPin, INPUT_PULLUP);
  Keyboard.begin();
}

void loop() {
StatePin2=digitalRead(InputPin);
  if(StatePin2==LOW && LastStatePin2==HIGH){
    Keyboard.write(0x41);
  LastStatePin2=LOW;
  }
 else{ 
 LastStatePin2=HIGH;
 }
}

Damit führst du den Befehl nur einmal aus.
Gruß
DerDani

Hallo,
oder Du fragst den Taster logisch ab.

static boolean MacheEtwasEinmal = true;

if (Bedingung() == Wert)
{
 if(MacheEtwasEinmal)
 {
  // hier wird etwas einmal gemacht
  MacheEtwasEinmal = false;
 }
} 
else
{
  MacheEtwasEinmal = true;
}

oder Du machst es über einen Zähler

int Zähler;

if ((Taster gedrückt) &&  (Zähler == 0))
{
 gebe ein A aus
Zähler++;
 {

Gruß und Spaß
Andreas

gregorss:
Du könntest das erreichen, indem Du nach dem Ausgeben von 'A' eine Schleife einfügst, die durchlaufen wird, solange der Taster gedrückt ist (bzw. bleibt). Also ungefähr

while(digitalRead(tasterpin)==0) { delay(10); }

Nachteil dieser Schleife ist, dass der Arduino sonst nichts tun kann. Vorteil ist, dass es sehr einfach ist und funktioniert.

Gruß

Gregor

PS: Wie bist Du auf den Betreff gekommen? Was ist FSX?

Vielen vielen dank, lieber Gregor. FSX ist die Kürzel von Flug Simulator X von Microsoft.
Ich versuche gerade mit Hilfe von Arduino Schalter zu basteln mit deren Hilfe ich im Spiel, Lichter von Flugzeug an und aus schalten kann und Fahrwerk ein und aus fahren.

Hallo liebe Leute,

Jedem, der mir mit tatkräftiger Unterstützung und Hilfe zur Seite stand, möchte ich hiermit meine größten Dankes wünsche aussprechen.

Die Hilfe war flott und vor allem sehr informativ.

Ein weiteres mal Danke und viel glück beim Programmieren weiterhin !

Das Erste, was auf meiner to do Liste steht ist das Auspacken meines Arduinos, um mit euren Infos mein gewünschtes Programm anzufertigen.

Gruß

Tarkan

volvodani:
Du kannst auch nur beim Flankenwechsel von High nach Low nur einmal den Befehl ausgeben.

#define InputPin 2

boolean LastStatePIN2=HIGH;
boolean StatePin2=HIGH;

void setup() {
  pinMode(InputPin, INPUT_PULLUP);
  Keyboard.begin();
}

void loop() {
StatePin2=digitalRead(InputPin);
  if(StatePin2==LOW && LastStatePin2==HIGH){
    Keyboard.write(0x41);
  LastStatePin2=LOW;
  }
else{
LastStatePin2=HIGH;
}
}




Damit führst du den Befehl nur einmal aus.
Gruß
DerDani

Leider kommt hier eine Fehlermeldung (LastState2 was not declared in this scope. :frowning:

tarkankantur:
Leider kommt hier eine Fehlermeldung (LastState2 was not declared in this scope. :frowning:

Groß- und Kleinschreibung wird unterschieden:

boolean LastStatePin2=HIGH;

agmue:
Groß- und Kleinschreibung wird unterschieden:

boolean LastStatePin2=HIGH;

agmue, vielen dank für die Aufmerksamkeit.

volvodani:
Du kannst auch nur beim Flankenwechsel von High nach Low nur einmal den Befehl ausgeben.

#define InputPin 2

boolean LastStatePIN2=HIGH;
boolean StatePin2=HIGH;

void setup() {
 pinMode(InputPin, INPUT_PULLUP);
 Keyboard.begin();
}

void loop() {
StatePin2=digitalRead(InputPin);
 if(StatePin2==LOW && LastStatePin2==HIGH){
   Keyboard.write(0x41);
 LastStatePin2=LOW;
 }
else{
LastStatePin2=HIGH;
}
}




Damit führst du den Befehl nur einmal aus.
Gruß
DerDani

volvodani, danke für deine Hilfe. Leider führt der Befehl bei mir min. 50mal den Befehl aus beim Tastendruck. Trotz dem Vielen Dank. Gruß Tarkan

Ergänze um eine kleine Pause; so unterdrückst Du das Tasterprellen.

if(StatePin2==LOW && LastStatePin2==HIGH){
    Keyboard.write(0x41);
  LastStatePin2=LOW;
delay(50);
  }

Grüße Uwe

Oder Du verwendest die Bibliothek Bounce2 und dort das Beispiel change.ino.

Huraaa Ich habs,

Voraussetzung man besitzt, Arduino micro, Due oder Leonardo.

#include <Keyboard.h>

void setup() {
pinMode(2, INPUT_PULLUP);
Keyboard.begin();
}

void loop() {
if(digitalRead(2)==LOW){
  Keyboard.write(0x41);
  while(digitalRead(2)==0) { delay(100); }
}
}

Alles andere habe ich nicht hinbekommen. Ich bedanke mich noch mal recht herzlich bei allen Member.

Meine nächste frage wehre, wie kann ich diesen Programm erweitern.
Möchte weitere Pins mit Keyboard.write belegen.
z.B. Pin 3 mit "B", Pin 4 mit C, Pin 5 mit D u.s.w.

Grüße Tarkan.

Deine Lösung gefällt mir nicht. Du blockierst den Sketch in der while-Schleife solange der Taster gedrückt ist und so kannst Du keine anderen Tasten kontrollieren.

Grüße Uwe

uwefed:
Deine Lösung gefällt mir nicht.

Allerdings finde ich sie sehr kreativ. Laß es mich mal eine schöne Sackgasse nennen.

tarkankantur:
Voraussetzung man besitzt, Arduino micro, Due oder Leonardo.
...
Alles andere habe ich nicht hinbekommen.

Ein nicht ganz so blockierender Ansatz (habe nur einen UNO):

//#include <Keyboard.h>

boolean LastStatePIN2, AktStatePin2;

void setup() {
  pinMode(2, INPUT_PULLUP);
  //Keyboard.begin();
  Serial.begin(9600);
  AktStatePin2 = digitalRead(2);
  LastStatePIN2 = AktStatePin2;
}

void loop() {
  LastStatePIN2 = AktStatePin2;
  AktStatePin2 = digitalRead(2);
  if (LastStatePIN2 && !AktStatePin2) {
    //Keyboard.write(0x41);
    Serial.print ("Taste gedrueckt: ");
    Serial.println(char(0x41));
    delay(50);
  }
  if (!LastStatePIN2 && AktStatePin2) {
    Serial.print ("Taste losgelassen: ");
    Serial.println(char(0x41));
    delay(50);
  }
}

tarkankantur:
Möchte weitere Pins mit Keyboard.write belegen.
z.B. Pin 3 mit "B", Pin 4 mit C, Pin 5 mit D u.s.w.

Dazu nutzt man beispielsweise Felder mit Index:

//#include <Keyboard.h>
#define PINZAHL 3
const byte pin[PINZAHL] = {2, 3, 4};
const char zeichen[PINZAHL] = {'A', 'B', 'C'};
boolean LastStatePin[PINZAHL], AktStatePin[PINZAHL];
byte pinIndex;

void setup() {
  //Keyboard.begin();
  Serial.begin(9600);
  Serial.println("Programmanfang");
  for (pinIndex = 0; pinIndex < PINZAHL; pinIndex++) {
    pinMode(pin[pinIndex], INPUT_PULLUP);
    AktStatePin[pinIndex] = digitalRead(pin[pinIndex]);
    LastStatePin[pinIndex] = AktStatePin[pinIndex];
  }
}

void loop() {
  LastStatePin[pinIndex] = AktStatePin[pinIndex];
  AktStatePin[pinIndex] = digitalRead(pin[pinIndex]);
  if (LastStatePin[pinIndex] && !AktStatePin[pinIndex]) {
    //Keyboard.write(0x41);
    Serial.print ("Taste gedrueckt: ");
    Serial.println(zeichen[pinIndex]);
    delay(50);
  }
  if (!LastStatePin[pinIndex] && AktStatePin[pinIndex]) {
    Serial.print ("Taste losgelassen: ");
    Serial.println(zeichen[pinIndex]);
    delay(50);
  }
  pinIndex++;
  pinIndex = pinIndex % PINZAHL;
}

Bei drei Tastern lohnt das noch nicht so richtig, aber bei mehr macht es dann Sinn.

Hallo,
wenn man bei Deinem, uns nicht gefallenden- Beispiel bleibt, dann ist doch
alles vorgegeben.

Du hast hier "pinMode(2, INPUT_PULLUP);" für einen Buchstaben festgelegt.
Wenn Du jetzt einen weiteren Buchstaben bedienen möchtest, dann brauchst
Du einen weiteren Pin. Das könnte dann so aussehen:
"pinMode(7, INPUT_PULLUP);"

Nun brauchst Du also noch eine zweite Abfrage, die der ersten gleichen könnte.
Wenn DU nur ein wenig nachdenken würdest, dann hättest Du mit:
if(digitalRead(5)==LOW){
Keyboard.write(0x44);
while(digitalRead(5)==0) { delay(210); }}
eine passende Lösung gefunden.
Du hast hier jetzt eine Lösung für einen zweiten Buchstaben- es ist von mir
beabsichtigt, das es mit C&P nicht so einfach läuft.

Wir werden hier nicht Deinen Skecht Stück für Stück erweitern, das was Du
möchtest, ist billigstes Basic-Wissen, das DU Dir aneignen solltest.

Die anderen, besseren, Dir vorgeschlagenen Beispiele- laufen alle stumpf durch.

Wenn Du keines von denen zum laufen bekommst, dann hast Du bestimmt KEIN
"wie nutze ich einen Drucktaster" Problem.
Gruß und Spaß
Andreas

SkobyMobil:
Hallo,
wenn man bei Deinem, uns nicht gefallenden- Beispiel bleibt, dann ist doch
alles vorgegeben.

Du hast hier "pinMode(2, INPUT_PULLUP);" für einen Buchstaben festgelegt.
Wenn Du jetzt einen weiteren Buchstaben bedienen möchtest, dann brauchst
Du einen weiteren Pin. Das könnte dann so aussehen:
"pinMode(7, INPUT_PULLUP);"

Nun brauchst Du also noch eine zweite Abfrage, die der ersten gleichen könnte.
Wenn DU nur ein wenig nachdenken würdest, dann hättest Du mit:
if(digitalRead(5)==LOW){
Keyboard.write(0x44);
while(digitalRead(5)==0) { delay(210); }}
eine passende Lösung gefunden.
Du hast hier jetzt eine Lösung für einen zweiten Buchstaben- es ist von mir
beabsichtigt, das es mit C&P nicht so einfach läuft.

Wir werden hier nicht Deinen Skecht Stück für Stück erweitern, das was Du
möchtest, ist billigstes Basic-Wissen, das DU Dir aneignen solltest.

Die anderen, besseren, Dir vorgeschlagenen Beispiele- laufen alle stumpf durch.

Wenn Du keines von denen zum laufen bekommst, dann hast Du bestimmt KEIN
"wie nutze ich einen Drucktaster" Problem.
Gruß und Spaß
Andreas

besten dank, Andreas.
werde mich in Zukunft mehr mit Arduino beschäftigen.
Gruß Tarkan.

agmue:
Allerdings finde ich sie sehr kreativ. Laß es mich mal eine schöne Sackgasse nennen.Ein nicht ganz so blockierender Ansatz (habe nur einen UNO):

//#include <Keyboard.h>

boolean LastStatePIN2, AktStatePin2;

void setup() {
  pinMode(2, INPUT_PULLUP);
  //Keyboard.begin();
  Serial.begin(9600);
  AktStatePin2 = digitalRead(2);
  LastStatePIN2 = AktStatePin2;
}

void loop() {
  LastStatePIN2 = AktStatePin2;
  AktStatePin2 = digitalRead(2);
  if (LastStatePIN2 && !AktStatePin2) {
    //Keyboard.write(0x41);
    Serial.print ("Taste gedrueckt: ");
    Serial.println(char(0x41));
    delay(50);
  }
  if (!LastStatePIN2 && AktStatePin2) {
    Serial.print ("Taste losgelassen: ");
    Serial.println(char(0x41));
    delay(50);
  }
}


Dazu nutzt man beispielsweise Felder mit Index:


//#include <Keyboard.h>
#define PINZAHL 3
const byte pin[PINZAHL] = {2, 3, 4};
const char zeichen[PINZAHL] = {'A', 'B', 'C'};
boolean LastStatePin[PINZAHL], AktStatePin[PINZAHL];
byte pinIndex;

void setup() {
  //Keyboard.begin();
  Serial.begin(9600);
  Serial.println("Programmanfang");
  for (pinIndex = 0; pinIndex < PINZAHL; pinIndex++) {
    pinMode(pin[pinIndex], INPUT_PULLUP);
    AktStatePin[pinIndex] = digitalRead(pin[pinIndex]);
    LastStatePin[pinIndex] = AktStatePin[pinIndex];
  }
}

void loop() {
  LastStatePin[pinIndex] = AktStatePin[pinIndex];
  AktStatePin[pinIndex] = digitalRead(pin[pinIndex]);
  if (LastStatePin[pinIndex] && !AktStatePin[pinIndex]) {
    //Keyboard.write(0x41);
    Serial.print ("Taste gedrueckt: ");
    Serial.println(zeichen[pinIndex]);
    delay(50);
  }
  if (!LastStatePin[pinIndex] && AktStatePin[pinIndex]) {
    Serial.print ("Taste losgelassen: ");
    Serial.println(zeichen[pinIndex]);
    delay(50);
  }
  pinIndex++;
  pinIndex = pinIndex % PINZAHL;
}



Bei drei Tastern lohnt das noch nicht so richtig, aber bei mehr macht es dann Sinn.

pin 3 und pin 4 keine Funktion, pin 2 hat Funktion.
welche Buchstabe hast du hier für pin 3 und pin 4 vergeben??

tarkankantur:
pin 3 und pin 4 keine Funktion, pin 2 hat Funktion.
welche Buchstabe hast du hier für pin 3 und pin 4 vergeben??

Wenn ich die Tasten an Pin2, Pin3 und Pin4 nacheinander drücke, erhalte ich diese Ausgabe:

Programmanfang
Taste gedrueckt: A
Taste losgelassen: A
Taste gedrueckt: B
Taste losgelassen: B
Taste gedrueckt: C
Taste losgelassen: C

Alle drei Tasten funktionieren bei mir beim zweiten Sketch am UNO.

geht das??

Keyboard.write(Shift und /); // möchte Shift und / mit einer Tastendruck ausführen.

oder

Keyboard.write(L-Alt und *) // nicht nacheinander sondern alt und * zusamen ausführen.

Habe mit L-Alt && * probiert, geht nicht.

Mit HEX auch probiert. Keyboard.write(0xF,0x2F);

wenn ich,
Keyboard.write(0xF);
Keyboard.write(0x2F);
dann führt es nacheinander aus und nicht gleichseitig.

Ich komme nicht mehr weiter, bitte um Hilfe.
Wüste auch nicht wo ich mich im Internet über sowas schlau machen kann.

Gruß