Fußgängerampel mit Anforderungstaste

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.

Ablaufverhalten

  1. Normal: KFZ Grün / Fußgänger Rot

  2. Fußgänger drückt Knopf → Anfrage = gesetzt

  3. Nach einer kurzen Übergangsphase: KFZ Gelb → dann KFZ Rot

  4. Fußgänger Grün (mit Timer) — optional: Blinkendes Grün als Countdown

  5. Fußgänger Rot; KFZ Rot/ Gelb (kurze Zeit) → KFZ Grün

  6. Anfrage zurücksetzen; System wartet auf neue Anforderung

Zustandsmodell (FSM)

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.

Timing-Empfehlungen (anpassbar)

  • 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

Verhalten bei Mehrfachdruck / während Zyklus

  • 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).

Arduino-Sketch

Bauteilliste (BOM)

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Ω

Arduino-Code


// -----------------------------
// 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;
    }
  }
}

Erweiterungsmöglichkeiten

  • 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.



TEILEN

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