Feux de circulation Funduino

FunduinoDernière mise à jour le

Ampelphasen und Fußgängeranforderung mit dem Arduino MEGA programmieren

Mit der Arduino-kompatiblen Ampelkreuzung simulierst du Verkehrsflüsse an Kreuzungen durch individuelle Programmierung von Ampelsequenzen. Ideal für Bildungszwecke, Hobbyprojekte oder technische Demonstrationsmodelle.

In dieser Anleitung erläutern wir zunächst die Grundlagen der Ampelfunktion sowie die Rolle und Funktionsweise eines lichtabhängigen Widerstands (LDR). Im weiteren Verlauf zeigen wir anhand eines praktischen Beispiels, wie du eine solche Kreuzung realitätsnah programmierst.

Funduino Ampelkreuzung mit aufgesteckten Ampeln

Aufbau und Ausstattung der Kreuzung

Flexible Ampelkonfiguration: Die Grundplatte bietet Platz für bis zu sechs einzelne Ampeln, die jeweils über drei Farben (Rot, Gelb, Grün) für die Straßenverkehrssteuerung verfügen. Zusätzlich ist jede Ampel mit einer roten und grünen Fußgängerampel ausgestattet, die nach links oder rechts ausgerichtet werden kann.

Steuerung durch den Arduino MEGA: Der integrierte Arduino MEGA Mikrocontroller mit seinen 54 digitalen I/O-Ports und 16 analogen Eingängen bietet ausreichend Kapazitäten, um eine Vielzahl von LEDs anzusteuern und komplexe Ampelschaltungen zu programmieren.

Interaktive Sensoren: In jede Fahrbahn ist ein Fotowiderstand eingebaut, der erkennen kann, ob Fahrzeuge vor der Ampel warten. Das ermöglicht eine adaptive Verkehrssteuerung, die auf realen Verkehrsbedingungen basiert, einschließlich der Überwachung von Verkehrsstaus.

Fahrbahnen: Die Funduino-Kreuzung verbindet eine zweispurige mit einer dreispurigen Straße. Auf der zweispurigen Straße können Fahrzeuge entweder geradeaus fahren oder nach rechts abbiegen, während auf der dreispurigen Straße Abbiegungen nach links und rechts möglich sind. Diese Kreuzung lässt sich nahtlos mit den Funduino-Straßenaufklebern erweitern, um mehrere Ampelsysteme miteinander zu koppeln.

Vorbereitung

Zunächst steckst du den Arduino MEGA Mikrocontroller auf den dafür vorgesehenen Steckplatz auf der Ampelkreuzung und montierst die einzelnen Ampeln. Nebeneinanderstehende Ampeln kannst du mit einem Kunststoffclip verbinden, um eine höhere Stabilität zu erreichen.

Achte beim Aufstecken des Mikrocontrollers darauf, dass die Grundplatte flach auf einer Unterlage aufliegt, damit sich die Platine nicht zu stark durchbiegt und ggf. beschädigt wird.

Arduino MEGA auf dem Steckplatz der Ampelkreuzung
Grundplatte flach auflegen, damit sich die Platine nicht durchbiegt
1 / 2

Die LDR-Sensoren in der Fahrbahn

Die LDR-Sensoren (Fotowiderstände) ändern ihren Widerstand in Abhängigkeit von der Lichtintensität, die auf den Sensor fällt. Dieser Widerstand ist umso geringer, je mehr Licht einfällt, wodurch mehr Strom durchfließen kann. Mit Hilfe eines zweiten Widerstands ergibt sich aus technischer Sicht ein Spannungsteiler. Die Spannung des Sensors wird dann vom Mikrocontroller ausgewertet, der so prüfen kann, ob sich auf dem Sensor ein Fahrzeug befindet, welches den Sensor verschattet.

LDR-Sensor (Fotowiderstand) in der Fahrbahn

Beschriftung der Ampelsockel

Jeder Ampelsockel ist detailliert beschriftet. Auf der einen Seite ist zu sehen, an welchem digitalen Pin des Mikrocontrollers der entsprechende Kontakt angeschlossen ist. Auf der anderen Seite ist zu sehen, um welche LED bzw. welchen Taster es sich bei der entsprechenden Ampel handelt.

Beschriftung eines Ampelsockels mit Pin-Nummern

Eine einzelne LED programmieren

Aufgabenstellung: Die rote Leuchtdiode einer Ampel soll blinken.

Wir stecken eine Ampel auf den Steckplatz, der sich genau neben dem MEGA-Mikrocontroller befindet. Hier werden die digitalen Pins 34, 35, 36, 37, 38 und 39 verwendet.

  • Pin 34 – LED für Ampelfarbe Grün
  • Pin 35 – LED für Ampelfarbe Gelb
  • Pin 36 – LED für Ampelfarbe Rot
  • Pin 37 – Kontakt für den Taster
  • Pin 38 – LED für Fußgängerampel Rot
  • Pin 39 – LED für Fußgängerampel Grün

Für diese Aufgabe benötigen wir nur einen Pin des Mikrocontrollerboards, den Pin 36. Denn an Pin 36 sitzt die LED für die rote Ampelfarbe. An Pin 36 soll eine Spannung ausgegeben werden, denn die LED soll schließlich leuchten. Daher muss im Setup angegeben werden, dass es sich bei Pin 36 um einen Ausgang handelt.

Die Erklärungen hinter dem doppelten Schrägstrich „//“ dürfen mit in die Arduinosoftware eingegeben werden, haben jedoch keinen Einfluss auf den Ablauf des Sketches. Das sogenannte Auskommentieren ist beim Programmieren sehr sinnvoll, um für sich selber Informationen zum Programm zu hinterlassen.

Der Sketch in der Arduinosoftware, Upload-Schaltfläche oben links
Rote LED blinken lassen
void setup()     //Hier beginnt das Setup.
{        //Hier beginnt ein Programmabschnitt.
pinMode(36, OUTPUT); //Pin 36 soll ein Ausgang sein.
}        //Hier ist ein Programmabschnitt beendet.
void loop()      //Hier beginnt das Hauptprogramm.
{         //Hier beginnt ein Programmabschnitt.
digitalWrite(36, HIGH);//Schalte die Spannung an Pin36 ein (LED an).
delay(1000);      //Warte 1000 Millisekunden (eine Sekunde).
digitalWrite(36, LOW);//Schalte die Spannung an Pin36 aus (LED aus).
delay(1000);      //Warte 1000 Millisekunden (eine Sekunde).
}              //Programmabschnitt beendet.

Variante: die LED schneller blinken lassen

Nach der letzten geschweiften Klammer im Loop-Teil ist der Sketch abgeschlossen. Wenn der Sketch innerhalb des „Loop“ bis zur letzten Klammer abgearbeitet wurde, beginnt er wieder vorne im Loop-Teil. Dadurch geht die LED immer wieder an und aus.

Das Programm kannst du jetzt noch variieren. Beispiel: Die LED soll schneller blinken. Dazu verkürzen wir die Wartezeiten (delay) von 1000 Millisekunden auf 200 Millisekunden.

Variante: schneller blinken (200 Millisekunden)
void setup()        //Hier beginnt das Setup
{           //Hier beginnt ein Programmabschnitt.
pinMode(36, OUTPUT);    //Pin 13 soll ein Ausgang sein.
}           //Hier ist ein Programmabschnitt beendet.
void loop()         //Hier beginnt das Hauptprogramm
{           //Programmabschnitt beginnt.
digitalWrite(36, HIGH); //Schalte die Spannung an Pin36 ein (LED an).
delay(200);         //Warte 200 Millisekunden
digitalWrite(36, LOW); //Schalte die Spannung an Pin36 aus (LED aus).
delay(200);       //Warte 200 Millisekunden
}         //Programmabschnitt beendet.

Aufgabe 2 – Der Wechselblinker

Aufgabe: Zwei Leuchtdioden sollen abwechselnd blinken. Dabei kannst du Blinkgeschwindigkeit und Blinkrhythmus variieren. Für diese Aufgabe verwenden wir die rote und die grüne LED der Ampel. Daher benötigen wir neben Pin 36 nun auch Pin 34, da hier die grüne LED angeschlossen ist.

Je kürzer das „delay“ gewählt wird, desto schneller ist der Blinkrhythmus. Der Rhythmus kann dabei so schnell eingestellt werden, dass das menschliche Auge den Wechsel der Leucht- und Ruhephasen nicht mehr erkennen kann. Mit diesem Sketch kannst du zum Beispiel die Blinkfolge von Feuerwehr- und Polizeiwagen nachbauen oder eine Ampel an einer Bahnschranke. Für eine Ampelkreuzung wird ein Blinken nur dann benötigt, wenn die Anlage ausfällt und alle gelben Ampelfarben blinken sollen. Ist das eine Aufgabe, die du lösen kannst?

Der Wechselblinker
void setup()
{     //Wir starten mit dem Setup
pinMode(36, OUTPUT);  //Pin 36 ist ein Ausgang.
pinMode(34, OUTPUT);  //Pin 34 ist ein Ausgang.
}
void loop()
{       //Das Hauptprogramm beginnt.
digitalWrite(36, HIGH); //Schalte die LED an Pin36 an.
delay(1000);           //Warte 1000 Millisekunden.
digitalWrite(36, LOW);  //Schalte die LED an Pin36 aus.
digitalWrite(34, HIGH); //Schalte die LED an Pin34 ein.
delay(1000);           //Warte 1000 Millisekunden.
digitalWrite(34, LOW);  //Schalte die LED an Pin34 aus.
}       //Hier am Ende springt das Programm an den Start des Loop-Teils. Also: schalte die LED an Pin36 an… usw…

Spannung am Fotowiderstand auslesen

Der Mikrocontroller soll über einen Fotowiderstand auslesen, wie hell es ist. Dazu nutzt man ein einfaches physikalisches Prinzip: Wenn in einem Stromkreis zwei Verbraucher hintereinander angeschlossen sind (Reihenschaltung), dann „teilt“ sich auch die gemeinsam anliegende Spannung. Ein Beispiel: Zwei gleiche Lampen sind in Reihe geschaltet und es wird eine Spannung von 6 Volt angelegt. Dann liegen an den Lampen jeweils nur 3 Volt an. Wenn zwei ungleiche Lampen angeschlossen werden, misst man zwei unterschiedliche Spannungen, bspw. 1,5 Volt und 4,5 Volt.

Ein Fotowiderstand ändert seinen Widerstand in Abhängigkeit der Lichtstärke. Diesen Effekt nutzt man, um anhand der anliegenden Spannung einen Wert für Helligkeit bzw. Dunkelheit abzulesen. Damit überhaupt eine Spannungsteilung entsteht, schließt man den Fotowiderstand und einen Widerstand (1 – 10 kOhm, je nach verwendetem Fotowiderstand; der Widerstand sollte einen ähnlichen Widerstandswert wie der Fotowiderstand haben) in Reihe an und verbindet sie mit 5 Volt und der Erdung (Ground / GND).

Das Mikrocontroller-Board auf der Kreuzung kann analoge Signale messen und verarbeiten. Es wandelt den gemessenen Spannungswert in eine Zahl um: 0 Volt entspricht dem Wert 0, der höchste Messwert bei 5 Volt entspricht dem Wert 1023 (0 bis 1023 entspricht 1024 Zahlen = 10 Bit). Beispiel: Wird eine Spannung von 2,5 Volt gemessen, liefert der Mikrocontroller den Wert 512.

Der Serielle Monitor

Der „Serielle Monitor“ ist ein wichtiger Bestandteil der Arduino-Software. Mit ihm kannst du dir am PC Daten und Werte anzeigen lassen, die das Mikrocontroller-Board an den PC sendet. Das ist sinnvoll, da nicht immer ein LCD-Display am Mikrocontroller angeschlossen ist, auf dem man Werte ablesen könnte.

In diesem Sketch wird der Serielle Monitor verwendet, um die Werte anzuzeigen, die das Board vom Fotowiderstand einliest. Angenommen, die LED soll erst bei beginnender Dunkelheit leuchten. Dann muss es im Sketch einen Bereich geben mit der Funktion: „Wenn der Wert des Fotowiderstandes den Wert x unterschreitet, dann soll die LED leuchten“. Dazu musst du wissen, wie groß der Wert x bei beginnender Dämmerung ist.

Im konkreten Beispiel unserer Ampelkreuzung kannst du diesen Wert verwenden, um in der Software festzulegen, ob sich ein Fahrzeug über dem Sensor befindet oder nicht.

Den Fotowiderstand programmieren

Für das folgende Programm lesen wir den Messwert des „Sensor 1“ aus. Dieser Sensor befindet sich genau neben dem MEGA-Mikrocontroller.

Im weiteren Verlauf der Kreuzungsprogrammierung verwendest du den gleichen Code, um Entscheidungen in Abhängigkeit des Sensorwertes zu treffen.

Fotowiderstand auslesen und LED schalten
int eingang=A0; //Das Wort „eingang“ steht jetzt für den Wert „A0“ (Bezeichnung vom Analogport 0)
int LED=36;   //Das Wort „LED“ steht jetzt für den Wert 36. Hier wird also die Rote LED an der Ampel angesteuert, die sich genau neben dem Mikrocontroller befindet.
int sensorwert=0; //Variable für den Sensorwert mit 0 als Startwert
void setup()    //Hier beginnt das Setup.
{
Serial.begin(9600); //Die Kommunikation mit dem Seriellen Port wird gestartet, um den Wert des Sensors im Seriellen Monitor darzustellen.
pinMode (LED,OUTPUT);//Der Pin mit der LED (Pin 36) ist jetzt ein Ausgang
}
void loop()
{ //Mit dieser Klammer wird der Loop-Teil geöffnet.
sensorwert=analogRead(eingang); //Die Spannung an dem Fotowiderstand auslesen und unter der Variable „sensorWert“ abspeichern.
Serial.println("Sensorwert=");  //Der Befehl „Seriel.print“ erzeugt eine Ausgabe am Seriellen Monitor.: Das Wort „Sensorwert:”
Serial.println(sensorwert); // Ausgabe am Seriellen Monitor. Mit dem Befehl „Serial.println“ wird der Sensorwert des Fotowiderstandes in Form einer Zahl zwischen 0 und 1023 an den Seriellen Monitor gesendet. Durch die Erweiterung um die beiden Buchstaben „LN“ wird aus dem Befehl „Seriel.println“. Dadurch wird bei der Ausgabe am Seriellen Monitor ein Seitenumbruch erzeugt und die Messwerte sind leichter ablesbar
if(sensorwert < 512)     //Wenn der Sensorwert unter dem Wert 512 liegt….
{
digitalWrite(LED,HIGH); //…soll die LED leuchten…
}
else        //…andernfalls
{
digitalWrite(LED,LOW);  //…soll sie nicht leuchten
}
delay(50);//Eine kurze Pause, in der die LED an oder aus ist
} //Mit dieser letzten Klammer wird der Loop-Teil geschlossen.
//Wenn nun der Sensorwert bei normaler Helligkeit bspw. nur den Wert 100 hat (der Wert ist abhängig von den verwendeten Widerständen, von der Helligkeit und von der Stromrichtung), dann nimmt man anstelle des Wertes 512 einen wesentlich kleineren Wert, bei dem die LED zu leuchten beginnen soll. Bspw. nimmt man dann den Wert 90. Den aktuellen Sensorwert kann man sich nun mithilfe des Seriellen Monitor anzeigen lassen. Dazu klickt man oben auf „Werkzeuge“ und anschließend auf „Serieller Monitor“
Schema: Entscheidung anhand des Sensorwertes
if(sensorwert < 512)     //Wenn der Sensorwert unter dem Wert 512 liegt….
{
Passiert Option1 (Zum Beispiel die Ampel für die Fahrzeuge bleibt auf Grün)
}
else        //…andernfalls
{
passiert Option2  (Zum Beispiel die Ampel für die Fahrzeuge wechselt zu Rot)
}

Eine Ampel programmieren

Bei diesem Projekt beginnen wir mit der Programmierung der ersten Ampel. Wir verwenden dafür einen anderen Steckplatz: den Steckplatz mit den digitalen Pins 4, 5, 6, 7, 8 und 9.

  • Pin 4 – LED für Ampelfarbe Grün
  • Pin 5 – LED für Ampelfarbe Gelb
  • Pin 6 – LED für Ampelfarbe Rot
  • Pin 7 – Kontakt für den Taster
  • Pin 8 – LED für Fußgängerampel Rot
  • Pin 9 – LED für Fußgängerampel Grün

Im Setup legen wir fest, dass die Pins, an denen die LEDs angeschlossen sind, als OUTPUTS konfiguriert sind. Das bedeutet, dass sie Signale aussenden. Der Pin, an dem sich die Taste befindet, ist als INPUT eingestellt und hat einen sogenannten PULLUP-Widerstand. Ein PULLUP-Widerstand sorgt dafür, dass die Spannung an diesem Pin standardmäßig hoch ist. Wird die Taste gedrückt, fällt die Spannung auf LOW. Um zu prüfen, ob die Taste gedrückt wurde, suchen wir also nicht nach einem HIGH-, sondern nach einem LOW-Signal.

Schritt 3.1: Die Pins definieren
#define AMPEL_1_GRUEN 4
#define AMPEL_1_GELB 5
#define AMPEL_1_ROT 6
#define AMPEL_1_KNOPF 7
#define AMPEL_1_FUSSGAENGER_ROT 8
#define AMPEL_1_FUSSGAENGER_GRUEN 9
//Damit haben wir die Pins der ersten Ampel definiert.
Schritt 3.2: Das Setup
void setup()
{
// LEDS
pinMode(AMPEL_1_GRUEN, OUTPUT);
pinMode(AMPEL_1_GELB, OUTPUT);
pinMode(AMPEL_1_ROT, OUTPUT);
pinMode(AMPEL_1_FUSSGAENGER_ROT, OUTPUT);
pinMode(AMPEL_1_FUSSGAENGER_GRUEN, OUTPUT);
// KNOPF
pinMode(AMPEL_1_KNOPF, INPUT_PULLUP);
}

Der Ampel-Loop: die Phasen schalten

Hier beginnen wir mit der Initialisierung der Ampel und schalten alle LEDs aus, außer der roten Fußgängerampel und der grünen Autoampel. Diese müssen aktiviert werden.

Dann warten wir 5 Sekunden und schalten die Autoampel von Grün auf Gelb, um zu signalisieren, dass die Ampel gleich auf Rot umschaltet. Fünf Sekunden später wechselt die Ampel von Gelb auf Rot. Gleichzeitig schaltet die Fußgängerampel von Rot auf Grün. Wir warten weitere 5 Sekunden. Diese Zeit kannst du anpassen, zum Beispiel um Fußgängern mehr Zeit zu geben. Dann schalten wir Gelb, um den Autofahrern zu signalisieren, dass sie bald losfahren können. Außerdem schalten wir die Fußgängerampel von Grün auf Rot. Nach weiteren 5 Sekunden können die Autofahrer wieder fahren.

Die verwendeten Zeiten sind natürlich ausgedacht und haben mit der Realität nichts zu tun. Finde heraus, wie lange die einzelnen Ampelphasen dauern, und programmiere deine Ampel mit realistischen Werten!

Solltest du schon alle Ampeln auf der Kreuzung platziert haben, hast du vielleicht gemerkt, dass weitere Ampeln leuchten. Die Pins 20 und 21 führen standardmäßig eine Spannung von etwa 3,3 V und sind normalerweise zur Signalübertragung vorgesehen. Das Setzen dieser Pins auf LOW verhindert zufällige Signale, die beispielsweise dazu führen könnten, dass die Fußgängerampel an Ampel 3 ungewollt aufleuchtet.

Der Loop einer einzelnen Ampel
void loop()
{
// Stelle jede LED auf aus, auser AMPEL_1_FUSSGAENGER_ROT
// und AMPEL_1_GRUEN. Diese sollen an sein.
digitalWrite(AMPEL_1_GRUEN , HIGH);
digitalWrite(AMPEL_1_FUSSGAENGER_ROT, HIGH);
digitalWrite(AMPEL_1_GELB, LOW);
digitalWrite(AMPEL_1_ROT, LOW);
digitalWrite(AMPEL_1_FUSSGAENGER_GRUEN, LOW);
// warten
delay(5000);
// Gehe von Gruen auf Gelb.
digitalWrite(AMPEL_1_GRUEN , LOW);
digitalWrite(AMPEL_1_GELB, HIGH);
// warten
delay(5000);
// Gehe von Gelb auf Rot und setze die Rote Fußgänger
// LED auf die Grüne Fußgänger-LED.
digitalWrite(AMPEL_1_GELB, LOW);
digitalWrite(AMPEL_1_ROT, HIGH);
digitalWrite(AMPEL_1_FUSSGAENGER_ROT, LOW);
digitalWrite(AMPEL_1_FUSSGAENGER_GRUEN, HIGH);
// warten
delay(5000);
// Rot aktivieren und von Fußgänger grün wieder auf Rot wechseln.
digitalWrite(AMPEL_1_GELB, HIGH);
digitalWrite(AMPEL_1_FUSSGAENGER_ROT, HIGH);
digitalWrite(AMPEL_1_FUSSGAENGER_GRUEN, LOW);
delay(5000);
}

Mehrere Ampeln gleichzeitig steuern

Hier ist ein konkreteres Beispiel, bei dem wir 4 Ampeln verwenden. Wenn eine Taste gedrückt wird, sollen die Fußgängerampeln nach einer kurzen Zeit auf Grün umschalten.

Um den Sketch kürzer zu halten, werden im folgenden Beispiel Strukturen verwendet, sogenannte „struct“. Aus dieser Struktur heraus wird für jede Ampel ein Objekt erstellt. Die Grundlagen zu den Themen Listen (Arrays) und Strukturen werden hier nicht vertieft. Es handelt sich nur um eine von vielen Möglichkeiten, einen Sketch zu komprimieren.

Wir beginnen wieder mit einer roten Ampel für alle Fußgänger. Außerdem sieht eine Fahrtrichtung die grüne Ampel und die kreuzende Fahrtrichtung eine rote Ampel. Dann prüfen wir, ob einer der Knöpfe gedrückt wurde. Wenn ein Knopf von Fußgängern gedrückt wurde, schalten die Ampeln aller Fahrbahnen langsam auf Rot. Danach bekommen alle Fußgänger ein grünes Signal. Nach einer gewissen Zeit bekommen die Fußgänger wieder Rot und die Fahrzeuge in eine Fahrtrichtung das grüne Licht.

Übersicht: Lage der vier Ampeln auf der Kreuzung
Schritt 1: Definition der Struktur "Ampel"
// Schritt 1: Definition der Struktur "Ampel"
struct Ampel
{
int Rot; // Pin für Auto-Rot
int Gelb; // Pin für Auto-Gelb
int Gruen; // Pin für Auto-Grün
int pedestrain_Rot; // Pin für Fußgänger-Rot
int pedestrain_Gruen; // Pin für Fußgänger-Grün
int pedestrain_Knopf; // Pin für Fußgänger-Button
};
Schritt 2: Ampeln für die vier Richtungen anlegen
// Schritt 2: Initialisierung von Ampeln für verschiedene Richtungen
Ampel Seite_1_geradeaus = {6, 5, 4, 8, 9, 7};
Ampel Seite_4_geradeaus = {36, 35, 34, 38, 39, 37};
Ampel Seite_2_geradeaus = {18, 17, 16, 20, 21, 19};
Ampel Seite_3_geradeaus = {24, 23, 22, 26, 27, 25};
Der vollständige Sketch für vier Ampeln
#include <Arduino.h>
// Schritt 1: Definition der Struktur "Ampel"
struct Ampel
{
    int Rot;              // Pin für Auto-Rot
    int Gelb;             // Pin für Auto-Gelb
    int Gruen;            // Pin für Auto-Grün
    int pedestrain_Rot;   // Pin für Fußgänger-Rot
    int pedestrain_Gruen; // Pin für Fußgänger-Grün
    int pedestrain_Knopf; // Pin für Fußgänger-Button
};
// Schritt 2: Initialisierung von Verkehrslichtern für verschiedene Richtungen
Ampel AMPEL_1 = {6, 5, 4, 8, 9, 7};
Ampel AMPEL_2 = {18, 17, 16, 20, 21, 19};
Ampel AMPEL_3 = {24, 23, 22, 26, 27, 25};
Ampel AMPEL_4 = {36, 35, 34, 38, 39, 37};
// Schritt 3: Initialisierung der Pins im Setup
void setup()
{
    Serial.begin(9600);
    // Ampel 1
    pinMode(AMPEL_1.Rot, OUTPUT);
    pinMode(AMPEL_1.Gelb, OUTPUT);
    pinMode(AMPEL_1.Gruen, OUTPUT);
    pinMode(AMPEL_1.pedestrain_Rot, OUTPUT);
    pinMode(AMPEL_1.pedestrain_Gruen, OUTPUT);
    pinMode(AMPEL_1.pedestrain_Knopf, INPUT_PULLUP);
    // Ampel 2
    pinMode(AMPEL_2.Rot, OUTPUT);
    pinMode(AMPEL_2.Gelb, OUTPUT);
    pinMode(AMPEL_2.Gruen, OUTPUT);
    pinMode(AMPEL_2.pedestrain_Rot, OUTPUT);
    pinMode(AMPEL_2.pedestrain_Gruen, OUTPUT);
    pinMode(AMPEL_2.pedestrain_Knopf, INPUT_PULLUP);
    // Ampel 2
    pinMode(AMPEL_3.Rot, OUTPUT);
    pinMode(AMPEL_3.Gelb, OUTPUT);
    pinMode(AMPEL_3.Gruen, OUTPUT);
    pinMode(AMPEL_3.pedestrain_Rot, OUTPUT);
    pinMode(AMPEL_3.pedestrain_Gruen, OUTPUT);
    pinMode(AMPEL_3.pedestrain_Knopf, INPUT_PULLUP);
    // Ampel 2
    pinMode(AMPEL_4.Rot, OUTPUT);
    pinMode(AMPEL_4.Gelb, OUTPUT);
    pinMode(AMPEL_4.Gruen, OUTPUT);
    pinMode(AMPEL_4.pedestrain_Rot, OUTPUT);
    pinMode(AMPEL_4.pedestrain_Gruen, OUTPUT);
    pinMode(AMPEL_4.pedestrain_Knopf, INPUT_PULLUP);
}
// Schritt 5: Hauptverkehrslichtsteuerung und Fußgängerübergangserkennung
void loop()
{
    // Geradeaus-Ampeln auf Grün setzen
    digitalWrite(AMPEL_1.Gruen, HIGH);
    digitalWrite(AMPEL_3.Gruen, HIGH);
    // Andere Geradeaus-Ampeln auf Rot setzen
    digitalWrite(AMPEL_1.Rot, LOW);
    digitalWrite(AMPEL_3.Rot, LOW);
    digitalWrite(AMPEL_1.Gelb, LOW);
    digitalWrite(AMPEL_3.Gelb, LOW);
    // Fußgänger-Ampeln auf Rot setzen
    digitalWrite(AMPEL_4.pedestrain_Rot, HIGH);
    digitalWrite(AMPEL_1.pedestrain_Rot, HIGH);
    digitalWrite(AMPEL_2.pedestrain_Rot, HIGH);
    digitalWrite(AMPEL_3.pedestrain_Rot, HIGH);
    digitalWrite(AMPEL_4.pedestrain_Gruen, LOW);
    digitalWrite(AMPEL_1.pedestrain_Gruen, LOW);
    digitalWrite(AMPEL_2.pedestrain_Gruen, LOW);
    digitalWrite(AMPEL_3.pedestrain_Gruen, LOW);
    // Überprüfen, ob Fußgänger-Button gedrückt wurde
    if (digitalRead(AMPEL_4.pedestrain_Knopf) == LOW ||
        digitalRead(AMPEL_1.pedestrain_Knopf) == LOW ||
        digitalRead(AMPEL_2.pedestrain_Knopf) == LOW ||
        digitalRead(AMPEL_3.pedestrain_Knopf) == LOW)
    {
        // Warte 2 Sekunden
        delay(2000);
        // Geradeaus-Ampeln auf Gelb schalten und dann auf Rot
        digitalWrite(AMPEL_1.Gruen, LOW);
        digitalWrite(AMPEL_3.Gruen, LOW);
        digitalWrite(AMPEL_1.Gelb, HIGH);
        digitalWrite(AMPEL_3.Gelb, HIGH);
        // Warte 1 Sekunden
        delay(1000);
        digitalWrite(AMPEL_1.Gelb, LOW);
        digitalWrite(AMPEL_3.Gelb, LOW);
        digitalWrite(AMPEL_1.Rot, HIGH);
        digitalWrite(AMPEL_3.Rot, HIGH);
        // Warte 2 Sekunden
        delay(2000);
        // Fußgänger-Ampeln auf Grün setzen
        digitalWrite(AMPEL_4.pedestrain_Gruen, HIGH);
        digitalWrite(AMPEL_1.pedestrain_Gruen, HIGH);
        digitalWrite(AMPEL_2.pedestrain_Gruen, HIGH);
        digitalWrite(AMPEL_3.pedestrain_Gruen, HIGH);
        digitalWrite(AMPEL_4.pedestrain_Rot, LOW);
        digitalWrite(AMPEL_1.pedestrain_Rot, LOW);
        digitalWrite(AMPEL_2.pedestrain_Rot, LOW);
        digitalWrite(AMPEL_3.pedestrain_Rot, LOW);
        // Warte 5 Sekunden
        delay(5000);
        // Fußgänger-Ampeln auf Rot setzen
        digitalWrite(AMPEL_4.pedestrain_Gruen, LOW);
        digitalWrite(AMPEL_1.pedestrain_Gruen, LOW);
        digitalWrite(AMPEL_2.pedestrain_Gruen, LOW);
        digitalWrite(AMPEL_3.pedestrain_Gruen, LOW);
        digitalWrite(AMPEL_4.pedestrain_Rot, HIGH);
        digitalWrite(AMPEL_1.pedestrain_Rot, HIGH);
        digitalWrite(AMPEL_2.pedestrain_Rot, HIGH);
        digitalWrite(AMPEL_3.pedestrain_Rot, HIGH);
        // Warte 2 Sekunden
        delay(2000);
        // Geradeaus-Ampeln auf Gelb schalten
        digitalWrite(AMPEL_1.Gelb, HIGH);
        digitalWrite(AMPEL_3.Gelb, HIGH);
        // Rote Ampeln ausschalten
        digitalWrite(AMPEL_1.Rot, HIGH);
        digitalWrite(AMPEL_3.Rot, HIGH);
        delay(1000);
    }
}
Évaluer le guide

Commentaires

Poser une question ou partager une expérience

Écris-nous si quelque chose ne fonctionne pas. Indique-nous ton modèle de carte et le message d’erreur.

Nous vérifions chaque commentaire avant sa publication. Ton adresse e-mail reste chez nous.