Table of Contents
WIO Bahnsteig
Userpages - Hermann (hermannk)
hier geht es direkt zum Rocrail-Arbeitsbereich-Download |
die normale Ansicht | die Ansicht von unten | Rocrail-Plan |
Display und fünf LEDs | Verdrahtung, WIO ESP8266 | Textfelder, Ausgänge |
Vorwort 1:
Damit wurde diese Dokumentation erstellt: Stand 14.02.2022; Update 13.02.2024
Bereich | Details | Bemerkung |
---|---|---|
Steuerung | Rocrail | Version 2.1.2067+ (macOS "Catalina" on Intel CPU); Update: 2.1.4194+ |
Computer | MacBook Pro (Intel) | macOS 12.1 (Monterey) |
Arduino | Arduino Software | Version 1.8.13 |
WIO | WIO Firmware | Version 489; Update: 814 |
WIO ESP8266 | D1 Mini NodeMcu mit ESP8266-12F WLAN Modul | von AZ-Delivery |
OLED Anzeige | 0,91 Zoll OLED I2C Display 128 x 32 Pixel | von AZ-Delivery |
RGB LEDs | Ws2812b LED Streifen, 5m 300 LEDs | von AZ-Delivery |
Bahnsteig Modell | H0 Bahnsteig Sulzberg; 38 mm Breite | Kibri Artikel-Nr. 39556 |
WIO | Knoten-ID | 39 — bitte an die eigene Umgebung anpassen |
WIO | I2C Display | EPS8266 Pin D1=SCL, D2=SDA |
WIO | Ws2812b LED | EPS8266 Pin D8=Daten |
WIO | WIO-Daten (IOscripts, LEDScripts) | bitte vor der ersten Anwendung auf den WIO laden |
Vorwort 2:
- die Nutzung dieser Lösung erfolgt auf eigenes Risiko;
- regelmäßige Datensicherungen des Rocrail-Arbeitsbereichs werden empfohlen;
Aufgabenstellung
Ein H0-Bahnsteig-Bausatz soll mit einer Bahnsteig-Anzeige und LED-Beleuchtung unter der Überdachung aufgepeppt werden.
Auf dem Foto sind zwei unterschiedlich platzierte Displays zu sehen mit Analoguhr und Textinhalt.
Lösung-Details
a) Bahnsteig-Anzeige
b) Bahnsteig-Beleuchtung
a) Bahnsteig-Anzeige
Das verwendete 0,91 Zoll OLED I2C Display hat 128 x 32 Pixel. Es ist mit 38 mm Länge so lang wie ein schmaler H0-Bahnsteig breit ist. Da das Display vorsichtig um 2 mm gekürzt werden kann, passt es in diesem Beispiel zwei zum Bahnsteig (dauerhaft) platziert zu werden.
Das Display kann mit einer Höhe von 32 Pixeln vier Zeilen Text darstellen. Bei zwei Bahnsteig-Gleisen soll dann für jedes Gleis eine jeweils zweizeilige Anzeige von Rocrail-Lok und Rocrail-Zug angezeigt werden, wenn der Bahnsteig-Block besetzt wird. Das kann man über Rocrail-Aktionen in einem Block steuern. Hier werden die Stati "enter", "occupied" und "free" angewendet, um eine Aktion auszulösen.
Im Rocrail-Plan wird das "Gleis 1" als Block "bk02" und das "Gleis 2" wird als Block "bk03" dargestellt.
So sorgen die im Kreis fahrenden Lokomotiven für einen ständigen Wechsel auf der Display-Anzeige.
a1) Block-Status
Der Status "free", "enter" und "occupied" sollen ausgewertet werden, um eine Aktion im Block auszulösen:
Status | Beschreibung |
---|---|
free | eine Lok verlässt irgendwie den Block; die Anzeige wird gelöscht; |
enter | eine Lok fährt in den Block; Lok und Zug werden angezeigt; |
occupied | eine Lok kommt irgendwie in den Block; Lok und Zug werden angezeigt; |
sonstige | werden als nicht relevant eingestuft |
a2) Display-Puffer-Größe
Der Schriftzeichen-Puffer für das Display kann 120 Schriftzeichen speichern; darin ist der darzustellende Textinhalt enthalten und es sind sämtliche benötigte Steuerzeichen enthalten.
Die Textinhalte werden in Textfeldern gespeichert, die eine "Schnittstelle" zum WIO konfiguriert haben und so bei jeder Aktualisierung des Textfeldes den Inhalt des Textfeldes an den WIO übertragen.
Für vier Zeilen Text wird der gesamte darzustellende Text in zwei Teile aufgeteilt, weil die Grenze von 120 Schriftzeichen sonst leicht überschritten wird:
Schnittstelle | |||||
---|---|---|---|---|---|
Textfeld | Kennung | Knoten-ID | Adresse | Anzeige | Beschreibung |
tx_bahnsteiganzeige1 | WIO | 39 | 60 | 1 | die oberen zwei Zeilen Text für Block bk02; Gleis 1 |
tx_bahnsteiganzeige2 | WIO | 39 | 60 | 1 | die unteren zwei Zeilen Text für Block bk03; Gleis 2 |
a3) Aktionen definieren
Um auf dem Display etwas anzuzeigen, wird ein Rocrail-Textfeld mit dem gewünschten Inhalt gefüllt; da müssen alle notwendigen Befehle und der gewünschte Text enthalten sein. Das Textfeld hat als Schnittstelle den WIO konfiguriert und sendet bei jedem Update den Textfeldinhalt an den WIO. Der WIO gibt den Inhalt weiter an das Display.
Hier werden jetzt vier Aktionen definiert, die den Inhalt der Textfelder aktualisieren.
Noch eine Bemerkung vorne weg:
Einzelne Schriftzeichen auf der Anzeige lassen sich am Einfachsten durch Löschen der gesamten Anzeige löschen. Da dann jeweils ein Textpuffer verloren ist, wird er aktualisiert ("…recall"). Das Löschen erfolgt durch den Befehl "{E}", der am Anfang von tx_bahnsteiganzeige1 abgelegt ist. Die Ausgabe des gesamten Textpuffers erfolgt mit dem Befehl "{P}", der am Ende von tx_bahnsteiganzeige2 abgelegt ist.
Aktion | Type | Kennung | Befehl | Parameter | Bemerkung |
---|---|---|---|---|---|
ac_bahnsteiganzeige1_update | Text | tx_bahnsteiganzeige1 | update | {E}{L0}{X0}Gleis 1{X34}%lcid% {L1}{X34}%operatorid% | Lok-/Zug-Kennung aktualisieren |
ac_bahnsteiganzeige1_recall | Text | tx_bahnsteiganzeige1 | update | $tx_bahnsteiganzeige1 | der eigene Inhalt wird aktualisiert |
ac_bahnsteiganzeige2_update | Text | tx_bahnsteiganzeige2 | update | {L2}{X0}Gleis 2{X34}%lcid% {L3}{X34}%operatorid% {P} | Lok-/Zug-Kennung aktualisieren |
ac_bahnsteiganzeige2_recall | Text | tx_bahnsteiganzeige2 | update | $tx_bahnsteiganzeige2 | der eigene Inhalt wird aktualisiert |
Hinweis: falls keine Lok oder kein Zug vorhanden ist, werden die Werte für "%lcid%" und "%operatorid%" von Rocrail nicht gefüllt - wunderbar.
Die Beschreibung der Befehle für das Display findet man unter Display SSD1306/SH1106.
a4) Aktionen anwenden
Für den Block "bk02" werden die folgenden Aktionen angewendet; die Reihenfolge ist entscheidend!
Aktionen im Block bk02 | Status | Beschreibung |
---|---|---|
ac_bahnsteiganzeige1_update | free | eine Lok verlässt irgendwie den Block; die Anzeige wird gelöscht; |
ac_bahnsteiganzeige1_update | enter | eine Lok fährt in den Block; Lok und Zug werden angezeigt; |
ac_bahnsteiganzeige1_update | occupied | eine Lok kommt irgendwie in den Block; Lok und Zug werden angezeigt; |
ac_bahnsteiganzeige2_recall | free | tx_bahnsteiganzeige2 aktualisieren |
ac_bahnsteiganzeige2_recall | enter | tx_bahnsteiganzeige2 aktualisieren |
ac_bahnsteiganzeige2_recall | occupied | tx_bahnsteiganzeige2 aktualisieren |
Für den Block "bk03" werden die folgenden Aktionen angewendet; auch hier ist die Reihenfolge entscheidend!
Aktionen im Block bk03 | Status | Beschreibung |
---|---|---|
ac_bahnsteiganzeige1_recall | free | tx_bahnsteiganzeige1 aktualisieren |
ac_bahnsteiganzeige1_recall | enter | tx_bahnsteiganzeige1 aktualisieren |
ac_bahnsteiganzeige1_recall | occupied | tx_bahnsteiganzeige1 aktualisieren |
ac_bahnsteiganzeige2_update | free | eine Lok verlässt irgendwie den Block; die Anzeige wird gelöscht; |
ac_bahnsteiganzeige2_update | enter | eine Lok fährt in den Block; Lok und Zug werden angezeigt; |
ac_bahnsteiganzeige2_update | occupied | eine Lok kommt irgendwie in den Block; Lok und Zug werden angezeigt; |
a5) Ausblick
Auf der Basis dieser Lösung dürfen gerne eigene Ideen umgesetzt werden. Als Stichworte seien hier genannt: Fahrpläne, Wagenreihung, (Verspätungen gibt es im Modell normal nicht), Sonderzeichen als Bitmaps, Analoguhr, Digitaluhr, Besucherbegrüßungstext, Sondermeldungen, …
b) Bahnsteig-Beleuchtung
Es sollen verschiedene Lösungs-Techniken zur Ansteuerung von LEDs aufgezeigt werden.
b1) Mit einem Rocrail-Ausgang lässt sich eine LED ansteuern.
b2) Mit Rocrail-IOscripts können mit einem Rocrail-Ausgang mehrere LEDs angesteuert werden.
b3) Mit Rocrail-LEDScripts können dynamische Abläufe mit LEDs realisiert werden.
In dem Arbeitsbereich gibt es zahlreiche Ausgänge, mit denen die hier vorgestellten Beispiele ausprobiert werden können.
b1) 5 LEDs und 5 Rocrail-Ausgänge
Jede LED kann mit je einem Rocrail-Ausgang ein- und aus-geschaltet werden. Der Farbton und die Helligkeit sind fest eingestellt. Hier soll ein "warmweißes" Licht verwendet werden, das etwa den RGB-Werten R=100%, G=80%, B=10% entspricht - also R=255, G=204, B=25. Die Helligkeit wird moderat eingestellt (hier mit Sättigung=063); das spart einerseits Energie und stellt andererseits sicher, nicht geblendet zu werden.
Hinweis: LEDs können sehr hell strahlen und die Augen schädigen! Nehmt Rücksicht auf euch und eure Besucher!
Allgemein | Schnittstelle | Farbe | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Kennung | Knoten-ID | Adresse | Wert | Verzögerung | Option | Typ | RGB | Bemerkung | |||||
co_b1_1 | 39 | 1 | 127 | 0 | Farbe | LED | rot | grün | blau | weiß_1 | weiß_2 | Sättigung | |
255 | 204 | 025 | 0 | 0 | 063 | warmweiß: | |||||||
co_b1_2 | 39 | 2 | 127 | 0 | Farbe | LED | rot | grün | blau | weiß_1 | weiß_2 | Sättigung | |
255 | 204 | 025 | 0 | 0 | 063 | warmweiß: | |||||||
co_b1_3 | 39 | 3 | 127 | 0 | Farbe | LED | rot | grün | blau | weiß_1 | weiß_2 | Sättigung | |
255 | 204 | 025 | 0 | 0 | 063 | warmweiß: | |||||||
co_b1_4 | 39 | 4 | 127 | 0 | Farbe | LED | rot | grün | blau | weiß_1 | weiß_2 | Sättigung | |
255 | 204 | 025 | 0 | 0 | 063 | warmweiß: | |||||||
co_b1_5 | 39 | 5 | 127 | 0 | Farbe | LED | rot | grün | blau | weiß_1 | weiß_2 | Sättigung | |
255 | 204 | 025 | 0 | 0 | 063 | warmweiß: |
b2) 5 LEDs, ein IOscript und ein Rocrail-Ausgang
Alle 5 LEDs sollen mit einem Rocrail-Ausgang ein- und aus-geschaltet werden; das kann mit einem IOscript erreicht werden. Der Konfigurations-Aufwand wird damit reduziert.
Allgemein | Schnittstelle | Farbe | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Kennung | Knoten-ID | Adresse | Wert | Verzögerung | Option | Typ | RGB | Bemerkung | |||||
co_b2_1 | 39 | 15 | 127 | 0 | — | Macro | rot | grün | blau | weiß_1 | weiß_2 | Sättigung | |
0 | 0 | 0 | 0 | 0 | 255 | alles nicht relevant |
Der Name des IOscripts ist "000_14_001.io"; Achtung: die Nummer im Namen ist um 1 kleiner als die Adresse vom Rocrail-Ausgang!
Der Inhalt des IOscripts für eingeschaltetes warmweißes Licht kann dann so aussehen:
#Bahnsteig mit 5 LEDs \\ #alle an \\ #warmweiss = 100% Rot, 80% Grün, 10% Blau \\ #p o t sla bri b de red gre blu \\ 00 1 P 000 063 0 00 255 204 025 \\ 01 1 P 000 063 0 00 255 204 025 \\ 02 1 P 000 063 0 00 255 204 025 \\ 03 1 P 000 063 0 00 255 204 025 \\ 04 1 P 000 063 0 00 255 204 025 \\
Weitere Details zu IOscripts stehen im Wiki unter IOscript
Der Name des IOscripts für ausgeschaltetes Licht ist "000_14_000.io".
Der Inhalt des IOscripts für ausgeschaltetes warmweißes Licht kann dann so aussehen (die Spalte "o" hat den Wert 0):
#Bahnsteig mit 5 LEDs \\ #alle aus \\ #warmweiss = 100% Rot, 80% Grün, 10% Blau \\ #p o t sla bri b de red gre blu \\ 00 0 P 000 063 0 00 255 204 025 \\ 01 0 P 000 063 0 00 255 204 025 \\ 02 0 P 000 063 0 00 255 204 025 \\ 03 0 P 000 063 0 00 255 204 025 \\ 04 0 P 000 063 0 00 255 204 025 \\
Beide Dateien müssen in den WIO geladen werden.
b3) 5 LEDs, ein LEDScript und ein Rocrail-Ausgang
In diesem Rocrail-Plan werden fünf LEDScript-Beispiele vorgestellt. Die Ideen und Inhalte zu den LEDScripts stammen zum Teil aus dem Rocrail-Forum und wurden an die hier dargestellte Umgebung angepasst.
Jedes LEDScript wird von je einem Rocrail-Ausgang aktiviert.
Update1: die Adresse hat sich geändert auf eine maximal 2-stellige Script-Nummer
Update2: der Typ hat sich geändert: vorher "LED"; jetzt "LEDScript"
Adresse | Dateiname | Bedeutung |
---|---|---|
21 | ls_bahnsteig_21.led | alle 5 LEDs werden mit warmweißem Licht ein-/ausgeschalten |
22 | ls_lauflicht_22.led | ein Lauflicht wie bei einer Baustelle |
23 | ls_einblenden_23.led | alle fünf LEDs werden langsam eingeblendet |
24 | ls_vielfallt_24.led | alle LEDs ändern zufällig ihren Farbton und ihre Helligkeit |
25 | ls_neonroehre_25.led | die mittlere LED simuliert eine defekte Neonröhre |
Die Dateinamen beginnen alle mit "ls_", damit die LEDScripts alphabetisch sortiert zusammen stehen.
Weitere Details zu LEDScripts stehen im Wiki unter LEDScript
Mit einem Rocrail-Ausgang kann man ein LEDScript aktivieren (EIN) und de-aktivieren (AUS).
Alle LEDScripts sind in der Download-Datei enthalten.
b3.1) Bahnsteig-Beleuchtung ein/aus
Alle 5 LEDs sollen mit einem Rocrail-Ausgang ein- und aus-geschaltet werden; das kann mit einem LEDScript erreicht werden. Der Konfigurations-Aufwand wird damit reduziert.
Allgemein | Schnittstelle | Farbe | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Kennung | Knoten-ID | Adresse | Wert | Verzögerung | Option | Typ | RGB | Bemerkung | |||||
co_b3_1 | 39 | 21 | 126 | 0 | Farbe | LEDScript | rot | grün | blau | weiß_1 | weiß_2 | Sättigung | |
Datei: ls_bahnsteig_21.led | 253 | 0 | 0 | 0 | 0 | 255 | alles nicht relevant |
Hinweis: wenn man unter Schnittstelle / Wert = 126 einträgt und unter Farbe / RGB / rot = 253 einträgt, dann sieht man im Rocrail-Plan für den Ausgang einen optischen Unterschied zwischen EIN und AUS; sonst wäre er immer schwarz.
Die Werte 126 und 253 sind hier willkürlich gewählt; es sollte immer ein heller sichtbarer Farbton sein.
Der Name des LEDScripts ist "ls_bahnsteig_21.led".
Der Inhalt des LEDScripts für ausgeschaltetes warmweißes Licht ist im LEDScript bereits enthalten.
Der Inhalt des LEDScripts für eingeschaltetes warmweißes Licht kann dann so aussehen:
#Skript für Bahnsteig mit 5 WS2812 s0 //Skript läuft immer #warmweiss = 100% Rot, 80% Grün, 10% Blau l0 //LED 1. definieren beginnend bei 0 = 1.te LED c5 //x folgende LEDs r255 //feste Vorgabe für Rot g204 //feste Vorgabe für Grün b25 //feste Vorgabe für blau i063 //brightness, Helligkeit #LED-off D0 //Erste LED definieren T5 //inkl. der 5 folgenden e
Weitere Details zu LEDScripts stehen im Wiki unter LEDScript
b3.2) ein Lauflicht wie bei einer Baustelle
Allgemein | Schnittstelle | Farbe | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Kennung | Knoten-ID | Adresse | Wert | Verzögerung | Option | Typ | RGB | Bemerkung | |||||
co_b3_2 | 39 | 22 | 126 | 0 | Farbe | LEDScript | rot | grün | blau | weiß_1 | weiß_2 | Sättigung | |
Datei: ls_lauflicht_22.led | 253 | 0 | 0 | 0 | 0 | 255 | alles nicht relevant |
Hinweise: siehe b3.1)
# Lauflicht s0 //Skript läuft endlos l0 //LED definieren beginnend bei 0 = 1.te LED c1 //nur 1 LED keine folgenden r255 g204 b025 i017 //brightness, Helligkeit p005 //bei Großschreibung wird mit Zufallswerten gearbeitet # LED ... #LED-off D0 //Erste LED definieren T5 //inkl. der 5 folgenden e
b3.3) alle fünf LEDs werden langsam eingeblendet
Allgemein | Schnittstelle | Farbe | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Kennung | Knoten-ID | Adresse | Wert | Verzögerung | Option | Typ | RGB | Bemerkung | |||||
co_b3_3 | 39 | 23 | 126 | 0 | Farbe | LEDScript | rot | grün | blau | weiß_1 | weiß_2 | Sättigung | |
Datei: ls_einblenden_23.led | 253 | 0 | 0 | 0 | 0 | 255 | alles nicht relevant |
Hinweise: siehe b3.1)
# einblenden s0 //Skript läuft endlos l0 //LED definieren beginnend bei 0 = 1.te LED c5 //alle 5 LEDs r255 g204 b025 >063 //brightness, Helligkeit p005 #LED-off D0 //Erste LED definieren T5 //inkl. der 5 folgenden e
b3.4) alle LEDs ändern zufällig ihren Farbton und ihre Helligkeit
Allgemein | Schnittstelle | Farbe | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Kennung | Knoten-ID | Adresse | Wert | Verzögerung | Option | Typ | RGB | Bemerkung | |||||
co_b3_4 | 39 | 24 | 126 | 0 | Farbe | LEDScript | rot | grün | blau | weiß_1 | weiß_2 | Sättigung | |
Datei: ls_vielfallt_24.led | 253 | 0 | 0 | 0 | 0 | 255 | alles nicht relevant |
Hinweise: siehe b3.1)
# vielfallt s0 //Skript läuft endlos l0 //LED definieren beginnend bei 0 = 1.te LED c1 //nur 1 LED keine folgenden R51455 // range= 200*256 + 255 = 51455 G38604 // range= 150*256 + 204 = 38604 B00281 // range= 001*256 + 025 = 00281 I017 //brightness, Helligkeit # LED ... #LED-off D0 //Erste LED definieren T5 //inkl. der 5 folgenden e
b3.5) die mittlere LED simuliert eine defekte Neonröhre
Allgemein | Schnittstelle | Farbe | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Kennung | Knoten-ID | Adresse | Wert | Verzögerung | Option | Typ | RGB | Bemerkung | |||||
co_b3_5 | 39 | 25 | 126 | 0 | Farbe | LEDScript | rot | grün | blau | weiß_1 | weiß_2 | Sättigung | |
Datei: ls_neonroehre_25.led | 253 | 0 | 0 | 0 | 0 | 255 | alles nicht relevant |
Hinweise: siehe b3.1)
# Defekte Neonröhre s0 //Skript läuft endlos l0 // zuerst sind alle an c5 r255 g204 b25 i017 p50 #kurze Leuchtzeit (aufblinken) max 50 ms ... #LED-reset, LED lässt sich dann über den Ausgang ausschalten. d0 t5 e
c) Rocrail-Arbeitsbereich
In dem Download-Arbeitsbereich "WIO_Bahnsteig_20240213.zip" sind folgende Dateien enthalten:
- Hinweis: ab 29.11.2022 passen die LED-Script-Adressen der Plan-Datei zu der Beschreibung hier im Wiki;
Update: ab 13.02.2024 positiv getestet mit WIO Version 814 und Rocrail Version 2.1.4194
Datei | Bedeutung |
---|---|
plan.xml | die Rocrail-Plan-Datei |
rocrail.ini | die Rocrail-Initialisierungs-Datei mit der Definition für die WIO-Zentrale |
WIO_data | ein Unterordner mit den Scripts für den WIO |
000_14_000.io | IOscript zum Ausschalten der LEDs |
000_14_001.io | IOscript zum Einschalten der LEDs |
ls_bahnsteig_21.led | alle 5 LEDs werden mit warmweißem Licht ein-/ausgeschalten |
ls_lauflicht_22.led | ein Lauflicht wie bei einer Baustelle |
ls_einblenden_23.led | alle fünf LEDs werden langsam eingeblendet |
ls_vielfallt_24.led | alle LEDs ändern zufällig ihren Farbton und ihre Helligkeit |
ls_neonroehre_25.led | die mittlere LED simuliert eine defekte Neonröhre |
zurück zu den Lösung-Details.
d) anwenden
Ein kurzer Überblick, was für die Anwendung zu erledigen ist:
was | erledigen |
---|---|
Hardware | beschaffen und zusammenbauen |
Arduino IDE | Arduino Entwicklungsumgebung herunterladen und installieren |
WIO Firmware | herunterladen, siehe https://wiki.rocrail.net/doku.php?id=arduino:wio-en |
WIO Datei USERCNF.h | an die eigenen Bedürfnisse anpassen (WIO-ID, WLAN, …) |
WIO Firmware | übersetzen und auf den WIO laden |
WIO Einstellung/Wartung | z.B. die Display-Größe anpassen |
WIO_data | alle IOscripts und LEDScript auf den WIO laden |
Rocrail | starten mit dem Arbeitsbereich "WIO_Bahnsteig" |
Rocrail | testen |
Rocrail | nach einer Datensicherung eigene Wünsche umsetzen |
… | … |
e) Verdrahtung
WIO - Anschluss an I2C-OLED-Displays und WS2812B RGB-LEDs (FastLED, NeoPixel):
wio_esp8266_20220325.pdf
Ohne Gewähr.
Viel Spass und gutes Gelingen.