Nr. 42 – OLED Display SSD1306 128×64 / 128×32

Inhaltsverzeichnis

Für dieses Projekt benötigst du

Ein OLED-Display mit 128x64 pder 128x32 Pixel mit einem Arduino Mikrocontroller ansteuern

OLED Displays haben im Vergleich zu LCD-Displays (Liquid Crystal Display – Flüssigkristallanzeige) den Vorteil, dass sie sehr dünn sind und einen guten Kontrast aufweisen. Daher ist diese Technik in vielen Geräten des Alltags immer häufiger zu finden. Die kleinen OLED Displays im Bereich des Mikrocontrollings sind in der Regel monochrome, also einfarbige, Displays. Die leuchtenden Pixel haben im Vergleich zur Hintergrundfarbe nur eine Farbmöglichkeit. Selbst zweifarbige OLEDs, die wir z.B. in dieser Anleitung verwenden, sind monochrom. Im oberen Bereich des Displays (Reihe 1-16) können die Pixel nur gelb und unten (Reihe 17-64) nur blau leuchten.

OLED Displays gibt es in vielen Varianten. Sie unterscheiden sich in Farbe, Größe und auch in der Technik der Ansteuerung. Für diese Anleitung nutzen wir ein Display mit einer Auflösung von 128×64 Pixel und einer Ansteuerung über den I²C Bus (im Deutschen gesprochen als „I-Quadrat-C“). Das OLED Display befindet sich bei diesem Modul auf einer PCB, welches den Treiberchip SSD1306 und die Anschlusspins enthält.

Praxistipp: Mit etwas Geschick lässt sich das eigentliche Display von der Träger-PCB trennen, wenn man mit einem Stück Papier zwischen PCB und Glas entlang das dort befindliche doppelseitige Klebeband löst. Dadurch ist das Display nur noch ca. 1 mm dick und kann in noch kompakteren Anwendungen eingesetzt werden.

Pinout

Das Display verfügt über vier Pins:

  • VCC – Pin für die Spannungsversorgung, anzuschließen an den 5V Pin des Mikrocontrollers
  • GND – Ground-Pin, anzuschließen an den GND Pin des Mikrocontrollers
  • SDA und SCL mit den dafür vorgesehenen Kontakten am Mikrocontroller
    • Beim UNO R3 gibt es dafür oberhalb des Pin 13 einen SDA und SCL Pin. Alternativ können auch die analogen Pins A4 (SDA) und A5 (SCL) verwendet werden.

Programmierung

Für die Programmierung von OLED Displays gibt es viele Möglichkeiten. Zunächst muss überlegt werden, welche Library man verwenden möchte. Alle Libraries haben Vor- und Nachteile. Alle haben die Gemeinsamkeit, dass durch die Installation der Library auch diverse Beispielsketche mitinstalliert werden, die in der Arduinosoftware unmittelbar nach der Installation im Menüpunkt Datei → Beispiele auftauchen.

Diese Beispiele geben viele Hinweise auf die Möglichkeiten der Programmierung und zeigen auch grafische Anwendungen auf. Jedoch bringen die vielen Möglichkeiten auch den Nachteil mit sich, dass sehr viel interner Speicher des Mikrocontrollers belegt wird. So gibt es Beispielsketche für OLED Displays, die mehr als 96 % des Speicherplatzes (Arduino UNO) nutzen. Für konkrete Operationen wie dem Auswerten von Sensordaten bleibt dann zu wenig Speicherplatz übrig.

Deswegen befassen wir uns in dieser Anleitung mit einer Bibliothek, die speicher optimiert und leicht zu bedienen ist. Die Library findet man über den Bibliotheksverwalter unter dem Namen „SSD1306Ascii“.

Um einen ersten Eindruck über die Möglichkeiten zu bekommen, bietet es sich an, zunächst einige Beispielsketche zu testen, die automatisch mit der Installation der Library installiert werden. Ein Sketch heißt „FontSamplesWire“. Man findet ihn in der Arduinosoftware unter dem Menüpunkt:

Datei → Beispiele → SSD1306Ascii → FontSamplesWire.

Nach dem Hochladen tauchen auf dem OLED Display viele verschiedene Schriftarten auf, die in der Library hinterlegt sind. Auf dem UNO Controller nimmt dieser Sketch 96 % des Speicherplatzes ein. Hier wird also auch klar, dass während der regulären Verwendung möglichst wenig verschiedene Schriften verwendet werden sollten.

Die Schriftarten erscheinen bei dem genannten Sketch der Reihe nach auf dem OLED Display:

oled-beispiele

Ein wesentlich kleinerer Beispielsketch eignet sich gut für die ersten eigenen Programmierungen. Wir öffnen den Sketch „Hello World“ und Datei → Beispiele → SSD1206Ascii → HelloWorldWire und löschen zunächst alles heraus, was nicht zwingend erforderlich ist.

Beispielsketch

#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#define I2C_ADDRESS 0x3C

SSD1306AsciiWire oled;

void setup() {
  Wire.begin();
  Wire.setClock(400000L);
  oled.begin(&Adafruit128x64, I2C_ADDRESS);
}

void loop() 
{
  oled.setFont(System5x7); // Auswahl der Schriftart
  oled.clear(); //Löschen der aktuellen Displayanzeige
  oled.println("Viel"); //Text in der ersten Zeile. "Println" sorgt dabei für einen Zeilensprung.
  oled.print("Erfolg!!!"); // Text in der zweiten Zeile. Da es keine dritte Zeile gibt, wird hier kein Zeilenumsprung benötigt.
  delay (2000);
}

Außerdem gibt es selbst in dieser „kleinen“ Library viele weitere Funktionen, wie zum Beispiel
seitliches Scrollen, dauerhaftes Auf- und Abscrollen, Display um 180° drehen (oled.displayRemap(true);), folgende Textzeile invertieren (oled.setInvertMode(i%2);), gesamtes Display invertieren (oled.invertDisplay(!(i%2));), Buchstabenabstand vergrößern (oled.setLetterSpacing(2);) automatisches Scrollen am Ende des Bildschirms (oled.setScrollMode(SCROLL_MODE_AUTO);) und vieles mehr. Für jede Funktion beinhaltet die Library einzelne Beispielsketche, die im folgenden Bild markiert wurden.

Ausblick

Eine sehr umfangreiche Library trägt den Namen „U8g2“ und ist in der Lage eine Vielzahl von verfügbaren Displays bzw. Displaycontroller anzusteuern.

Auch die enthaltenen Beispiele sind sehr umfangreich und geben insbesondere für grafische Anwendungen Hilfestellungen. Um mit der „U8g2“ Library arbeiten zu können, ist es in jedem Beispielsketch notwendig, das richtige Display zu aktivieren. Dafür muss man wissen, über welchen Displaytreiber das verwendete Display verfügt.
In unserem Fall müssen das Display durch Entfernen der zwei Schrägstriche //“ das entsprechende Display aktivieren. 

Bei OLED Displays mit dem SSD1306 Chip:

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

Bei OLED Displays mit dem SH1106 Chip:

U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

Die Ergebnisse sehen dann beispielsweise so aus:

Funduino - Dein Onlineshop für Mikroelektronik

  • Dauerhaft bis zu 10% Rabatt für Schüler, Studenten und Lehrkräfte
  • Mehr als 3.500 Artikel sofort verfügbar!
  • Über 8 Jahre Erfahrung mit Arduino, 3D-Druck und co.
SALE