Fastest Finger First Quiz Buzzer using Arduino Nano

Last Updated on October 16, 2025

Have you ever watched Quiz shows or participated and wondered how they instantly detect who pressed the button first? to make the light and buzzer ON, Of course electronics! there are different types of fastest finger first quiz buzzer circuit available, but here is the Quickest and easy to build quiz buzzer circuit with 16 MHz clock speed.




Here we are going to build simple and reliable fastest finger first quiz buzzer system using an Arduino Nano. This project is perfect for small quiz competitions or fun events where multiple player compete to play or answer first.

Here we designed it for 3 players you can add more players by adding extra push buttons and LEDs (you have to add it on code also). This project detects first button pressed and then locks out others instantly each player represent unique color and buzzer tone frequency. Reset button clears and readies the system again.

Schematic

Wiring

Components Required

  1. Arduino Nano
  2. Push buttons = 4, 3 for players + 1 for reset
  3. LED = 3, (5mm – Red, Green, Yellow)
  4. 5V Buzzer (Piezo type)
  5. Resistor 1KΩ = 3
  6. Breadboard & Wires
  7. USB Cable to program Arduino nano

Working Video

Construction & Working

Each button is connected to a digital pin with internal pull up enabled so that we don’t need external Resistor. Connect the pins of button, LED and Arduino nano as per the table.

Arduino Nano PinComponent Pin
D1 (Tx)Red Button
D2Green Button
D3Yellow Button
D8Reset Button
D4Red LED Anode
D5Green LED Anode
D6Yellow LED Anode
D7Buzzer Positive pin
GNDGround Line

Each LED cathode pins are connected to GND through 1KΩ Resistor.

Code for Quiz Buzzer

// ------------------------------------------------------
// Fastest Finger First Quiz Buzzer using Arduino Nano
// Author: Paul Brace (Modified & Improved by RiyazDeen)
// Date: Updated Version - October 2025
// ------------------------------------------------------
// Features:
//  - 3 player buttons (Red, Green, Amber)
//  - First button pressed lights its LED and plays unique tone
//  - Reset button flashes all LEDs twice and readies the system
//  - Simple debounce and reliable single-winner logic
// ------------------------------------------------------

const int redButton   = 1;
const int greenButton = 2;
const int amberButton = 3;

const int redLED   = 4;
const int greenLED = 5;
const int amberLED = 6;

const int buzzer = 7;
const int resetButton = 8;

// Tone frequencies for each player
const int redNote   = 262;   // C4
const int greenNote = 523;   // C5
const int amberNote = 1047;  // C6

const int duration = 250;    // tone duration (ms)
bool waiting = false;

// ------------------------------------------------------
// Setup
// ------------------------------------------------------
void setup() {
  pinMode(redButton, INPUT_PULLUP);
  pinMode(greenButton, INPUT_PULLUP);
  pinMode(amberButton, INPUT_PULLUP);
  pinMode(resetButton, INPUT_PULLUP);

  pinMode(redLED, OUTPUT);
  pinMode(greenLED, OUTPUT);
  pinMode(amberLED, OUTPUT);
  pinMode(buzzer, OUTPUT);

  // Initial LED test sequence
  for (int i = 0; i < 2; i++) {
    FlashLEDs();
  }

  // Ready signal
  tone(buzzer, 1000, 200);
  delay(300);

  waiting = true;
}

// ------------------------------------------------------
// Function: Flash all LEDs twice
// ------------------------------------------------------
void FlashLEDs() {
  for (int i = 0; i < 2; i++) {
    digitalWrite(redLED, HIGH);
    digitalWrite(greenLED, HIGH);
    digitalWrite(amberLED, HIGH);
    delay(300);
    digitalWrite(redLED, LOW);
    digitalWrite(greenLED, LOW);
    digitalWrite(amberLED, LOW);
    delay(300);
  }
}

// ------------------------------------------------------
// Function: Check button presses (first one wins)
// ------------------------------------------------------
bool checkButtons() {
  if (digitalRead(redButton) == LOW) {
    digitalWrite(redLED, HIGH);
    tone(buzzer, redNote, duration);
    delay(50);  // debounce
    return true;
  }

  if (digitalRead(greenButton) == LOW) {
    digitalWrite(greenLED, HIGH);
    tone(buzzer, greenNote, duration);
    delay(50);
    return true;
  }

  if (digitalRead(amberButton) == LOW) {
    digitalWrite(amberLED, HIGH);
    tone(buzzer, amberNote, duration);
    delay(50);
    return true;
  }

  return false;
}

// ------------------------------------------------------
// Main Loop
// ------------------------------------------------------
void loop() {
  // If Reset button is pressed
  if (digitalRead(resetButton) == LOW) {
    FlashLEDs();
    tone(buzzer, 1000, 200); // ready beep
    delay(300);
    waiting = true;
  }

  // Check for first player
  if (waiting) {
    waiting = !checkButtons(); // once pressed, waiting becomes false
  }
}

After wiring just upload the code after done uploading, Arduino Nano gets ready by blinking all three LEDs and goes OFF then give alert buzzer sound, now its ready to detect fastest finger (which button pressed first). When the Arduino detects a Low signal (button press) then it decides which player first and activates that player’s LED and tone, other buttons are ignored until the system is reset.

The first button is detected using digitalRead(), Reset triggers all LEDs to flash twice and gives a ready beep. Here the use of INPUT_PULLUP ensures the input stay stable and there is no random triggering even if you use long wires between external components and Arduino Nano boards.




Leave a Reply

Your email address will not be published. Required fields are marked *