#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Piny
const int LED_RED = 25;
const int LED_GREEN = 26;
const int BTN_START = 32;
const int BTN_CLUTCH = 33;
const int POT_PIN = 34; // ADC1_CH6 (GPIO34)
// Zmienne
bool clutchPressed = false;
int throttlePercent = 0;
unsigned long startTime, reactionTime;
bool inTest = false;
bool greenLit = false;
unsigned long greenStart, greenDuration;
void setup() {
Serial.begin(115200);
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(BTN_START, INPUT_PULLUP);
pinMode(BTN_CLUTCH, INPUT_PULLUP);
lcd.init();
lcd.backlight();
// Ekran powitalny
lcd.setCursor(0, 0);
lcd.print("---GooMoo#312---");
lcd.setCursor(0, 1);
lcd.print(" Test Refleksu");
delay(2000);
lcd.clear();
}
void loop() {
// Ekran główny – czekamy na START
if (!inTest) {
lcd.setCursor(0, 0);
lcd.print("Nacisnij START ");
if (digitalRead(BTN_START) == LOW) {
delay(50);
while (digitalRead(BTN_START) == LOW); // debounce
startSequence();
}
return;
}
// Faza 1 – wciśnij sprzęgło i kręć gazem (max 5 s)
unsigned long phase1Start = millis();
while (millis() - phase1Start < 5000 && !clutchPressed) {
clutchPressed = digitalRead(BTN_CLUTCH) == LOW;
throttlePercent = map(analogRead(POT_PIN), 0, 4095, 0, 100);
lcd.setCursor(0, 0);
lcd.print("Wcisnij sprzeglo");
lcd.setCursor(0, 1);
lcd.print("nakrec gaz ");
// Graficzna reprezentacja gazu (16 znaków)
int bars = map(throttlePercent, 0, 100, 0, 16);
lcd.setCursor(0, 1);
for (int i = 0; i < 16; i++) {
lcd.write(i < bars ? 0xFF : ' ');
}
if (clutchPressed) break;
delay(100);
}
// Faza 2 – czerwona 3 s
digitalWrite(LED_RED, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sprzeglo OK");
lcd.setCursor(0, 1);
int bars = map(throttlePercent, 0, 100, 0, 16);
for (int i = 0; i < 16; i++) {
lcd.write(i < bars ? 0xFF : ' ');
}
delay(3000);
digitalWrite(LED_RED, LOW);
// Faza 3 – zielona losowo 1–7 s
greenDuration = random(1000, 7001);
digitalWrite(LED_GREEN, HIGH);
greenStart = millis();
greenLit = true;
while (millis() - greenStart < greenDuration) {
delay(10); // czekamy
}
digitalWrite(LED_GREEN, LOW);
greenLit = false;
startTime = millis(); // początek pomiaru reakcji
// Czekamy na puszczenie sprzęgła
while (digitalRead(BTN_CLUTCH) == LOW) {
delay(1);
}
reactionTime = millis() - startTime;
// Wynik
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(String(reactionTime) + " ms");
lcd.setCursor(0, 1);
lcd.print("Gaz: " + String(throttlePercent) + "%");
// Czekamy na START by zresetować
while (digitalRead(BTN_START) == HIGH);
delay(50);
while (digitalRead(BTN_START) == LOW);
resetTest();
}
void startSequence() {
inTest = true;
clutchPressed = false;
lcd.clear();
}
void resetTest() {
inTest = false;
clutchPressed = false;
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, LOW);
lcd.clear();
}