#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // Adres może być 0x3F – sprawdź!
const int ledRed = 7;
const int ledGreen = 8;
const int buttonStart = 2;
const int buttonClutch = 3;
enum State {IDLE, WAIT_CLUTCH, HOLD_CLUTCH, WAIT_RELEASE, SHOW_RESULT, FALSE_START};
State currentState = IDLE;
unsigned long greenStartTime = 0;
unsigned long greenDuration = 0;
unsigned long reactionStart = 0;
unsigned long reactionTime = 0;
bool clutchHeld = false;
bool testStarted = false;
void setup() {
pinMode(ledRed, OUTPUT);
pinMode(ledGreen, OUTPUT);
pinMode(buttonStart, INPUT_PULLUP);
pinMode(buttonClutch, INPUT_PULLUP);
lcd.begin();
lcd.backlight();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Test refleksu");
lcd.setCursor(0, 1);
lcd.print("START -> Przycisk");
}
void loop() {
static bool lastStartState = HIGH;
bool currentStartState = digitalRead(buttonStart);
bool clutchPressed = digitalRead(buttonClutch) == LOW;
if (currentStartState == LOW && lastStartState == HIGH) {
resetTest();
}
lastStartState = currentStartState;
switch (currentState) {
case IDLE:
break;
case WAIT_CLUTCH:
if (clutchPressed) {
digitalWrite(ledRed, LOW);
digitalWrite(ledGreen, HIGH);
currentState = HOLD_CLUTCH;
greenDuration = random(1000, 7000); // 1s do 7s
greenStartTime = millis();
}
break;
case HOLD_CLUTCH:
if (!clutchPressed) {
showFalseStart();
return;
}
if (millis() - greenStartTime >= greenDuration) {
digitalWrite(ledGreen, LOW);
currentState = WAIT_RELEASE;
reactionStart = millis();
}
break;
case WAIT_RELEASE:
if (!clutchPressed) {
reactionTime = millis() - reactionStart;
currentState = SHOW_RESULT;
showReactionTime();
}
break;
case SHOW_RESULT:
case FALSE_START:
// Czekamy na ponowne wciśnięcie START
break;
}
}
void resetTest() {
digitalWrite(ledRed, HIGH);
digitalWrite(ledGreen, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Trzymaj sprzeglo");
lcd.setCursor(0, 1);
lcd.print("CZERWONA LED!");
currentState = WAIT_CLUTCH;
}
void showReactionTime() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Czas reakcji:");
lcd.setCursor(0, 1);
lcd.print(reactionTime);
lcd.print(" ms");
}
void showFalseStart() {
digitalWrite(ledGreen, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ZA WCZESNIE");
lcd.setCursor(0, 1);
lcd.print("TAŚMA!!!");
currentState = FALSE_START;
}