/*
Forum:https://forum.arduino.cc/t/kann-mir-jemand-sagen-warum-der-button-nicht-funktioniert/1446985/5
Wokwi:https://wokwi.com/projects/465825401866695681
ec2021
Ampel-Statemachine mit Fussgänger-Taste
Hier: Keine Led, nur Serielle Textausgabe
*/
enum class Phase {ROT, ROT_GELB, GRUEN, GELB};
constexpr unsigned long GruenDauer {5000};
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() {
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:
TasterAbfrage();
if (millis() - phasenStart > GruenDauer || tasteGedrueckt) {
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 ;-)
}
}