Projekt: „Reaktionszeittester“

Baue und programmiere ein Reaktionszeitmessgerät: Nachdem eine LED nach einer bestimmten Zeit zufällig (random-Befehl verwenden) aufleuchtet, soll ein Taster gedrückt und die Reaktionszeit zwischen Aufleuchten und Drücken bestimmt werden.
Quelltext
Quelltext
int led = 4;
int taster = 8;
int t =0;
int i;
int r;
void setup() {
pinMode(led, OUTPUT);
pinMode(taster, INPUT);
Serial.begin(9600);
}
void loop() {
t =0;
Serial.println("------");
Serial.println("Noch ein Spiel? Bitte Taste drücken.");
Serial.println("------");
while (t == 0) {
t = digitalRead(taster);
}
Serial.println("OK. Es geht los ....");
i = random(1000, 3000);
t = 0;
r = 0;
delay(i);
digitalWrite(led, HIGH);
while (t == 0) {
r = r + 1;
delay(1);
t = digitalRead(taster);
}
digitalWrite(led, LOW);
Serial.println(r);
delay(1000);
}
Quelltext mit Kommentaren
Quelltext (Lösung Mittelwert berechnen lassen+ Kommentare)
int led = 4; // Pin der LED
int taster = 8; // Pin des Schalters
int t =0; // SchalterZustand 0 offen / 1 gedrückt
int i; // Zufallszahl nach welcher Zeit die LED leuchtet
int r; // Reaktionszeit (soll gemessen werden)
int anzahlSpiele =0; // Anzahl der Spiele
int summe=0; // Summe aller Reaktionszeiten
double mittelwert=0; // Durchschnitt der Reaktionszeiten
void setup() {
pinMode(led, OUTPUT); // Setzt PIN als Ausgang
pinMode(taster, INPUT); // Setzt PIN als Eingang
Serial.begin(9600); // startet die serielle Kommunikation
}
void loop() {
t =0; // setzt den Schalterstate auf 0
Serial.println("------");
Serial.println("Noch ein Spiel? Bitte Taste drücken.");
Serial.println("------");
while (t == 0) { // solange der Schalter nicht gedrückt ist , kommt das Programm nicht aus der Schleife
t = digitalRead(taster); //liest den Schalter ein (wird gedrückt, so wird t=1 und die Schleife wird beendet)
}
// Spiel beginnt
anzahlSpiele++; // erhöht die Variable um eins
Serial.println("OK. Es geht los ...."); // Meldung für den Spieler
t = 0; // Schalterstate auf 0 zurücksetzen
r = 0; // Reaktionszeit auf 0 zurücksetzen
i = random(1000, 3000); // Zufallszahl zwischen 1000 und 2999 Millisekunden
delay(i); // Wartet die Zufallszeit ab
digitalWrite(led, HIGH); // und schaltet dann die LED an
while (t == 0) { // Solange der Schalterstate null ist
r = r + 1; // Zählt er jeweils eine Millisekunde dazu
delay(1); // Wartet eine Millisekunde
t = digitalRead(taster); // liest den Schalter ein (bei t=1 (gedrückt) wird die Schleife verlassen)
}
summe=summe + r; // addiert die Reaktionszeit r zu den vorherigen
mittelwert=summe/anzahlSpiele; // und berechnet den Mittelwert
digitalWrite(led, LOW); // macht die LED aus
/*
* Ausgabe der wichtigsten Daten:
*/
Serial.println("Reaktionszeit: ");
Serial.println(r);
Serial.print("Anzahl der Spiele: ");
Serial.println(anzahlSpiele);
Serial.print("Mittelwert: ");
Serial.println(mittelwert);
delay(1000); // wartet eine Sekunde, bevor es weiter geht
}
Aufgaben
- Teste das Programm.
- Benenne die Variablen t,i und r sinnvoll.
- Kommentiere jede Zeile des Quelltextes.
- In welchem Programmabschnitt findet die Zeitmessung statt?
- Wozu dient der Befehl
while (t == 0) { t = digitalRead(taster); }
zu Beginn des loop-Teils. - Welche Bedeutung hätte folgende Zeile:
while (digitalRead(taster)==0) {}
? - Erweitere das Programm so, dass die Reaktionszeit mit Kommentar auf dem seriellen Monitor angezeigt wird (z.B. Deine Reaktionszeit war 700 ms).
- Bestimme nun in jeweils 20 Einzelversuchen deine Reaktionszeit und berechne den Mittelwert.
- Der Arduino soll den Durchschnitt selbst berechnen. Führe dafür geeignete Variablen ein.
Mögliche Erweiterungen
- Wer zu früh drückt, soll Strafzeiten erhalten.
- Es soll immer ein Durchgang mit 10 Spielen gestartet werden. Danach sollen in einer Liste die erreichten Reaktionszeiten inkl. Durchschnittszeit angezeigt werden.
- ein anderes Spiel: die Lampe leuchtet eine bestimmte Zeit(Zufallszahl). Wenn die Lampe erlischt, soll genau die gleiche Zeit bis zum Drücken des Tasters verstreichen. Die Abweichungen werden aufsummiert.
Quelle
https://sfz-bw.de/wp-content/uploads/2018/04/Arduino-Skript_SFZ_Version_12042018.pdf