Einrichtung eines SSD1206-OLED-Displays unter i...

OLED-Display unter ioBroker mit Node-Red

OLED-Display unter ioBroker mit Node-Red

Wer vor Ort ein paar Werte seines Smart Homes anzeigen möchte, kann dies relativ einfach mit einem preiswerten OLED-Display realisieren. 

Dieses wird per I2C-Bus an die Smart-Home-Zentrale angeschlossen. Das die RasPiLC-Platine einen solchen Bus bereitstellt und die integrierten Pegelwandler bereits die Signale des Singleboard-Computers auf die vom Display benötigten 5V anheben, kann das kleine Display direkt und ohne die sonst nötigen Pullup-Widerstände betrieben werden.

 

SSD-1206

Am Ende dieser Anleitung zeigen wir den Temperaturwert eines angeschlossenen DS18B20-Temperatursensors auf dem kleinen OLED-Display an. Die Nutzung eines solchen Sensors ist in dieser Anleitung beschrieben. Durch geringfügige Anpassungen ist es möglich, jeden beliebigen Datenpunkt anzuzeigen, der von ioBroker geliefert wird.

Diese Anleitung funktioniert auf allen SBC`s, die einen I2C-Bus besitzen. Wir haben dies erfolgreich mit einem Raspberry Pi, einem Tinker Board und einem Banana Pi getestet.

Zuerst muss dazu der I2C-Bus aktiviert werden. Wie dies bewerkstelligt wird, ist in dieser Anleitung beschrieben. Anschliessend wird das Display mit der Platine verbunden:

Display         RasPiLC

VCC               +5V

GND              GND

SDA               SDA

SCL               SCL

 

Nun kann in einer Konsole geprüft werden, ob das Display ansprechbar ist. Dies erfolgt mit dem Befehl "i2cdetect -y 1", wobei die "1" dem I2C-Bus entspricht (kann je nach verwendetem SBC abweichen).

Standardmäßig haben diese Displays die Adresse 0x3C (hexadezimal), welche je nach Hersteller abweichen kann.

i2cdetect-OLED-Display

In ioBroker muss nun der Node-Red-Adapter installiert und eine Instanz angelegt werden, was über den Reiter "Adapter" erfolgt.

Ausserdem wird das Modul "node-red-contrib-oled" benötigt, welcher dann im Node-Red-Adapter in der Zeile "zusätzliche npm-Module" eingetragen werden muss. Der Adapter installiert dann nach einem Neustart von Node-Red das Modul automatisch.

Nach erfolgter Installation des Moduls stehen dann die zusätzlichen Nodes zur Verfügung:

 

Node-Red-OLED-Nodes

 

Nun erstellen wir den entsprechenden Node, welcher dann wie folgt aussieht:

Node-Red-Flow

 

 

Ziehen Sie zuerst einen "ioBroker-Input"-Node in die Arbeitsfläche und weisen Sie den Datenpunkt zu, dem Sie auf dem OLED-Display anzeigen möchten. In unserem Fall wird der Wert des Objektes vom parser-Adapter bereitgestellt.

Node-Red-iobroker-value

 

Danach ziehen Sie einen "rbe"-Node in den Arbeitsbereich. Dieser hat die Aufgabe, nur neue und geänderte Werte durchzulassen und aktualisierte, gleiche Werte zu blockieren. Dieser wird wie folgt konfiguriert:

Node-Red-rbe

 

Die OLED-Displays haben die Charakteristik, dass neue Pixel einfach über die alten geschrieben werden. Eventuelle Fragmente der vorherigen Anzeige bleiben bestehen. Das bedeutet, dass man vor der Aktualisierung das Display bereinigen muss. Dazu gibt es mehrere Wege: Zum Einen kann man mit dem "Clear"-Node das komplette Display einfach löschen. Dies benötigt allerdings recht viel Zeit und der Bildaufbau dauert entsprechend lang. Schneller und effektiver ist es, nur den Bereich zu löschen, den man aktualisieren möchte. Dazu ziechnet man auf dem Display einfach ein schwarzes Rechteck über den Bereich, den man löschen will. Das geschieht mit dem Node "Fill-Rectangle". Die Koordinaten müssen allerdings dem Node passend übergeben werden, was mit einer vorgeschalteten Funktion realisiert wird:

Node-Red-Rectangle

 

Dabei sind die Angaben in den geschweiften Klammern interessant: x definiert den Startpunkt des Rechtecks auf der X-Achse, y den Startpunkt auf der y-Achse, w die Breite des Rechtecks und h die Höhe. color bezeichnet die Farbe. Da das Vorhandenen gelöscht werden soll, definieren wir die Farbe mit 0, was schwarz entspricht.

Danach platzieren wir den Node "FillRectangle" hinter der Funktion und definieren das Display mit seinen Angaben zu Adresse,Breite und Höhe in Pixel (Das 0,96-Zoll-Display hat eine Auflösung von 128x64 Pixel). Achtung! Die Adresse ist im Node standardmäßig als 0x3C hinterlegt. Sollte Ihr Display diese Adresse besitzen, muss die Zeile der Adresse leer gelassen werden, da sonst keine Anzeige erfolgt.

Node-Red-Define-Display

 

Nun muss unterhalb eine Verzögerung eingefügt werden, weas mit dem "delay"-Node realisiert wird. Dieses dieht dazu sicherzustellen, dass erst das Display gelöscht und erst dann die neuen Daten übertragen werden. Eine Verzögerung von 1ms war bei unseren Tests ausreichend.

Node-Red-delay

 

Jetzt wird eine Funktion benötigt, die die Daten entsprechend aufbereitet, bevor diese an das Display gesendet werden. Dazu wird wiederum eine Funktion eingefügt,mit folgendem Inhalt:

Node-Red-show-text

In der ersten Zeile der Funktion wird zuerst die Größe der Schrift deniniert (size:2), danach wie in der vorherigen Funktion des Rechecks die Startpunkte des Textes und am Ende bei "text:" der eigentliche anzuzeigende Text. Das "Temp:" und das "°C" stellen einen reinen Text dar, der genauso angezeigt wird wie er eigegeben wurde. Die Rechnung dazwischen ist eine Rundungsfunktion: Der Wert von ioBroker wird damit auf eine Nachkommastelle begrenzt, da eine genauere Anzeige recht unnötig ist.

Nun muss nur noch ein "String"-Node eingefügt werden, welcher den aufbereiteten Wert an das Display sendet. Definiert wird das Display genauso wie das "FillRectangle"-Node, sodass dieses einfach in der Konfiguration des Nodes ausgewählt werden kann. Zum Schluss müssen die Nodes nur noch wie im Bild oben verbunden werden und mit einem Klick auf "Deploy" aktiviert werden.