OpenSource Section | SB.Chetak Innovation | Research • Engineering • Responsible Knowledge Sharing

Reaction Time Tester

An Open-Source Arduino-Based System for Measuring Human Reaction Speed, Reflexes and Coordination

Electronics • Arduino • Human Performance Measurement • Open Source

Platform: Arduino Uno Display: I2C LCD 16×2 Input: Analog Joystick Open-Source Project

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.

Keywords: Reaction Time, Arduino, Joystick, I2C LCD, Human Performance, Reflex Testing, Open Source, Electronics.

Components Required

Arduino Uno Microcontroller — main processing unit
I2C LCD 16×2 Display module — shows stimulus and result
Analog Joystick Input device — built-in push button for response
USB Cable Power and programming interface
Breadboard For prototyping connections
Jumper Wires Male-to-male and male-to-female

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.

ComponentComponent PinArduino PinNotes
I2C LCDVCC5VPower supply
I2C LCDGNDGNDGround
I2C LCDSDAA4I2C data line
I2C LCDSCLA5I2C clock line
JoystickVCC (+5V)5VPower supply
JoystickGNDGNDGround
JoystickVRxA0X-axis (optional)
JoystickVRyA1Y-axis (optional)
JoystickSWD2Button — 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

  1. The Arduino powers on and initialises the I2C LCD display, showing a welcome message.
  2. The user presses the joystick button to begin a new reaction test.
  3. The system waits for a random delay between 1 and 5 seconds to prevent anticipatory pressing.
  4. The LCD displays the stimulus message (e.g. "PRESS NOW!") and the timer starts counting in milliseconds.
  5. The user presses the joystick button as quickly as possible upon seeing the stimulus.
  6. The system records the elapsed time between stimulus display and button press.
  7. The reaction time is displayed on the LCD (e.g. "Time: 248 ms").
  8. The result is categorised — Excellent (<200ms), Good (200–350ms), Average (350–500ms), or Slow (>500ms).
<200 msExcellent — Elite athlete range
200–350 msGood — Above average human
350–500 msAverage — Typical adult response
>500 msSlow — May indicate fatigue

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.

Reaction Time Tester — Browser Simulation Live Demo
REACTION TESTER
Press START...
—Last (ms)
—Best (ms)
—Average (ms)

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.

Arduino Sketch (.ino)
Wiring Diagram
Component List
Pin Reference

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.