/*
Titel:
Ampelsteuerung mit Taster und Zustandswechsel
Autor: Dario B. Graf Alegiani ([email protected])
Datum: 05.06.2025
Version: 1.0
Beschreibung:
Dieses Programm steuert eine Ampel mit drei LEDs (grün, gelb, rot) über einen Taster.
Der Ablauf basiert auf einem Zustandsautomaten, der mit einem `enum` realisiert ist.
Zu Beginn leuchtet die grüne LED. Beim Tastendruck wechselt die Ampel zur gelben Phase.
Nach einer kurzen Verzögerung entscheidet das Programm anhand eines Merkers
(`vorherigePhaseGruen`), ob danach auf rot (wenn zuvor grün aktiv war) oder zurück auf grün
(bei zuvor rot) geschaltet wird. Die rote Phase dauert 5 Sekunden, danach folgt wieder gelb.
So entsteht ein wiederholbarer Zyklus: **Grün → Gelb → Rot → Gelb → Grün**, gesteuert
durch Taster und interne Logik.
Änderungsprotokoll:
- Version 1.0 (05.06.2025): Erste Veröffentlichung
*/
// Pinbelegung
int TasterPin {8}; // Pin für den Taster
int gruenPin {9}; // Pin für grüne LED
int gelbPin {10}; // Pin für gelbe LED
int rotPin {11}; // Pin für rote LED
bool vorherigePhaseGruen {true}; // Merker, ob vorher grün aktiv war
// Definition der Zustände per Enum
enum AmpelZustand {GRUEN, GELB, ROT};
int Phase {GRUEN}; // Start mit grüner Phase
void setup() {
// Konfiguration der Ein- und Ausgänge
pinMode(TasterPin, INPUT_PULLUP); // Taster als Eingang mit Pullup-Widerstand
pinMode(gruenPin, OUTPUT); // grüne LED als Ausgang
pinMode(gelbPin, OUTPUT); // gelbe LED als Ausgang
pinMode(rotPin, OUTPUT); // rote LED als Ausgang
}
void loop() {
// Steuerung des Ampelablaufs durch Zustandsautomat
switch (Phase) {
case GRUEN:
digitalWrite(gruenPin, HIGH); // grüne LED einschalten
if (digitalRead(TasterPin) == LOW) { // Taster gedrückt?
Phase = GELB; // Wechsel zur gelben Phase
digitalWrite(gruenPin, LOW); // grüne LED ausschalten
vorherigePhaseGruen = true; // merken, dass vorher grün aktiv war
}
break;
case GELB:
digitalWrite(gelbPin, HIGH); // gelbe LED einschalten
delay(1000); // 1 Sekunde warten
digitalWrite(gelbPin, LOW); // gelbe LED ausschalten
if (vorherigePhaseGruen) { // Übergang nach grün?
Phase = ROT; // ... dann rot aktivieren
} else {
Phase = GRUEN; // ... sonst zurück zu grün
}
break;
case ROT:
digitalWrite(rotPin, HIGH); // rote LED einschalten
delay(5000); // 5 Sekunden rot leuchten
digitalWrite(rotPin, LOW); // rote LED ausschalten
vorherigePhaseGruen = false; // merken, dass rot aktiv war
Phase = GELB; // weiter zur gelben Phase
break;
}
}