Hallo,
ich möchte mit meine Arduino Uno ein kleines Gerät bauen, mit dem ich die Beweglichkeit und koordination von Fingern Trainieren kann.
Ich möchte mit 5 LED ein Muster ausgeben, das ich dann mit den Tastern nachmachen muss. Dies können Zufällige Muster (Random) oder auch Feste Abfolgen (Abgespeicherte Sequenzen)sein.
Wie ich die Worte erzeuge (Binäres Wort evtl. in ein Schieberegister) bekomme ich hin.
Wie ich die Eingänge Abfrage ist mir nicht klar.
Man kann ja nicht alle benötigten Taster hundertprozent gleichzeitig drücken.
Man muss aber auch die Chance haben mit der Zeit schneller zu werden.
Wenn jemand eine Idee hat, wie ich dieses Eingabe-Problem lösen kann wäre ich sehr dankbar.
(Vielleicht ist es ja ganz einfach, und ich mache mir zu viele Gedanken.
Du kannst die Zeit einfach mit millis() abfragen und prüfen ob ein bestimmte Spanne vergangen ist, bzw. wie viel Zeit zwischen dem Anfang und Ende des Test vergangen ist. Du fragst ständig die Taster ab (Polling) und speicherst ab welche gedrückt wurden (z.B. in einem bool array). Dann schaust du nach ob die korrekten Taster gedrückt wurden. Da kannst du dann auch leicht abfragen ob falsche Taster gedrückt wurden.
Das packst du noch in eine Abfrage einer bool-Variablen, so dass nur gemacht wird wenn der Test gestartet wurde.
Da hast du aber immer noch das Problem, dass man die Taster auch hintereinander drücken kann. Du willst noch die Zeit zwischen den Tastendrücken begrenzen?
wenn ich Dich jetzt richtig verstehe, würde ich's so machen:
Du nimmst eine zahl zwischen 1 und 31 (zufällig oder vorgegeben).
led-anzeige von 1 bis 31:
led1 = 1
led2 = 2
led3 = 4
led4 = 8
led5 = 16
die kombinationen daraus ergeben 1 bis 31 und sind eindeutig.
genau dieselben werte gibst Du den tastern 1 - 5. in der loop fragst Du alle 5 taster ab und zählst die werte der gedrückten zusammen. sobald led-ausgabe und taster-eingabe denselben wert haben: gewonnen.
Du mußt dafür die taster nicht mal entprellen, ist in diesem fall nicht nötig.
gruß stefan
PS.: die info, ob in der zahl von 1 bis 31 eine bestimmte led-zahl(1, 2, 4, 8 oder 16) enthalten ist, bekommst Du mit (zb. für die zahl 17, ob 2 drin ist):
Hallo,
vielen Dank für die Ideen.
ich werde Heute anfangen, die Hardware zusammen zu löten. (zum Experimentieren)
Wenn ich euch richtig verstanden habe,
definiere ich ein Array mit 5 bit und fülle es mit einer
binären Zahl. Danach gebe ich die LED aus (digitalWrite eine nach dem anderen)
kurze Pause
nun die Eingänge einlesen digitalRead auch in ein Array
nun die beiden Array mit & vergleichen.
und das solange bis die Übung fertig ist.
Da werde ich mich am Wochenende dran setzen und versuchen den Code zu schreiben.
BastelWastel:
definiere ich ein Array mit 5 bit und fülle es mit einer binären Zahl.
Nein. Wenn du das von Eisebaer machst, einfach ein byte oder int nehmen. Das kannst du auch wie eine Binärzahl behandeln.
nun die Eingänge einlesen digitalRead auch in ein Array
Oder getrennte Variablen. Geht so oder so.
und das solange bis die Übung fertig ist.
Kommt halt darauf an ob die Aufgabe in einer bestimmten Zeit gelöst werden soll oder ob du stoppen willst wie lange der Benutzer dazu braucht. Die Lösung ist aber in beiden Fällen ähnlich. Man kann auch beides machen.
Wenn du noch verhindern willst, dass der Benutzer die Tasten hintereinander drückt kannst du noch die Zeit abspeichern wann die Tasten gedrückt wurden und dann miteinander vergleichen. Wenn du da z.B. maximal 200-300ms zulässt, müssen die Tasten nicht 100% gleichzeitig gedrückt werden (was unmöglich ist), aber man kann sich auch nicht ewig Zeit lassen.