#define TASTER 7 // Taster-Pin
#define LEDROT 11 // RCB-LED Rot Common Anode: LOW = rot
#define LEDGRUEN 13 // RCB-LED Grün
byte phase = 0; // 1 = Rot, 2 = Gelb (ROT-GRUEN), 3 = Grün = Zeit läuft, 0 = Warte auf Start
unsigned long startPunkt = 0; // Wenn Taster gedrückt - > Startpunkt
void setup() {
pinMode(TASTER, INPUT_PULLUP);
pinMode(LEDROT, OUTPUT);
pinMode(LEDGRUEN, OUTPUT);
digitalWrite(LEDROT, HIGH);
digitalWrite(LEDGRUEN, HIGH);
Serial.begin(115200);
Serial.println("Reaktionstest:");
}
bool tasterAlt; // Flankenerkennung
void loop() {
bool taster = (digitalRead(TASTER) == LOW);
bool tpressed = false;
if ( taster != tasterAlt) {
delay(5); // entprellen
tasterAlt = taster;
if (taster) tpressed = true; // nur diesen Zyklus
}
// Steuerung der Ampelphasen
if ((tpressed) && (phase == 0)) {
Serial.println("Erster Taster-Druck : ROT - GELB - GRÜN");
phase = 1; // Beginne mit Rot
digitalWrite(LEDROT, LOW);
startPunkt = millis();
randomSeed(startPunkt);
}
if ((phase == 1) && (millis() - startPunkt > 2000)) {
digitalWrite(LEDGRUEN, LOW); // R+G = gelb
phase = 2; // Gelb
}
if ((phase == 2) && tpressed) {
Serial.println ("Fehlstart ! ");
digitalWrite(LEDROT, HIGH); //
digitalWrite(LEDGRUEN, HIGH); // LED aus
phase = 0; //
}
if ((phase == 2) && (millis() - startPunkt > 4000 + random(500))) {
digitalWrite(LEDROT, HIGH); // nur noch Grün leuchtet
phase = 3; // Grün
startPunkt = millis();
Serial.print ("Stopp : ");
// Wenn Taster z.Zt. gedrückt ist : wird ignoriert
}
// Zähle hoch, wenn LED Grün und noch nicht erneut der Taster gedrückt wurde.
if ((phase == 3) && (tpressed)) {
// LED leuchtet Grün und der Taster wurde gedrückt
Serial.println(millis() - startPunkt);
digitalWrite(LEDGRUEN, HIGH); // LED aus
phase = 0;
}
}