Reaktionsspiel Arduino?

2 Antworten

Vielleicht ist das Dein Verständnisproblem: "foo = digitalRead(pin)" stellt keine dauerhafte Verbindung zwischen der Variable foo und dem Zustand des Pins her, sondern liest einmal den Zustand und legt ihn in der Variable ab.

Was Deine loop tut, ist momentan das:

  • Sie liest die Pins x1 und x2 (ungünstige Variablennamen übrigens, mal abgesehen davon, daß es Konstanten sein sollten) aus und speichert das Ergebnis jeweils in tasterstatus1 und -2 ab,
  • Sie wartet 8 Sekunden,
  • Macht die LED an Pin 2 an und gibt den Text per Seriell aus,
  • Wartet noch 5 Sekunden,
  • Macht die LED wieder aus,
  • Wenn ganz am Anfang x1 HIGH war, gibt sie jetzt "x1" aus und
  • Wenn ganz am Anfang x2 HIGH war, gibt sie jetzt "x2" aus.
  • Und dann das ganze wieder von vorn.

Das ist vermutlich absolut nicht das, was Du möchtest. Überleg' Dir mal genau, was in welcher Reihenfolge passieren soll, und schreib das sorgfältig auf, dann hast Du schon die halbe Miete.

Ein paar Tips:

  • Nachdem die LED angegangen ist, mußt Du immer wieder beide Taster abfragen, bis einer gedrückt wurde. (Oder eine bestimmte Zeit abgelaufen ist, aber das sollte erst der zweite Schritt sein.)
  • Sobald Du registriert hast, daß eine Taste gedrückt wurde, mußt Du Dir irgendwie merken, welche das war, weil ja nur derjenige der Gewinner ist. Das ist aber leicht, weil Du dann ja aufhören kannst, weiter abzufragen.

Wie sind eigentlich die Taster angeschlossen? Normalerweise benutzt man die internen Pullup-Widerstände des Microcontrollers (pinmode(..., INPUT_PULLUP)) und legt den Taster zwischen den Pin und Ground.

Ich hoffe, das reicht als Gedankenanstoß.

Arazhulhd66 
Fragesteller
 03.06.2019, 19:39

Das Delay habe ich ja wie bereits geschrieben, ganz am Ende. Danke für deine Antwort!

0
RareDevil  03.06.2019, 19:46
@Arazhulhd66

Du musst Dir auch im klaren sein, das DELAY das Programm stoppt... In der Zeit wird kein Code ausgeführt. Für deine Anforderung das ungünstigste, was geht... Als Reaktionstest würde ich den Start für die Tasterbetätigung mit einem Zufallsgenerator starten.. Somit ist die Wartezeit nicht immer identisch...

1
Arazhulhd66 
Fragesteller
 03.06.2019, 19:49
@RareDevil

Ja, hätteste ´n Beispiel? Wie mache ich das mit der Zufallsprogrammierung? Mit random?

0
RareDevil  03.06.2019, 20:38
@Arazhulhd66

random(min, max)

min wäre z.B. 5000 für 5sek und max 15000 für 15sek... Das ganze in eine variable, die als Verzögerungszeit dient...

Ich würde die Verzögerung nur einmal ablaufen lassen, und sobald die Abfrage gestartet ist, sperren..

// Zufallsgenerator wird nur ausgeführt, wenn Start wahr
// ist, wählt zwischen 5-15sek Verzögerung und sperrt 
//sich wieder, also nur ein Durchlauf...

If (Start == true){
serialPrint.... Zufallsgenerator gestartet...
delay (random(5000,15000));
Freigabe = true;
Start = false;
LED = true;
serialPrint... Warte auf Tastendruck...
}

// Taster werden eingelesen
druckA = digitalRead...1
druckB = digitalRead...2

// Taster werden nur ausgewertet, wenn durch Zufallsgenerator gestartet
if (Freigabe == true && druckA == true ){
Freigabe = false;
SerialPrint... A war schneller...;
LED = false;
}

if (Freigabe == true && druckB == true ){
Freigabe = false;
SerialPrint... B war schneller...;
LED = false;
}

// startet eine Wartezeit 10sek bis zum Neustart des Zufallsgenerators
If (Freigabe == false && Start == false)[
delay = 10000;
Start = true;
}

Code natürlich Syntaxrichtig schreiben und vervollständigen, war jetzt mehr Gedankengang... Und noch zu verfeinern... Variablen, die nur Ja oder nein kennen als bool anlegen, spart etwas speicher. Delay immer nur in den If-Bedingungen aktiv, Taster werden da zwischen immer eingelesen...

1
Arazhulhd66 
Fragesteller
 03.06.2019, 19:43

Und wie lässt man nun etwas dauerhaft ausgeben? Man müsste ja ansonsten immer wieder digitalRead.... einfügen... Habe übrigens per #define nun x1 und x2 als Konstanten belegt.

0
gwf79  03.06.2019, 20:01
@Arazhulhd66

Dauerhaft ausgeben oder dauerhaft abfragen?

Und ja, Du mußt in einer Schleife so oft die beiden Pins immer wieder abfragen, bis einer der Taster gedrückt wurde.

Konstanten kannst Du statt mit #define auch per "const int Taster1=3;" definieren; die Profis finden das im Allgemeinen besser.

1

Kleiner Fix: habe delay(5000; und digital...(...LOW); ganz am Ende geschrieben, geht trotzdem nicht....