OLED Klasse für Arduino
Mit dieser Klasse steuerst du die kleinen OLED Displays mit SSD1306, SSD1309 und SH1106 Controller an. Sie ist kompakter als das Duo von Adafruit (GFX + SSD1306).
Der Code hat folgende Funktionen:
- Übertragungsprotokoll: I²C
- Textausgabe mit 5x8 Zeichensatz, variable Breite, incl. deutsche Umlaute
- Punkte, Linien, Kreisbögen, Rechtecke
- Ausgabe von Bitmaps
- Einstellbare Helligkeit
- Inverse Darstellung
- Um 180° gedrehte Ausgabe
- Sanfter vertikaler Bildlauf
Download: OLED.zip (Lizenzfrei)
Ein einfaches Anwendungsbeispiel:
#include "oled.h"
OLED display(Wire, 0x3C, NO_RESET_PIN, 128, 64);
void setup() {
Wire.begin();
display.init();
display.draw_string(0,0,"Hello World!");
display.display();
}
void loop() {}
Die Dokumentation befindet sich in der Datei oled.h. In dem ZIP File befindet sich ein größerer Sketch, der alle Funktionen demonstriert.
Ich habe den Code mit folgender Hardware erfolgreich getestet:
- Arduino Nano, 128x64 Display mit SSD1306, ohne Reset-Leitung
- ESP8266, 128x32 Display mit SSD1306, mit Reset-Leitung
- ESP32, 128x32 Display mit SSD1306, ohne Reset-Leitung
Beim ESP8266 kann man mit Wire.begin(sda,scl) die Pin Nummern vom I²C Bus ändern.
Bitte beachte, dass die Displays mit 3,3V betrieben werden müssen! Das dargestellte Modul enthält einen 5V → 3,3V Spannungsregler und Pull-Up Widerstände auf 3,3V. Man kann es direkt an den Arduino anschließen, sofern kein anderes Modul die I²C Leitungen auf 5V hoch zieht.
Manche Displays unterstützen sowohl SPI als auch I²C. Sie haben unterschiedlich beschriftete Anschlüsse:
- SCL = DO, SCLK, CLK
- SDA = D1, DIN, DATA, MOSI
- Reset = RES, RST (wird nicht benötigt, wenn nicht vorhanden)
- DC, D/C oder A0 bestimmt das unterste Bit der I²C Adresse, wird normalerweise mit GND verbunden.
- CS muss mit GND verbunden werden, falls vorhanden.
- D2, DOUT muss für I²C mit SDA verbunden sein.
Auf der Rückseite haben diese Displays oft entsprechend beschriftete Bauteile oder Lötjumper für die Umstellung von SPI nach I²C. Kontrolliere auch, ob SCL und SDA mit angemessenen Pull-Up Widerständen ausgestattet sind. Ich empfehle 2,2kΩ. Oft sind wesentlich hochohmigere Widerstände eingelötet oder sie fehlen ganz.
Für SH1106 Controller muss der Konstruktor mit einem weiteren Parameter (true) aufgerufen werden. Es sind vereinzelt Displays mit SH1106 aufgetaucht, wo das Bild um zwei Pixel verschoben erscheint. Links fehlt etwas und rechts erscheint dsfür ein vertikaler Balken mit zufälligem Inhalt. In diesem Fall musst du im Quelltext von OLED::display() eine 0x00 auf 0x02 ändern. Die Stelle ist mit einem Kommentar gekennzeichnet.
Der Images to byte array online converter könnte hilfreich sein, um Bilder zu konvertieren. Verwende den "Draw mode": "Vertical - 1 bit per pixel".