/*
Titel: Ampelsteuerung mit State Machine
Author: Gregor Mausser
Date: 06.05.2026
*/
int LedPinRotAuto = 13;
int LedPinGelbAuto = 12;
int LedPinGruenAuto = 11;
int LedPinRotFussgaenger = 10;
int LedPinGruenFussgaenger = 9;
int buttonPin = 3;
int SlideSwitchOn = 4;
int SlideSwitchOff = 5;
// Entprellen
const int debounceDelay = 50;
int lastButtonState = HIGH;
unsigned long lastDebounceTime = 0;
// Zustände
enum Mode {
AUS,
GRUEN,
GRUEN_BLINK,
GELB,
ROT,
ROT_GELB
};
Mode state = AUS;
// ----------------------------
//SETUP
void setup() {
Serial.begin(9600);
pinMode(LedPinRotAuto, OUTPUT);
pinMode(LedPinGelbAuto, OUTPUT);
pinMode(LedPinGruenAuto, OUTPUT);
pinMode(LedPinRotFussgaenger, OUTPUT);
pinMode(LedPinGruenFussgaenger, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
pinMode(SlideSwitchOn, INPUT_PULLUP);
pinMode(SlideSwitchOff, INPUT_PULLUP);
}
//---------------------------------------------------------------------
//FUNKTIONEN
//EIN/AUS Steuerung
void checkOnOff() {
if (digitalRead(SlideSwitchOff) == LOW) {
state = AUS;
}
//nur starten wenn aktuell AUS
if (digitalRead(SlideSwitchOn) == LOW && state == AUS) {
state = GRUEN;
}
}
//Button mit Entprellung
void checkButton() {
int reading = digitalRead(buttonPin);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
// nur im GRUEN-Zustand reagieren!
if (reading == LOW && state == GRUEN) {
Serial.println("Button erkannt -> GRUEN_BLINK");
state = GRUEN_BLINK;
}
}
lastButtonState = reading;
}
//Led steuern
void Led_controll_car(int Rot, int Gelb, int Gruen) {
if(Rot == 1) {
digitalWrite(LedPinRotAuto, HIGH);
}
else{
digitalWrite(LedPinRotAuto, LOW);
}
if(Gelb == 1) {
digitalWrite(LedPinGelbAuto, HIGH);
}
else{
digitalWrite(LedPinGelbAuto, LOW);
}
if(Gruen == 1) {
digitalWrite(LedPinGruenAuto, HIGH);
}
else{
digitalWrite(LedPinGruenAuto, LOW);
}
}
//Fußgaengerampel steuern
void Led_controll_Fussgaenger(int red, int green) {
if(red == 1) {
digitalWrite(LedPinRotFussgaenger, HIGH);
}
else{
digitalWrite(LedPinRotFussgaenger, LOW);
}
if(green == 1) {
digitalWrite(LedPinGruenFussgaenger, HIGH);
}
else{
digitalWrite(LedPinGruenFussgaenger, LOW);
}
//-------------------------------------------------------------------------
//LOOP
void loop() {
checkOnOff();
checkButton(); // WICHTIG: immer aufrufen
switch (state) {
case AUS:
Led_controll_Fussgaenger(0, 0);
Led_controll_car(0, 1, 0);
digitalWrite(LedPinGelbAuto, HIGH);
delay(1000);
digitalWrite(LedPinGelbAuto, LOW);
delay(1000);
break;
case GRUEN:
Led_controll_Fussgaenger(1, 0);
Led_controll_car(0, 0, 1);
break;
case GRUEN_BLINK:
Led_controll_Fussgaenger(1, 0);
for (int i = 0; i < 4; i++) {
digitalWrite(LedPinGruenAuto, LOW);
delay(500);
digitalWrite(LedPinGruenAuto, HIGH);
delay(500);
}
Led_controll_car(0, 0, 0);
state = GELB;
break;
case GELB:
Led_controll_Fussgaenger(1, 0);
Led_controll_car(0, 1, 0);
delay(2000);
Led_controll_car(0, 0, 0);
state = ROT;
break;
case ROT:
Led_controll_Fussgaenger(0, 1);
Led_controll_car(1, 0, 0);
delay(5000);
Led_controll_Fussgaenger(0, 0);
state = ROT_GELB;
break;
case ROT_GELB:
Led_controll_Fussgaenger(1, 0);
Led_controll_car(1, 1, 0);
delay(2000);
Led_controll_car(0, 0, 0);
state = GRUEN;
break;
}
// Debug-Ausgabe
Serial.print("State: ");
Serial.println(state);
}