#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int redPin = 9;
const int greenPin = 10;
const int bluePin = 11;
const int buttonPin = 2;
unsigned long ledOnTime;
bool waitingForReaction = false;
bool isGreen = false;
void setup() {
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
lcd.begin(16, 2);
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Reaction Timer");
delay(2000);
lcd.clear();
}
void loop() {
lcd.setCursor(0, 0);
lcd.print("Wait for color...");
delay(random(2000, 5000));
// Randomly choose green or a "wrong" color
int color = random(0, 4); // 0 = green, others = wrong
setColorByCode(color);
isGreen = (color == 0);
ledOnTime = millis();
waitingForReaction = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(isGreen ? "GO!" : "Don't Press!");
while (waitingForReaction) {
if (digitalRead(buttonPin) == LOW) {
setColor(0, 0, 0); // Turn off LED
lcd.clear();
if (isGreen) {
unsigned long reactionTime = millis() - ledOnTime;
lcd.print("Reaction Time:");
lcd.setCursor(0, 1);
lcd.print(reactionTime);
lcd.print(" ms");
} else {
lcd.print("Too Soon!");
}
waitingForReaction = false;
delay(3000);
lcd.clear();
}
}
}
// Set RGB color using inverted analogWrite for common cathode
void setColor(int r, int g, int b) {
analogWrite(redPin, 255 - r);
analogWrite(greenPin, 255 - g);
analogWrite(bluePin, 255 - b);
}
// Color code selector
void setColorByCode(int code) {
switch (code) {
case 0: setColor(0, 255, 0); break; // Green = correct
case 1: setColor(255, 0, 0); break; // Red
case 2: setColor(0, 0, 255); break; // Blue
case 3: setColor(255, 0, 255); break; // Purple
}
}