Mit einer Freundin hatte ich eine Wette abgeschlossen – der Gewinner bekommt eine Pizza im Lieblingsrestaurant der Wahl. Die Spielregeln sind einfach: Wenn die Freundin es schafft, die Anforderungen (Programmierung) umzusetzen, bezahle ich – sonst sie (was ich weniger hoffe). Das folgende Code-Beispiel (für Arduino oder NodeMCU / ESP8266) steuert eine LED-Ampel und kann für weitere Programmierungen genutzt werden.
Die fertige NodeMCU (ESP8266) / Arduino Ampel in Aktion
Das Video zeigt die funktionierende Ampel, gesteuert von einem NodeMCU (ESP8266). Natürlich funktioniert auch die Ampel mit einem Arduino.
Der Code für die Ampel
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 62 63 64 65 66 67 |
/** * Mini-Programm für Arduino - NodeMCU Ampel * * @author kranzkrone - 2019 by ST-Page.de * @license GPL v3 - https://www.gnu.org/licenses/gpl-3.0.de.html * * @date 2019-11-15 * @version 1.0.0 */ #define ROT 2 // NodeMCU v3 D4 -> GPIO 2 #define GELB 0 // NodeMCU v3 D3 -> GPIO 0 #define GRUEN 4 // NodeMCU v3 D2 -> GPIO 4 /** * Das Programm wird hier eingerichtet. */ void setup() { // Pins als Output festlegen. pinMode(ROT, OUTPUT); pinMode(GELB, OUTPUT); pinMode(GRUEN, OUTPUT); } /** * Die Loop-Schleife wird immer wieder und wieder durchgelaufen. */ void loop() { // ROT phase(ROT); // ROT_GELB phase(ROT,GELB); // GRUEN phase(GRUEN); // GELB phase(GELB); } /** * Die einzelnen Phasen werden hier angesteuert. * * @param farbe int -> GPIO PIN des NodeMCU */ void phase(int farbe){ // Einschalten der Phase digitalWrite(farbe, HIGH); // Zeit zwischen den einzelnen Ampelphasen delay(1000); // Ausschalten der Phase digitalWrite(farbe, LOW); } /** * Für die ROT-GELB Phase werden immer zwei Lampen an und ausgemacht. * * @param farbe int -> GPIO PIN des NodeMCU * @param farbe2 int -> GPIO PIN des NodeMCU */ void phase(int farbe, int farbe2){ // Einschalten der Phase digitalWrite(farbe, HIGH); digitalWrite(farbe2, HIGH); // Zeit zwischen den einzelnen Ampelphasen delay(1000); // Ausschalten der Phase digitalWrite(farbe, LOW); digitalWrite(farbe2, LOW); } |
Die Programmierung
Der Code für die Ampel ist sehr einfach gehalten, hierbei gibt es einige Nachteile – zum Beispiel kann das Ampelprogramm im laufenden Zustand nicht geändert werden oder das gelbe „Blinklicht“ kann beispielsweise nicht genutzt werden.
Grundsätzlich ist eine Ampel eine Lichtsignalanlage oder Lichtzeichenanlage und per Gesetz (§37 Straßenverkehrs-Ordnung) wird die Reihenfolge und der Ablauf der Lichtfolge geregelt. Die Farbfolge ist Grün – Gelb – Rot – Rot und Gelb (gleichzeitig) – für Kinder natürlich Rot – Gelb – Grün ;)
Die Funktion phase() ist zwei Mal im Quellcode ( phase(int farbe) und phase(int farbe, int farbe2)) vorhanden. Im Fachjargon wird dies Funktionsüberladung genannt – die Funktionsüberladung nutze ich hier für die Phase Rot und Gelb (gleichzeitig) aus.
In der Programmierung sollte auf die Verwendung von delay() verzichtet werden. Beim delay() wird das Programm gestoppt und weitere Eingaben werden zu dieser Zeit nicht verarbeitet, dies kann zu großen Problemen führen. Statt einem Delay sollte zum Beispiel ein Zeitgeber (Millisekundenzähler) verwendet werden.
Hardware
Die kleine Ampel habe ich auf dem Marktplatz eBay erworben und mir aus China zuschicken lassen. Leider ist die Ausschussrate sehr hoch, so dass Ihr lieber drei oder mehr „Ampeln“ bestellen solltet. Die Ampel wird über Verbindungskabel direkt mit dem NodeMCU (ESP8266) / Arduino verbunden, weitere Widerstände sind nicht nötig.
Beim Arduino wird die Ampel auf die I/O IDE-Anschlüsse (GND, 13 – Rot, 12 – Gelb & 11 -Grün) gesteckt.
Der Quellcode muss in den Zeilen 10 bis 12 angepasst werden.
1 2 3 |
#define ROT 13 // NodeMCU v3 D4 -> GPIO 2 | Arduino UNO 13 #define GELB 12 // NodeMCU v3 D3 -> GPIO 0 | Arduino UNO 12 #define GRUEN 11 // NodeMCU v3 D2 -> GPIO 4 | Arduino UNO 11 |
Ampel im Selbstbau (Eigenbau)
Die Ausgangsspannungen des Arduino und NodeMCU (ESP8266) betragen 3,3 oder 5 Volt. Wenn ihr eine Ampel baut, würde ist es sinnvoll sein die Vorwiderstände (ca. 220 Ohm) für eine Spannung von 5 Volt zu berechnen – die Ampel könnt ihr so an einem Raspberry Pi ohne Probleme anschließen und mit Python programmieren.
Ausgang der Wette
Die Zeit für jene Wette ist abgelaufen, die Freundin hat es nicht geschafft die Ampel zu programmieren. Problem war die fehlende Zeit durch das Studium oder ihr Unwille. ;) Der Pizza-Abend steht noch aus…
Links und Wissenswertes
- Ampel – Erklärung von Wikipedia
https://de.wikipedia.org/wiki/Ampel - Funktionsüberladung – Beschreibung auf Microsoft
https://docs.microsoft.com/de-de/cpp/cpp/function-overloading