Ampelschaltung mit Arduino – Ein einfaches Bastelprojekt für kleine (und große) Arduino-Einsteiger:
Als mein Junior seine ersten Gehversuche mit dem Arduino Uno unternahm, konnte er für das mit der Arduino-IDE gelieferte Codebeispiel ‚Blink‘ nur mäßige Begeisterung entwickeln. Da ihm die simple Aufgabe, eine LED an- und wieder auszuschalten, zu langweilig war, habe ich die Aufgabenstellung für ihn etwas erweitert und in ein spannenderes Szenario übertragen: Eine Ampelschaltung für eine Auto-/Fußgängerampel, die sich auch prima in ein Modell für die eigenen Spielzeugautos einbauen lässt.
Aufgabenstellung:
Es soll eine Ampelschaltung mit einer Auto- und einer Fußgängerampel nachgebildet werden. An der Fußgängerampel befindet sich ein Knopf, der die Umschaltung der Ampelphase auslöst.
Materialliste:
Stückzahl | Bauteil Typ | Eigenschaften |
---|---|---|
1 | Arduino Uno (Rev3) | Typ Arduino UNO (Rev3) |
2 | LED rot | Farbe Rot (633nm), 5 mm |
1 | LED gelb | Farbe Gelb (595nm), 5 mm |
2 | LED grün | Farbe Grün (555nm), 5 mm |
1 | LED blau | Farbe Blau (525nm), 5 mm |
6 | 220Ω Widerstand | Toleranz ±5%, 4-Band, Widerstand 220Ω, Beinchenabstand 400 Millimeter |
1 | Pushbutton |
Der Aufbau der Bauteile auf dem Breadboard:

Aufbauskizze
Der Code im Detail:
In den Zeilen 2-4 werden die Integer-Variablen initialisiert, welche die Pin-Belegungen für die LEDs der KFZ-Ampel beinhalten. Eine entsprechend eindeutige Benamung erleichtert die Zuordnung der LED-Funktionen im weiteren Programmverlauf.
Das gleiche Prozedere wiederholt sich in den Zeilen 7 u. 8 für die LEDs der Fußgängerampel, und selbstverständlich müssen auch noch die Pins von Taster und dessen Aktions-LED in Variablen gepackt werden.
Ab Zeile 14 wird dann die Setup-Funktion abgearbeitet. Das geschieht beim Programmstart genau ein Mal. Hier zeigt sich auch, warum es sinnvoll ist, die Pin-Nummern in Variablen zu packen: Zwar könnte man die Pin-Nummern auch direkt bei der Einstellung des Pin-Modus übergeben, aber wer wüsste bei ‚pinMode(12, OUTPUT)‘ und all den Pins wirklich auf Anhieb, welche LED hier gemeint ist.
Interessant ist in der Funktion Zeile 22. Da der Arduino Uno intern über einen PullUp-Widerstand verfügt, muss dieser nicht in der Schaltung eingebaut werden. Stattdessen wird die Software-seitige Nutzung mit dieser Programmzeile angemeldet.
Ab Zeile 26 geht es dann im Loop-Block, der bis zum Abbruch in einer Endlos-Schleife ausgeführt wird, an die eigentliche Realisierung der einzelnen Signalphasen. Der Grundzustand der Anlage gibt freie Fahrt für die Autos und Rotlicht für die Fußgänger.
In Zeile 36 wird dann der Zustand des Tasters der Fußgängerampel abgefragt. Wurde der Taster betätigt, beginnt die blaue Aktions-LED der Fußgängerampel 5 mal zu blinken um anzuzeigen, dass ein Wechsel der Phase eingeleitet wird.
Zeile 45 läutet eine 2-sekündige Gelb-Phase ein. Dann schaltet die Autoampel auf Rot. Der Delay-Befehl in Zeile 50 gewährleistet eine gewisse zeitliche Pufferzone zur Unfallvermeidung. Erst dann wird in Zeile 53 die 10-sekündige Grün-Phase für die Fußgängerampel geaschaltet.
Ab Zeile 56 wird der bevorstehende Phasenwechsel durch Aktivierung der gelben LED angezeigt, die Fußgängerampel auf rot gestellt und eine 2-sekündige Pufferzeit eingebaut.
Dann kehren die LEDs in ihren ursprünglichen Zustand zurück,… bis der Taster erneut gedrückt wird.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
// KFZ-Ampel int kfz_rot = 12; int kfz_gelb = 11; int kfz_gruen = 10; // Fussgaenger-Ampel int fg_rot = 9; int fg_gruen = 8; // Taste int taste = 2; int taste_led = 7; void setup() { pinMode(kfz_rot, OUTPUT); pinMode(kfz_gelb, OUTPUT); pinMode(kfz_gruen, OUTPUT); pinMode(fg_rot, OUTPUT); pinMode(fg_gruen, OUTPUT); pinMode(taste, INPUT_PULLUP); pinMode(taste_led, OUTPUT); } void loop() { //KFZ-Ampel auf Gruen schalten digitalWrite(kfz_rot, LOW); digitalWrite(kfz_gelb, LOW); digitalWrite(kfz_gruen, HIGH); //Fussgaengerampel auf Rot schalten digitalWrite(fg_gruen, LOW); digitalWrite(fg_rot, HIGH); if(digitalRead(taste) == LOW){ //Signalgeber Fussgaengerschaltung aktiviert for(int i=0; i<5; i++){ digitalWrite(taste_led, HIGH); delay(500); digitalWrite(taste_led, LOW); delay(500); } //KFZ-Ampel auf Rot schalten digitalWrite(kfz_gruen, LOW); digitalWrite(kfz_gelb, HIGH); delay(2000); digitalWrite(kfz_gelb, LOW); digitalWrite(kfz_rot, HIGH); delay(2000); //Fussgaengerampel auf Gruen schalten digitalWrite(fg_rot, LOW); digitalWrite(fg_gruen, HIGH); delay(10000); //Phasenwechsel ankuendigen digitalWrite(fg_gruen, LOW); digitalWrite(kfz_gelb, HIGH); digitalWrite(fg_rot, HIGH); delay(2000); } } |
Natürlich weise ich bei dieser Gelegenheit auch gerne auf die von der FH Potsdam entwickelte Software „Fritzing“ hin, die mittlwerweile von der Friends-of-Fritzing-Stiftung weiter gepflegt wird. Damit lassen sich eigene Projekte einfach entwickeln und auch dokumentieren. Das Programm lässt sich gratis hier herunterladen. Die Stiftung freut sich aber auch über eine kleine Spende.
Eine ähnliche Lösung, online und inklusive Schaltungssimulation, bietet mit tinkercad.com auch die Firma Autodesk. Nachfolgend eingebettet: