Präziser Reaktionszeit-Test mit Arduino UNO
Komponenten und Zubehör
| Taster | × | 3 |
| 5 mm LED: Rot | × | 2 |
| Männlich-Männlich-Jumperkabel | × | 1 |
| Breadboard | × | 1 |
| Arduino UNO | × | 1 |
| USB-A-auf-B-Kabel | × | 1 |
| Widerstand 100 Ω | × | 2 |
| Widerstand 10 kΩ | × | 3 |
Apps & Online-Dienste
- Arduino IDE
Über dieses Projekt
Ein Artikel über Reaktionszeit bei Athleten, Scharfschützen, Cricket-/Baseball-Spielern zeigte mir, wie sehr Reaktionszeit den Alltag beeinflusst – z. B. beim Autofahren kann langsame Reaktionszeit fatale Folgen haben. Wie misst man die eigene Reaktionszeit? Hier die Lösung.
Schritt 1: Benötigte Hardware







Software: Arduino IDE. Bauteile sollte jeder Elektronik-Bastler herumliegen haben. Unklare Teile? Bilder anschauen.
Schritt 2: Messverfahren für visuelle Reaktionszeit
Es gibt auditive, visuelle, taktile Reaktionszeiten. Hier: Visuelle Reaktionszeit.
Ablauf:
- Serielle Konsole: „Drücke Ready-Taste, wenn du bereit bist“
- Nach zufälligem Zeitintervall leuchtet eine der beiden LEDs (zufällig gewählt)
- Testperson drückt so schnell wie möglich den zugehörigen Taster (LED1→Taster1, LED2→Taster2)
- Arduino misst Zeitdifferenz: LED-An → Tasterdruck
- Gemessene Reaktionszeit auf Serial Monitor ausgeben
Von den 3 Tastern: 1× Ready, 2× für LEDs (LED1↔Taster1, LED2↔Taster2).

Schritt 3: Aufbau

- 5V & GND vom Arduino auf Breadboard
- Kathoden beider LEDs über 100 Ω Vorwiderstände an GND
- Anoden: LED1 → Pin 8, LED2 → Pin 12
- Taster wie im Bild (offen: Seitenkontakte verbunden; gedrückt: Diagonalkontakte verbunden)
- 10 kΩ Pull-Down-Widerstände an Taster-Eingängen (anderes Ende an 5V)
- Taster an Pins 2, 4, 7
Hinweis: Pin-Belegung frei wählbar, hier nur meine Wahl.
Schritt 4: Programmieren
Code unten zum Download, aber selbst schreiben ist lehrreicher. Wichtige Punkte:
- Entprellen der Taster beachten
- Hohe Auflösung bei Zeitmessung (Mikrosekunden)
- Serial Monitor für Debugging & Benutzerführung
Bei Unklarheiten: Video anschauen.
Schritt 5: Testen
Freunde einladen, wer ist am schnellsten? Tabelle führen, Durchschnitt bilden (Arduino kann das übernehmen), Sieger küren. Demo-Video angehängt. Durchschnittliche visuelle Reaktionszeit ~250 ms.
PS: Wenn es nach Alkohol über 250 ms liegt – nicht Auto fahren!
Code
Arduino-Code für Reaktionszeitmessung
// Pin-Definitionen
const int buttonPin1 = 4;
const int buttonPin2 = 2;
const int buttonPin3 = 7;
const int ledPin1 = 8;
const int ledPin2 = 12;
// Variablen
int ledState1 = LOW, ledState2 = LOW;
int buttonState1, buttonState2, buttonState3;
int lastButtonState1 = LOW, lastButtonState2 = LOW, lastButtonState3 = LOW;
unsigned long lastDebounceTime = 0;
long debounceDelay = 20000; // µs
unsigned long randNumber;
unsigned long minRandomNumber = 2000;
unsigned long maxRandomNumber = 5000;
unsigned long time1, time2;
int button3Pressed = LOW;
int printcount = 0;
int takeReading = LOW;
int reading1, reading2, reading3;
int oddNumber, evenNumber;
void setup() {
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
pinMode(buttonPin3, INPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
Serial.begin(115200);
digitalWrite(ledPin1, ledState1);
digitalWrite(ledPin2, ledState2);
randomSeed(analogRead(0));
}
void loop() {
if (printcount == 0) {
Serial.println("press button 3 when you are ready");
printcount = 1;
takeReading = LOW;
oddNumber = LOW;
evenNumber = LOW;
}
if (button3Pressed == HIGH) {
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
randNumber = random(minRandomNumber, maxRandomNumber);
delay(randNumber);
if (randNumber & 1) {
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, LOW);
time1 = micros();
oddNumber = HIGH;
} else {
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);
time1 = micros();
evenNumber = HIGH;
}
button3Pressed = LOW;
}
reading3 = digitalRead(buttonPin3);
if (takeReading == HIGH) {
if (oddNumber == HIGH) reading1 = digitalRead(buttonPin1);
if (evenNumber == HIGH) reading2 = digitalRead(buttonPin2);
}
if (reading1 != lastButtonState1 || reading2 != lastButtonState2 || reading3 != lastButtonState3) {
lastDebounceTime = micros();
}
if ((micros() - lastDebounceTime) > debounceDelay) {
if (reading1 != buttonState1) {
buttonState1 = reading1;
if (buttonState1 == HIGH) {
Serial.print("Your reaction time is: ");
Serial.print(lastDebounceTime - time1);
Serial.println("us");
Serial.println();
printcount = 0;
}
}
if (reading2 != buttonState2) {
buttonState2 = reading2;
if (buttonState2 == HIGH) {
Serial.print("Your reaction time is: ");
Serial.print(lastDebounceTime - time1);
Serial.println("us");
Serial.println();
printcount = 0;
}
}
if (reading3 != buttonState3) {
buttonState3 = reading3;
if (buttonState3 == HIGH) {
Serial.println("READY TO GO");
button3Pressed = HIGH;
takeReading = HIGH;
}
}
}
lastButtonState1 = reading1;
lastButtonState2 = reading2;
lastButtonState3 = reading3;
}
Schaltplan

Herstellungsprozess
- Wann Gabelstapler-Gabeln ersetzen: Praktischer Leitfaden
- Smart Thirst Alert: DIY Pflanzen-Alarm für optimale Bewässerung
- Italienische Word Clock mit Arduino Nano, NeoPixel, LCD & RTC
- Arduino-Pins sparen: 4x3 Tastenfeld mit nur 3 Anschlüssen verbinden
- Zuverlässiger Sigfox-kWh-Zähler mit Arduino MKR Fox 1200
- Bluetooth-Temperaturmonitor mit Arduino Nano
- Berührungsloses Gesten-Schloss: Sicherer Zugang mit APDS-9960 & Arduino
- Arduino Nano Begleiter-Set – Essentielle Bauteile & Werkzeuge für DIY-Elektronik
- Isolierter Analogeingang für Arduino: Spannung/Strom galvanisch trennen
- Zeit für ein Kompressor-Upgrade? Die Anzeichen frühzeitig erkennen