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ß

OLED 1,3" Weiß
OLED 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

OLED 0,96" Blau
OLED 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

OLED 0,91" Blau
OLED 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();
  }
}

Links zu OLED