
Eine KFZ-Ampel und eine Fußgängerampel sollen gekoppelt arbeiten.
Standardbetrieb: Straße = GRÜN, Fußgänger = ROT.
Drückt ein Fußgänger den Knopf, wird nach einem sicheren Ablauf die KFZ-Ampel ROT und die Fußgängerampel GRÜN.
Danach Rückkehr in den Normalbetrieb.
Optional: Fußgänger-Countdown (blinkendes Grün), Anfrage während laufendem Fußgängerzyklus ignorieren oder puffern.
Normal: KFZ Grün / Fußgänger Rot
Fußgänger drückt Knopf → Anfrage = gesetzt
Nach einer kurzen Übergangsphase: KFZ Gelb → dann KFZ Rot
Fußgänger Grün (mit Timer) — optional: Blinkendes Grün als Countdown
Fußgänger Rot; KFZ Rot/ Gelb (kurze Zeit) → KFZ Grün
Anfrage zurücksetzen; System wartet auf neue Anforderung
Zustände (Beispiel):
KFZ_GRUEN (Normal)
KFZ_GELB (Übergang)
KFZ_ROT (Sicherheitszustand bevor Fußgänger grün wird)
FUSS_GRUEN (Fußgänger darf gehen)
FUSS_BLINK (optional Countdown)
KFZ_ROT_GELB (Vorbereitung auf KFZ Grün)
Tasterdruck und Timer ausgelöst.

KFZ_GRUEN_MIN = 8 s (Mindestdauer KFZ grün)
KFZ_GELB_TIME = 2 s
KFZ_ROT_VOR_PED = 1 s (Sicherheits-Red-Buffer bevor Fußgänger grün)
PED_GRUEN_TIME = 7 s
PED_BLINK_START = 3 s (letzte 3 s blinkendes Grün)
KFZ_ROT_GELB_TIME = 2 s
Wenn Knopf gedrückt wird und System bereits im KFZ_GRUEN ist, wird Anfrage gesetzt.
Während Fußgängerphase (FUSS_GRUEN oder FUSS_BLINK) weitere Knopfdruck ignorieren oder alternativ in Queue legen (erweiterte Variante).

| Bauteil | Anzahl | Beschreibung |
|---|---|---|
| Arduino Uno oder Nano | 1 | Mikrocontroller |
| Breadboard + Kabel | 1 Set | Aufbau & Verbindung |
| Taster | 1 | Schließerkontakt |
| LED, 2 mA | 2 | Low-Current LED, rot |
| LED, 2 mA | 2 | Low-Current LED, gelb |
| LED, 2 mA | 1 | Low-Current LED, grün |
| Widerstand | 5 | 1,5 kΩ |
// -----------------------------
// Ampel mit Fußgängerüberweg (FSM, nicht-blockierend)
// Pins anpassen nach Bedarf
// -----------------------------
enum State { KFZ_GRUEN, KFZ_GELB, KFZ_ROT_BEFORE_PED, FUSS_GRUEN, FUSS_BLINK, KFZ_ROT_GELB };
State state = KFZ_GRUEN;
// Pinzuordnung
const int KFZ_RED = 2;
const int KFZ_YEL = 3;
const int KFZ_GRN = 4;
const int PED_RED = 5;
const int PED_GRN = 6;
const int BUTTON = 7;
const int BUZZER = 8; // optional
// Zeiten (ms)
const unsigned long KFZ_GRUEN_MIN = 8000UL;
const unsigned long KFZ_GELB_TIME = 2000UL;
const unsigned long KFZ_ROT_BEFORE_PED = 1000UL;
const unsigned long PED_GRN_TIME = 7000UL;
const unsigned long PED_BLINK_DURATION = 3000UL; // letzte 3s blinken
const unsigned long KFZ_ROT_GELB_TIME = 2000UL;
// Laufvariablen
unsigned long stateStart = 0;
bool pedRequest = false;
// Entprell
unsigned long lastButtonTime = 0;
const unsigned long debounceDelay = 50UL;
void setup() {
pinMode(KFZ_RED, OUTPUT);
pinMode(KFZ_YEL, OUTPUT);
pinMode(KFZ_GRN, OUTPUT);
pinMode(PED_RED, OUTPUT);
pinMode(PED_GRN, OUTPUT);
pinMode(BUTTON, INPUT_PULLUP);
pinMode(BUZZER, OUTPUT);
digitalWrite(BUZZER, LOW);
setState(KFZ_GRUEN);
}
void loop() {
checkButton();
unsigned long now = millis();
switch(state) {
case KFZ_GRUEN:
// Mindestgrün respektieren; falls Anfrage und Mindestzeit abgelaufen -> Gelb
if (pedRequest && (now - stateStart >= KFZ_GRUEN_MIN)) {
setState(KFZ_GELB);
}
break;
case KFZ_GELB:
if (now - stateStart >= KFZ_GELB_TIME) {
setState(KFZ_RED_BEFORE_PED);
}
break;
case KFZ_RED_BEFORE_PED:
if (now - stateStart >= KFZ_ROT_BEFORE_PED) {
setState(FUSS_GRUEN);
}
break;
case FUSS_GRUEN: {
unsigned long elapsed = now - stateStart;
if (elapsed >= PED_GRN_TIME) {
setState(KFZ_ROT_GELB);
} else if (elapsed >= (PED_GRN_TIME - PED_BLINK_DURATION)) {
// in Blinkphase: we switch to FUSS_BLINK to manage blinking
setState(FUSS_BLINK);
}
break;
}
case FUSS_BLINK: {
unsigned long elapsed = now - stateStart;
if (elapsed >= PED_BLINK_DURATION) {
// Blinken vorbei -> Rückkehr zu KFZ rot/gelb
setState(KFZ_ROT_GELB);
} else {
// Blinklogik: blinke die Fußgängergrün-LED
// Wir implementieren sichtbar blinkendes Verhalten via millis
unsigned long t = now % 500; // 500ms period
digitalWrite(PED_GRN, (t < 250) ? HIGH : LOW); //50% Duty
}
break;
}
case KFZ_ROT_GELB:
if (now - stateStart >= KFZ_ROT_GELB_TIME) {
// zurück zu grün
pedRequest = false; // Anfrage verarbeiten
setState(KFZ_GRUEN);
}
break;
}
}
// Hilfsfunktionen
void setState(State s) {
state = s;
stateStart = millis();
// Alle LEDs standardmäßig ausschalten vor Setzen
digitalWrite(KFZ_RED, LOW);
digitalWrite(KFZ_YEL, LOW);
digitalWrite(KFZ_GRN, LOW);
digitalWrite(PED_RED, LOW);
digitalWrite(PED_GRN, LOW);
digitalWrite(BUZZER, LOW);
switch(s) {
case KFZ_GRUEN:
digitalWrite(KFZ_GRN, HIGH);
digitalWrite(PED_RED, HIGH);
break;
case KFZ_GELB:
digitalWrite(KFZ_YEL, HIGH);
digitalWrite(PED_RED, HIGH);
break;
case KFZ_RED_BEFORE_PED:
digitalWrite(KFZ_RED, HIGH);
digitalWrite(PED_RED, HIGH);
break;
case FUSS_GRUEN:
digitalWrite(KFZ_RED, HIGH);
digitalWrite(PED_GRN, HIGH);
break;
case FUSS_BLINK:
digitalWrite(KFZ_RED, HIGH);
// PED_GRN will be blinked in loop
break;
case KFZ_ROT_GELB:
digitalWrite(KFZ_RED, HIGH);
digitalWrite(KFZ_YEL, HIGH);
digitalWrite(PED_RED, HIGH);
break;
}
}
// Button mit Entprellung prüfen
void checkButton() {
int raw = digitalRead(BUTTON); // INPUT_PULLUP => LOW = gedrückt
unsigned long now = millis();
if (raw == LOW) {
if (now - lastButtonTime > debounceDelay) {
// Taste erkannt
pedRequest = true;
// optional: akustisches Signal
tone(BUZZER, 1000, 100);
lastButtonTime = now;
}
}
}
Queue: mehrere Anfragen speichern (z. B. wenn mehrere Kreuzungen gekoppelt werden).
Tageszeitbetrieb: nachts auf Blinkbetrieb (KFZ Gelb blinkend) umrüsten.
Optische/ Countdown LED oder 7-Segment-Anzeige für Fußgänger-Countdown.
Sensorintegration: Verkehrsaufkommen per Ultraschall oder IR erkennen → adaptives Timing.
Netzwerk: mehrere Ampeln synchronisieren (I²C/RS485).
Sicherheitsfeatures: Überwachung von Endlagen, Not-Stopp.
Jetzt herunterladen.
Lade mein Freebie - "Die 10 wichtigsten Konzepte, die du wirklich verstehen musst" hier herunter.
ÜBER MICH
Ich möchte dich durch inspirierende Projekte und nützliche Anleitungen unterstützen, um deine digitalen Fähigkeiten zu verbessern und selbstbewusst in die Welt der Elektronik einzutauchen.
Erstellt mit © systeme.io • Datenschutzerklärung • AGB