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

  1. Teste das Programm.
  2. Benenne die Variablen t,i und r sinnvoll.
  3. Kommentiere jede Zeile des Quelltextes.
  4. In welchem Programmabschnitt findet die Zeitmessung statt?
  5. Wozu dient der Befehl while (t == 0) { t = digitalRead(taster); } zu Beginn des loop-Teils.
  6. Welche Bedeutung hätte folgende Zeile: while (digitalRead(taster)==0) {} ?
  7. Erweitere das Programm so, dass die Reaktionszeit mit Kommentar auf dem seriellen Monitor angezeigt wird (z.B. Deine Reaktionszeit war 700 ms).
  8. Bestimme nun in jeweils 20 Einzelversuchen deine Reaktionszeit und berechne den Mittelwert.
  9. Der Arduino soll den Durchschnitt selbst berechnen. Führe dafür geeignete Variablen ein.

Mögliche Erweiterungen

  1. Wer zu früh drückt, soll Strafzeiten erhalten.
  2. Es soll immer ein Durchgang mit 10 Spielen gestartet werden. Danach sollen in einer Liste die erreichten Reaktionszeiten inkl. Durchschnittszeit angezeigt werden.

  3. 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