OLED Displays 🚧
Für ein aktuelles Projekt war eine LCD-Anzeige für den Einbau schlicht zu groß. Eine OLED-Anzeige ist die Lösung. Ich habe einige OLEDs rumliegen, mich aber noch nie richtig damit beschäftigt. Prima Überblick: 🔗OLED Displays
Welche Info brauche ich?
- Größe: Angabe oft in Zoll
- Auflösung: Wie viele Pixel
- Farbe: Weiß soll am längsten halten
- Controller Chip: Info ist wichtig für die Library
- Schnittstelle: Meistens I2C
- Spannungsbereich: 3,3V bis 5V scheint der Standart
- U8g2-Library-Bezeichnung: Praktisch wenn man diese Lib verwendet
Beispiele aus meinem Bestand
OLED 128×64 1,3″ Weiß

1.3 Zoll; 128×64; Weiß; SH1106; I2C; 3,3V bis 5V;
U8G2_SH1106_128X64_NONAME_F_HW_I2C
Funduino: 🔗OLED – 1.3″, 128×64, VGSS, I2C, mit weißer Schrift
Az-Delivery: 🔗1,3 Zoll OLED I2C 128 x 64 Pixel Display
Leuchtet schön hell.
OLED 128×64 0,96″ Blau

0,96 Zoll; 128×64; Blau; SSD1306; I2C; 3,3V bis 5V;
U8G2_SSD1306_128X64_NONAME_F_HW_I2C
OLED 128×32 0,91″ Blau

0,91 Zoll; 128×32; Blau; SSD1306; I2C; 3,3V bis 5V;
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C
Funduino: 🔗OLED – 0.91″, 128×32, GVSS , I2C
Ist recht “funzelig”, dunkel.
U8g2 Library
Die 🔗U8g2 Library wird oft für monochrome Displays verwendet. Was mich allerdings sehr verwirrt hat, sind falsche Codebeispiele und die Sache mit dem Puffer.
for (int i = 0 ; i < 128 + width*3 ; i++ ){
u8g2.firstPage();
u8g2.setFont(u8g2_font_logisoso32_tf);
u8g2.drawUTF8(128 - i, 48, text);
u8g2.nextPage();
}
u8g2.clearBuffer();
}
Beispiel aus Az-Delivery Doku
firstPage(), nextPage() werden anders verwendet als in der 🔗Doku.
Es geht darum, RAM-Speicher bei kleinen µC zu sparen 🔗tpictureloop. Bei nebenstehendem Code sind firstPage(), nextPage() jedoch sinnlos, werden falsch verwendet.
Beispiel mit großem Puffer
Ist genug RAM vorhanden kann der Inhalt der Anzeige komplett im Speicher aufgebaut und mit sendBuffer() auf die Anzeige übertragen werden, Speicherbedarf:
“Globale Variablen verwenden 2760 Bytes”
#include <U8g2lib.h>
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE);
u8g2_uint_t width;
const char *text = "MezMedia.de ";
void setup(void) {
u8g2.begin();
u8g2.setDrawColor(1); // Hell
u8g2.setFont(u8g2_font_logisoso32_tf); // Schrift setzen
width = u8g2.getUTF8Width(text); // Textbreite bestimmen
}
void loop(void) {
for (int i = 0; i < 128 + width; i+=2) { // Laufschrift
u8g2.clearBuffer();
u8g2.drawFrame(0,0,127,63); // Rahmen zeichnen
u8g2.drawUTF8(128 - i, 48, text);
u8g2.sendBuffer();
}
}
Beispiel mit firstPage, nextPage
Bei wenig RAM kann der Speicherbedarf für den Puffer halbiert werden. Dazu müssen die Zeichen-Funktionen allerdings mehrmals aufgerufen werden, dies geschieht in der do-while-Schleife, Speicherbedarf:
“Globale Variablen verwenden 1864 Bytes”
#include <U8g2lib.h>
U8G2_SH1106_128X64_NONAME_1_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE);
u8g2_uint_t width;
const char *text = "MezMedia.de ";
void setup(void) {
u8g2.begin();
u8g2.setDrawColor(1); // Hell
u8g2.setFont(u8g2_font_logisoso32_tf); // Schrift setzen
width = u8g2.getUTF8Width(text); // Textbreite bestimmen
}
void loop(void) {
for (int i = 0; i < 128 + width; i+=2) { // Laufschrift
u8g2.firstPage();
do {
u8g2.drawFrame(0,0,127,63); // Rahmen zeichnen
u8g2.drawUTF8(128 - i, 48, text);
} while (u8g2.nextPage());
}
}
Beispiel mit 0,91″ 128×32 Display
#include <U8g2lib.h>
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, /* reset=*/U8X8_PIN_NONE);
u8g2_uint_t width;
const char *text = "MezMedia.de ";
void setup(void) {
u8g2.begin();
u8g2.setDrawColor(1); // Hell
u8g2.setFont(u8g2_font_logisoso20_tf); // Schrift setzen
width = u8g2.getUTF8Width(text); // Textbreite bestimmen
}
void loop(void) {
for (int i = 0; i < 128 + width; i+=1) { // Laufschrift
u8g2.clearBuffer();
u8g2.drawFrame(0,0,127,32); // Rahmen zeichnen
u8g2.drawUTF8(128 - i, 28, text);
u8g2.sendBuffer();
}
}
