#include <Wire.h> // already pre-installed
#include <LiquidCrystal_I2C.h>
// LiquidCrystal_I2C by Martin Kubovcik muss installiert werden
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C Adresse meist 0x27 oder 0x3F
// Verbindung:
// GND -> GND
// VCC -> 5V
// SDA -> A4
// SCL -> A5
// Button -> Pin 7 bzw. Pin 8 und Button -> GND
const int buttonPin1 = 7; // Button input pin P1
const int buttonPin2 = 8; // Button input pin P2
void setup() {
pinMode(buttonPin1, INPUT_PULLUP); // internal pull-up resistor
pinMode(buttonPin2, INPUT_PULLUP); // internal pull-up resistor
lcd.init(); // initialize I2C display
lcd.backlight(); // turn on backlight
lcd.setCursor(0,0);
lcd.print("Reaction Timer!");
delay(2000);
lcd.clear();
}
void loop() {
while (digitalRead(buttonPin1) == LOW || digitalRead(buttonPin2) == LOW) { }
lcd.setCursor(0,0);
lcd.print("Get Ready...");
delay(random(3000,6000)); // random wait 3-6 s
lcd.clear();
lcd.setCursor(0,0);
while (digitalRead(buttonPin1) == LOW || digitalRead(buttonPin2) == LOW) {
// wait for button release
}
lcd.print("NOW!");
long startTime = millis();
long reactionTime= 100000;
int winner = 0;
while ((digitalRead(buttonPin1) == HIGH)&&(digitalRead(buttonPin2) == HIGH)) {
// Wait for first valid press
while (true) {
if (digitalRead(buttonPin1) == LOW) {
winner = 1;
break;
}
if (digitalRead(buttonPin2) == LOW) {
winner = 2;
break;
}
}
reactionTime = millis() - startTime;
}
lcd.clear();
lcd.print("P");
lcd.print(winner);
lcd.print(" wins!");
lcd.setCursor(0, 1);
lcd.print("Time:");
lcd.print(reactionTime);
lcd.print(" ms");
delay(2000);
lcd.clear();
}