#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Set up the LCD: (RS, E, D4, D5, D6, D7)
const int buttonPin1 = 7; // Player 1 button
const int buttonPin2 = 8; // Player 2 button
const int backlightPin = 9; // LCD backlight control pin (PWM)
unsigned long recordTime = 9999;
int recordHolder = 0;
void setup() {
pinMode(buttonPin1, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
pinMode(backlightPin, OUTPUT);
analogWrite(backlightPin, 255); // Max = 255
lcd.begin(16, 2);
lcd.print("Reaction Timer!");
delay(2000);
lcd.clear();
}
void loop() {
// Wait for both players to release buttons
while (digitalRead(buttonPin1) == LOW || digitalRead(buttonPin2) == LOW) { }
lcd.setCursor(0, 0);
lcd.print("Get Ready...");
unsigned long waitTime = random(3000, 6000);
unsigned long startWait = millis();
// Early press detection
while (millis() - startWait < waitTime) {
if (digitalRead(buttonPin1) == LOW) {
lcd.clear();
lcd.print("P1 too early!");
delay(2000);
lcd.clear();
return;
}
if (digitalRead(buttonPin2) == LOW) {
lcd.clear();
lcd.print("P2 too early!");
delay(2000);
lcd.clear();
return;
}
}
lcd.clear();
lcd.print("NOW!");
unsigned long signalTime = millis();
int winner = 0;
unsigned long reactionTime = 0;
// Wait for first valid press
while (true) {
if (digitalRead(buttonPin1) == LOW) {
winner = 1;
reactionTime = millis() - signalTime;
break;
}
if (digitalRead(buttonPin2) == LOW) {
winner = 2;
reactionTime = millis() - signalTime;
break;
}
}
lcd.clear();
lcd.print("P");
lcd.print(winner);
lcd.print(" wins!");
lcd.setCursor(0, 1);
lcd.print(reactionTime);
lcd.print(" ms");
delay(2000);
if (reactionTime < recordTime) {
recordTime = reactionTime;
recordHolder = winner;
}
lcd.clear();
lcd.print("Best: P");
lcd.print(recordHolder);
lcd.print(" ");
lcd.print(recordTime);
lcd.print("ms");
delay(2000);
// Wait for both buttons to be released before restarting
while (digitalRead(buttonPin1) == LOW || digitalRead(buttonPin2) == LOW) { }
delay(1000);
lcd.clear();
}