#include <Wire.h>
#include <LiquidCrystal_74HC595.h>
#define DS 11
#define SHCP 13
#define STCP 12
#define RS 1
#define E 2
#define D4 3
#define D5 4
#define D6 5
#define D7 6
LiquidCrystal_74HC595 lcd(DS, SHCP, STCP, RS, E, D4, D5, D6, D7);
#define TASTER 7 // Taster-Pin
#define LEDROT 10 // RCB-LED Rot
#define LEDGELB 9 // RCB-LED Gelb
#define LEDGRUEN 8 // RCB-LED Grün
#define LEVEL 5 // Schwierigketis-Level
int taktPin = 13; // SH_CP
int speicherPin = 12; // ST_CP
int datenPin = 11; // DS
byte phase = 0; // 1 = Rot, 2 = Gelb, 3 = Grün
long startPunkt = 0; // Wenn Taster gedrückt - > Startpunkt
byte anzeigeWert, stopZeit;
boolean taster = false, gestoppt = false;
void setup() {
pinMode(taktPin, OUTPUT);
pinMode(speicherPin, OUTPUT);
pinMode(datenPin, OUTPUT);
pinMode(TASTER, INPUT);
pinMode(LEDROT, OUTPUT);
// LCD-Setup
lcd.setCursor(0, 0);
lcd.print("Reaktionstest:");
}
void loop() {
taster = digitalRead(TASTER);
if (phase < 3) {
zeigeWert(0); // Zeige am Anfang 00 in der Anzeige
}
// Steuerung der Ampelphasen
if ((taster) && (startPunkt == 0)) {
phase = 1; // Beginne mit Rot
startPunkt = millis();
}
if ((phase == 1) && (millis() - startPunkt > 2000)) {
digitalWrite(LEDROT, HIGH);
}
if ((phase == 1) && (millis() - startPunkt > 4000)) {
digitalWrite(LEDGELB, HIGH);
phase = 2; // Gelb
}
if ((phase == 2) && (millis() - startPunkt > 6000)) {
digitalWrite(LEDROT, LOW);
digitalWrite(LEDGELB, LOW);
digitalWrite(LEDGRUEN, HIGH);
phase = 3; // Grün
}
// Zähle hoch, wenn LED Grün und noch nicht gestoppt wurde
if ((phase == 3) && (!gestoppt)) {
zeigeWert(anzeigeWert++);
delay(LEVEL); // Schwierigkeits-Level
}
// Leuchtet LED Grün und der Taster wurde gedrückt
if ((taster) && (phase == 3)) {
gestoppt = true; // Flag für gestoppt auf "wahr" setzen
stopZeit = anzeigeWert; // Stopzeit sichern
}
// Wenn gestoppt, dann Stopzeit anzeigen
if (gestoppt) {
zeigeWert(stopZeit);
}
// Wenn in Gelbphase Taster gedrückt -> zu früh
if ((taster) && (phase == 2)) {
fehlVersuchAnzeigen();
}
// Wenn überhaupt nicht reagiert wird -> Fehlversuch anzeigen
if (anzeigeWert == 99) {
fehlVersuchAnzeigen();
}
}
// Funktion zur Anzeige auf dem LCD
void zeigeWert(byte wert) {
lcd.setCursor(0, 1);
lcd.print("Reaktionszeit: ");
lcd.print(wert);
lcd.print(" ms ");
}
// Funktion zum Anzeigen eines Fehlversuchs und Zurücksetzen der Sequenz
void fehlVersuchAnzeigen() {
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("Fehlversuch!");
delay(2000); // Anzeige für 2 Sekunden halten
lcd.clear(); // Display löschen
phase = 0; // Sequenz zurücksetzen
startPunkt = 0;
gestoppt = false;
}