Auch bei diesem I2C Projekt war die erste Hürde, die richtige Initialisierung zu finden. Das verwendete OLED Display, bzw. der SSD1306 Treiber funktioniert hier so, dass ein einfacher Befehl ohne Parameter mit 0x00 angekündigt und danach übertragen wird, also 0x00AE für "Display Aus".
Ein Befehl mit Parameter wird in zwei Schritten übergeben: erst kommt 0x00, dann der Befehl, dann 0x00 und der Parameter, also 0x00D5 gefolgt von 0x0080 für eine SETDISPLAYCLOCKDIV von 0x80.
Die notwendigen Initialierungsbefehle und ihre Parameter habe ich hier entnommen (auch das .h File beachten): https://github.com/adafruit/Adafruit_SSD1306/blob/master/Adafruit_SSD1306.cpp
Andere Displays verlangen wohl 0x80, um einen Befehl bzw. dessen Parameter anzukündigen. In jedem Fall werden keine "Register" wie bei anderen I2C Geräten verwendet.
Bei der I2C Adresse gab es auch Verwirrung, in der Doku steht 0x3C oder 0x3D und hinten auf dem Display steht 0x78 oder 0x7A. Funktioniert hat dann 0x3C. Der Initialisierungscode spricht alle vier Adressen an. (Siehe Kommentare unten, es handelt sich um den Unterschied 7-Bit vs. 8-Bit Darstellung)
Um einen Text zu schreiben, kann man sich Buchstaben selber bauen: (ein vertikaler Strich ist 0xFF, muss mit 0x40 als Daten angekündigt werden, also als 16BE 0x40FF geschrieben werden; oder man sucht sich einen passenden Font. Hier habe ich einen gefunden, der funktioniert: https://github.com/achilikin/bdfe/blob/master/font88.h
Nach der Initialisierung die Position auf Null setzen und das Display löschen, siehe Code Beispiel.
Pull Up Widerstände: laut SSD1306 / OLED Display Dokumentation sind Pull Up Widerstände (z.B. 4.7k) zwischen VCC/3.3V und SCL sowie SDA notwendig, aber es hat bei mir mit einem kurzen Grove Kabel auch ohne funktioniert. Update: was daran liegen wird, dass auf dem Calliope Mini selbst Pull Up Widerstände drauf sind.
Hinweis: falls das Display nach der Initialisierung nicht aufleuchtet und Du Fehler in Deinem Code korrigiert hast, auf jeden Fall das Display vor einem neuen Versuch stromlos machen, um zu verhindern, dass das Display in einem unklaren Zustand keine Befehle mehr annimmt.
Update: in dem Code war das "Sonderzeichen" "<" (Kleiner) durch "<" ersetzt, keine Ahnung, wie das passiert ist: jetzt korrigiert.
Comments