/*
Forum:https://forum.arduino.cc/t/kann-mir-jemand-sagen-warum-der-button-nicht-funktioniert/1446985/5
Wokwi:https://wokwi.com/projects/465893371924846593
ec2021
Ampel-Statemachine mit Fussgänger-Taste, die unabhängig von den Phasen abgefragt wird
beim Übergang von der Grün-Phase in die Gelb-Phase werden aller vorherigen
Tasteneingaben verworfen
Hier: Keine Led, nur Serielle Textausgabe
*/
enum class Phase {ROT, ROT_GELB, GRUEN, GELB};
constexpr unsigned long GruenStandard {10000};
constexpr unsigned long GruenVerkuerzt { 3000};
constexpr unsigned long GelbDauer { 3000};
constexpr unsigned long RotDauer { 5000};
constexpr unsigned long RotGelbDauer { 3000};
constexpr byte tasterPin {2};
Phase AmpelPhase;
unsigned long phasenStart = 0;
boolean tasteGedrueckt = false;
void setup() {
Serial.begin(115200);
pinMode(tasterPin, INPUT_PULLUP);
// StartBedingungen setzen:
phasenStart = millis();
Serial.println("Grün");
AmpelPhase = Phase::GRUEN;
}
void loop() {
TasterAbfrage();
AmpelMaschine();
}
void AmpelMaschine() {
switch (AmpelPhase) {
case Phase::ROT:
if (millis() - phasenStart > RotDauer) {
AmpelPhase = Phase::ROT_GELB;
Serial.println("Rot Gelb");
phasenStart = millis();
}
break;
case Phase::ROT_GELB:
if (millis() - phasenStart > RotGelbDauer) {
AmpelPhase = Phase::GRUEN;
Serial.println("Grün");
phasenStart = millis();
}
break;
case Phase::GRUEN:
if (millis() - phasenStart > ((tasteGedrueckt) ? GruenVerkuerzt : GruenStandard)) {
// Hier wird der Tasten-Status zurückgesetzt, unabhängig davon, ob die
// nun folgende Phase aus Zeit- oder aus Tastengründen eingeleitet wurde.
// Damit verfallen hier alle vor und während der Grünphase getätigten
// Tasteneingaben
tasteGedrueckt = false;
AmpelPhase = Phase::GELB;
Serial.println("Gelb");
phasenStart = millis();
}
break;
case Phase::GELB:
if (millis() - phasenStart > GelbDauer) {
AmpelPhase = Phase::ROT;
Serial.println("Rot");
phasenStart = millis();
}
break;
}
}
void TasterAbfrage() {
if (digitalRead(tasterPin) == LOW) {
tasteGedrueckt = true;
delay(30); // Einfaches "Debouncen", 30 ms sind hier zu verkraften ;-)
}
}
/*
Die Zeile
if (millis() - phasenStart > ((tasteGedrueckt) ? GruenVerkuerzt : GruenStandard)) {...}
könnte man auch so schreiben
unsigned long dauer;
if (tasteGedrueckt) {
dauer = GruenVerkuerzt;
} else {
dauer = GruenStandard;
}
if (millis() - phasenStart > dauer) {...}
*/