Reaction Time Tester
An Open-Source Arduino-Based System for Measuring Human Reaction Speed, Reflexes and Coordination
Electronics • Arduino • Human Performance Measurement • Open Source
An open-source Arduino-based reaction time tester using an Arduino Uno, analog joystick and I2C LCD module. The system generates a random-delay stimulus, records button-press response time in milliseconds and displays the result — providing an accessible and reproducible tool for measuring reaction speed, reflexes and coordination.
Abstract
The Reaction Time Tester is an open-source electronics project built on the Arduino Uno platform. It measures the time elapsed between the appearance of a stimulus on an I2C LCD display and the user's response via an analog joystick button press.
The system introduces a random delay before each stimulus to prevent anticipatory responses, then records and displays the reaction time in milliseconds. The project can be used for human performance assessment, educational demonstrations and coordination training.
Components Required
Wiring and Pin Connections
The I2C LCD module requires only two data lines (SDA and SCL) plus power. The analog joystick uses three connections — VRx, VRy and SW — where the SW (switch) pin is the button used to register the reaction.
| Component | Component Pin | Arduino Pin | Notes |
|---|---|---|---|
| I2C LCD | VCC | 5V | Power supply |
| I2C LCD | GND | GND | Ground |
| I2C LCD | SDA | A4 | I2C data line |
| I2C LCD | SCL | A5 | I2C clock line |
| Joystick | VCC (+5V) | 5V | Power supply |
| Joystick | GND | GND | Ground |
| Joystick | VRx | A0 | X-axis (optional) |
| Joystick | VRy | A1 | Y-axis (optional) |
| Joystick | SW | D2 | Button — reaction input |
Arduino Uno
┌──────────────────────────────┐
│ 5V ──────┬─────────────── │── VCC (LCD) / VCC (Joystick)
│ GND ──────┴─────────────── │── GND (LCD) / GND (Joystick)
│ A4 ────────────────────── │── SDA (LCD)
│ A5 ────────────────────── │── SCL (LCD)
│ A0 ────────────────────── │── VRx (Joystick)
│ A1 ────────────────────── │── VRy (Joystick)
│ D2 ────────────────────── │── SW (Joystick Button)
└──────────────────────────────┘
How It Works
- The Arduino powers on and initialises the I2C LCD display, showing a welcome message.
- The user presses the joystick button to begin a new reaction test.
- The system waits for a random delay between 1 and 5 seconds to prevent anticipatory pressing.
- The LCD displays the stimulus message (e.g. "PRESS NOW!") and the timer starts counting in milliseconds.
- The user presses the joystick button as quickly as possible upon seeing the stimulus.
- The system records the elapsed time between stimulus display and button press.
- The reaction time is displayed on the LCD (e.g. "Time: 248 ms").
- The result is categorised — Excellent (<200ms), Good (200–350ms), Average (350–500ms), or Slow (>500ms).
Live Browser Demo
This browser simulation replicates the behaviour of the Arduino reaction tester. Press "Start Test" to begin, then press "REACT!" as fast as you can when the LCD shows the stimulus.
Arduino Source Code
⬇️ Download Code (.ino)The following is the core Arduino sketch for the Reaction Time Tester. Copy this into the Arduino IDE or download the .ino file directly.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// LCD I2C address — 0x27 is common; try 0x3F if display is blank
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int JOYSTICK_SW = 2; // Joystick button pin
unsigned long startTime = 0;
unsigned long reactionMs = 0;
bool waiting = false;
bool ready = false;
unsigned long bestTime = 9999;
unsigned long totalTime = 0;
int attempts = 0;
void setup() {
lcd.init();
lcd.backlight();
pinMode(JOYSTICK_SW, INPUT_PULLUP);
randomSeed(analogRead(A2));
lcd.setCursor(0, 0); lcd.print("REACTION TESTER");
lcd.setCursor(0, 1); lcd.print("Press button...");
}
void loop() {
bool btnPressed = (digitalRead(JOYSTICK_SW) == LOW);
if (!waiting && !ready && btnPressed) {
// Start test — random delay 1–5 seconds
waiting = true;
lcd.clear();
lcd.setCursor(0, 0); lcd.print("Get ready...");
lcd.setCursor(0, 1); lcd.print("Wait for it!");
delay(random(1000, 5000));
lcd.clear();
lcd.setCursor(0, 0); lcd.print(">>> PRESS NOW! ");
startTime = millis();
ready = true;
waiting = false;
}
if (ready && btnPressed) {
reactionMs = millis() - startTime;
ready = false;
attempts++;
totalTime += reactionMs;
if (reactionMs < bestTime) bestTime = reactionMs;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Time: ");
lcd.print(reactionMs);
lcd.print(" ms");
lcd.setCursor(0, 1);
if (reactionMs < 200) lcd.print("Excellent!");
else if (reactionMs < 350) lcd.print("Good!");
else if (reactionMs < 500) lcd.print("Average");
else lcd.print("Slow...");
delay(200); // debounce
}
}
Open-Source Resources
Freely Available for Study and Reproduction
The Reaction Time Tester project is fully open source. The Arduino sketch, wiring diagram and component list are freely available. You may study, reproduce and modify this project for personal, educational or research use.
OpenSource Section — SB.Chetak Innovation
This project is released for educational and research purposes. You may study, reproduce and modify it. Attribution to the original author (Saswata Bag / SB.Chetak Innovation) is appreciated but not required for personal or educational use.