In diesem neuen Beitrag möchte ich dir zeigen wie du die OLED UNIT SH1107 am M5Stack ATOM programmieren kannst.



Dieses kleine Display habe ich mir von einem Coupon der Firma M5Stack gekauft. D.h. dieser Beitrag ist indirekt durch die gleichnamige Firma gesponsert geworden.
Für diesen Beitrag verwende ich zusätzlich den M5Stack ATOM Lite welchen ich ebenfalls bereits im gleichnamigen Beitrag ATOM Lite von M5Stack vorgestellt habe.


Bezug
Dieses kleine OLED Display bekommst du über den offiziellen Shop auf https://shop.m5stack.com für 10,95 $ zzgl. Versandkosten.
Lieferumfang
Zum Lieferumfang gehört neben dem OLED Display noch ein Grove Kabel (HY2.0-4P) sowie eine RFID – Karte mit nettem Aufdruck.
Technische Daten
- Stromaufnahme – 58 mA
- I²C Adresse – 0x3C
- Umgebungstemperatur 0 °C bis max. 40 °C bzw. 32 °F bis 104 °F
- Auflösung 128 x 64 Pixel
- Abmaße
- Display (L x B) – 14,7 mm x 29,42 mm
- inkl. Gehäuse (L x B x H) – 24 mm x 56 mm x 8 mm
- Pixelgröße – 0,15 mm x 0,15 mm
- Gewicht – 20g
Wie für ein OLED Display üblich kann man den Inhalt des Displays aus jedem Blickwinkel auf das Display erkennen.
Anschluss an den M5Stack ATOM
Die OLED UNIT SH1107 verfügt wie bereits erwähnt über eine Grove Schnittstelle und wird über das mitgelieferte Kabel an ein passenden Mikrocontroller angeschlossen.
Du kannst dieses Display auch an den M5Stack ATOM Matrix anschließen, dieser verfügt ebenfalls über eine Grove Schnittstelle.
M5Stack OLED UNIT SH1107 über UIFlow programmieren
Die wohl einfachste Art einen Mikrocontroller von M5Stack zu programmieren ist über UIFlow. Hier musst du lediglich die entsprechenden Elemente zusammenstecken und so baut sich der Quellcode einfach und übersichtlich auf.
Auf dem GitHub Repository StefanDraeger / m5Stack findest du alle hier dargestellten Beispiel zum einfachen Download.
Einrichten der Web-App UIFlow
Damit wir das OLED Display in UIFlow verwenden können, müssen wir dieses zunächst aktivieren. Das geschieht, indem wir unten links auf das „+“ Symbol klicken.
Aus dem neu geöffneten Fenster wählen wir nun das OLED das entsprechende Modul auswählen.
Ausgeben eines Zählers auf der UNIT SH1107
Als Erstes möchte ich dir zeigen wie du im Takt von 250ms einen Zähler inkrementierst und diesen Wert auf dem Display ausgeben kannst.
Video
Anzeigen von langen Texten auf dem OLED Display
Das OLED Display kann nur eine maximale Anzahl von Zeichen auf einmal pro Zeile anzeigen. Wir können aber den Text durch das Display scrollen lassen.
Video
Ausgeben von Datum & Zeit eines NTP Servers auf dem OLED Display
Ein etwas komplexeres Beispiel ist das Ausgeben von Datum & Uhrzeit auf dem Display. Für dieses kleine Beispiel benötigst du zusätzlich eine WiFi Verbindung für den Mikrocontroller!
Eigentlich ist die „programmierung“ mit UIFlow recht einfach aber dieses Beispiel wird etwas komplexer aber dazu an entsprechender Stelle mehr.
Aufbau der WiFi Verbindung zum lokalen WLAN Netzwerk
Als Erstes bauen wir die lokale WiFi Verbindung auf, dazu benötigen wir lediglich die SSID sowie das Passwort. Das Element dazu finden wir unter „Hardwares“ (1) > „Network“ (2) > „Verbinde mit ….“(3).
In diesem Element setzen wir in die Platzhalter die Werte für die Verbindung ein.
Damit wird die Verbindung aufgebaut, sobald der Mikrocontroller gestartet wird. Im nächsten Schritt müssen wir nun prüfen, ob diese Verbindung erfolgreich aufgebaut wurde oder eben nicht.
Wenn eine Verbindung nicht aufgebaut werden konnte, wird dieses leider erst nach ca. 2 Minuten im Programm erkannt und behandelt.
Wenn die Verbindung erfolgreich war, dann wird „OK“ auf dem Display ausgegeben und andernfalls „FAIL!“.
Funktion zum Anzeigen von Datum & Uhrzeit
Wenn der Aufbau der Verbindung erfolgreich war, wollen wir die Verbindung zum NTP Server aufnehmen und dort Datum & Uhrzeit empfangen. Diese Werte wollen wir dann formatiert auf dem Display anzeigen lassen.
Zunächst erstellen wir die Funktion „display_datetime“ und rufen diese im positiven Fall der if-Bedingung auf.
In der Funktion „display_datetime“ wird zunächst die Verbindung mit dem NTP Server „cn.pool.ntp.org“ aufgebaut (1). Alternativ kann man auch den deutschen NTP Server unter „de.pool.ntp.org“ verwenden. Jedoch wird jeweils als Timezone der Wert „2“ gesetzt das bedeutet die „Greenwich Mean Time“ +2 Stunden.
In einer Schleife (2) welche 100 mal durchlaufen wird sorgen wir dafür das der lange Text durch das Display von rechts nach links scrollt. Dazu dekrementieren wir eine Variable „x“ um -1 (3) und positionieren den Text an dieser Position (4). Danach wird der Text angezeigt bzw. das Display aktualisiert und eine Pause von 25ms eingelegt (5).
Video
Programmieren des OLED Displays SH1107 mit MicroPython
Neben der Möglichkeit den Mikrocontroller M5Stack ATOM mit UIFlow zu programmieren gibt es noch die Skriptsprache MicroPython. Für die Programmierung in MicroPython brauchst du keine extra Software installieren, denn du kannst einfach in UIFlow von der grafischen Programmierung mit Blockly zu Python mit einem klick wechseln.


Einbinden des OLED Displays
Zunächst müssen wir das OLED Display einbinden. Hier ist es am einfachsten, wenn wir zurück zur Ansicht „Blockly“ wechseln und dort die entsprechende UNIT aktivieren.

Alternativ kann man natürlich auch den Import Befehl selber implementieren.
import unit oled_0 = unit.get(unit.OLED, unit.PORTA)
Programmieren eines Zählers und Anzeigen auf der OLED UNIT SH1107 mit MicroPython
Wollen wir nun ein kleines Programm schreiben, um einen Zähler im Takt von 250ms um eins zu inkrementieren und diese auf dem Display anzeigen zu lassen.
from m5stack import * from m5ui import * from uiflow import * import time import unit # OLED Display am Port A angeschlossen # sollte ein Grove Hub verwendet werden muss hier der entsprechende Port eingestellt werden oled_0 = unit.get(unit.OLED, unit.PORTA) # Zähler initial auf 0 setzen counter = 0 # Endlosschleife while True: # Zähler um eins inkrementieren counter = counter + 1 # füllen des Displays mit der Farbe "schwarz" oled_0.fill(0x000000) # umwandeln des Zahlenwertes in eine Zeichenkette und setzen des Textes an Spalte 0 & Zeile 0 # in der Farbe Schwarz oled_0.text(str(counter), 0, 0, 0xffffff) # Anzeigen des zuvor positionierten Textes oled_0.show() # eine Pause von 250ms einlegen wait_ms(250)
Ausblick & Fazit
Da meine kleinen M5Stack ATOM Lite & ATOM Matrix nur über eine Grove Schnittstelle verfügen muss ich mir noch ein passenden Grove Hub besorgen.
Diese „M5Stack I2C Hub 1 to 6 Expansion Unit“ habe ich mir bei Eckstein Komponente für 5,99 € zzgl. 1,99 € Versandkosten bestellt und sobald dieser da ist, werde ich mit ein paar Sensoren und Aktoren ein kleines Beispiel aufbauen und auf diesem Blog präsentieren.