Jython
Deutsch   English 

18. OLED-Display


Der Matrixdisplay des micro:bit eignet sich nur bedingt für das Ausschreiben von Daten und Text. Eine Verbesserung bringt bereits die 4-stellige Siebensegmentanzeige, deren Verwendung hier beschrieben wird. Allerdings ist der darstellbare Zeichensatz stark eingeschränkt und man kann nur 4 Zeichen miteinander anzeigen. Ein echtes Graphikdisplay, bei welchem man jedes Pixel einzeln ansteuern kann, bietet wesentlich mehr Möglichkeiten. Das billige OLED-Display auf der Basis des SSD1306 Kontrollers hat eine Auflösung von 128 x 64 Pixel, wobei jedes Pixel, allerdings nur als schwarz/weiss einzeln adressierbar ist. Es können damit sowohl Text wie einfache Grafiken dargestellt werden.

Die Ansteuerung erfolgt über I2C und benötigt daher lediglich 4 Leitungen GND, VCC, SCL und SDA. Der Anschluss am micro:bit erfolgt wie bei einem Sensor am einfachsten über einen I2C-Hub mit Grove-Stecker der an den Pin GND, 3V, P19 (SCL), P20 (SDA) angeschlossen ist. Man schneidet ein Kabel mit Grove-Steckern entzwei und lötet es gemäss nebenstehender Figur am Display an.

 

Verbindungsmöglichkeiten für I2C-Geräten mit Grove-Stecker:

Didel Hub (Bezugsquelle noch angeben)

Breadboard mit Piromoni pinbit und

Grove Übergang

Das Ausschreiben auf dem Display erfolgt unter Verwendung des Moduls oled.py, das wegen des kleinen Speicherplatzes des micro:bit ziemlich trickreich aufgebaut ist. (Insbesondere wird das Zeichenfont der Klasse Image entnommen, die bereits im Modul microbit enthalten ist und für das Ausschreiben von Text auf dem Matrixdisplay verwendet wird.)  Die Library kann von hier   heruntergeladen werden. Im folgenden Beispiel wir ein 4-zeiliger Text ausgeschrieben, der erhalten bleibt, auch wenn das Programm endet.

# Oled1.py
import oled

oled.init()
oled.text(0, 0, "Hello Python")
oled.text(0, 1, "Programming")
oled.text(0, 2, "is fun!")
n = 123456789123
oled.text(0, 3, str(n))
► In Zwischenablage kopieren
 

 

Um eine Zeile neu zu schreiben, sollte man total 12 Zeichen ausschreiben, z.B. mit einem Formatierungsstring. Das periodische Löschen mit clear() führt zu einem Flackern.

Kein Flackern   Flackern
# Oled2.py
import oled

oled.init()
n = 1000
while True:
    oled.text(0, 0, "v: %-9d" %n)
    n -= 1
    if n == 0:
        n = 1000
► In Zwischenablage kopieren
 
# Oled2a.py
import oled

oled.init()
n = 1000
while True:
    oled.clear()
    oled.text(0, 0, str(n))
    n -= 1
    if n == 0:
        n = 1000
► In Zwischenablage kopieren

Das Display wird oft zum Anzeigen von Messwerten verwendet, z.B. bei Verwendung des Temperatur-/Feuchtigkeitssensor von Sensirion. Da der Update nur alle 5 s erfolgt, wird das Display mit clear() gelöscht.

# Oled3.py
import oled
from microbit import sleep
import sht

oled.init()
while True:
    v = sht.getValues()
    oled.text(0, 0, "t: %.1f C" %v[0])
    oled.text(0, 1, "h: %d%%" %v[1])
    sleep(5000)
    oled.clear()
► In Zwischenablage kopieren
   

 

Bilder Darstellen

Auf dem Display können Schwarz-Weiss-Bilder der Grösse 128 x 64 = 8196 Pixels angezeigt werden. Die Bilddatei muss sich binär verschlüsselt im Dateisystem des micro:bit befinden. Jedes Byte entspricht 8 Display-Pixeln, die entweder ein- oder ausgeschaltet sind. Es werden also 1024 Bytes verwendet und die Reihenfolge ist wie hier ersichtlich festgelegt.

 

Um die binäre Datei in diesem Format herzustellen, geht man wie folgt vor.

  • Man erstellt mit irgendeinem Bildeditor ein Bild (z.B. einstein.bmp) der Grösse 128x64 und speichert diese als BMP ab. Das verwendete Konvertierungsprogramm wird Pixels mit der Helligkeit h = (r + g + b) / 3 < 100 in schwarze und die anderen in weisse Pixel umwandeln. Am besten verwendet man also bereits beim Editieren nur die Farben schwarz (h = 0) und weiss (h = 255).
  • Man startet TigerJython und schreibt ein Programm, das die einzige Zeile
    import bmp2oled
    enthält und startet es. Im Dateidialog wählt man einstein.bmp aus. Es wird die binäre Bilddatei einstein (ohne .bmp) gemäss dem oben angegebenen Format erstellt.
  • Man kopiert einstein mit TigerJython unter der Menüoption Tools | Modul herunterladen und der Option File auf den micro:bit.
  • Mit dem folgenden Programm wird das Bild auf dem Display angezeigt.
# Oled4.py
import oled

oled.init()
oled.image("einstein")
► In Zwischenablage kopieren