Bauteile · 4 Min. Lesezeit

OLED-Display (SSD1306) verwenden: Text, Formen und Grafiken mit Arduino

Wie nutzt man ein 0,96-Zoll-I2C-OLED-Display (SSD1306)? Anschluss und I2C-Adresse (0x3C), Bibliotheken Adafruit SSD1306 und GFX, Text, Formen, Sensorwerte und Bitmaps zeichnen, Code für ESP32 und Pico mit MicroPython.

Obwohl es kaum größer als eine Fingerspitze ist, zeigt das 0,96-Zoll-OLED-Display ein scharfes Bild mit 128×64 Pixeln und gehört zu den beliebtesten Displays für Arduino-Projekte. Anders als Zeichen-LCDs zeichnet es nicht nur Buchstaben, sondern auch Linien, Kreise, Symbole, Diagramme und sogar kleine Spiele. Ideal für Smartwatches, Wetterstationen, Fernbedienungen und tragbare Messgeräte. Fast alle diese Displays nutzen den Treiberchip SSD1306 und werden mit nur zwei Datenleitungen (I2C) angeschlossen.

0,96-Zoll-I2C-OLED-Display SSD1306
0,96-Zoll-I2C-OLED-Display: 128×64 Pixel, SSD1306-Treiber und nur 4 Pins (GND, VCC, SCL, SDA).

Was ist ein OLED und was unterscheidet es vom LCD?

Bei einem OLED-Display (Organic Light Emitting Diode) leuchtet jedes Pixel selbst; es gibt keine Hintergrundbeleuchtung. Deshalb ist Schwarz wirklich schwarz, der Kontrast sehr hoch, das Bild aus jedem Winkel scharf, und wenn der Großteil dunkel ist, braucht es sehr wenig Strom. 128×64 Pixel ermöglichen Grafiken, Symbole und Zeichnungen, die zeichenbasierte LCDs nicht darstellen können.

Merkmal0,96"-OLED0,91"-OLED16x2-LCD
Auflösung128×64 Pixel128×32 Pixel16×2 Zeichen
Grafik und SymboleJaJaNein (nur Zeichen)
HintergrundbeleuchtungNicht nötigNicht nötigNötig
AnschlussI2C (auch SPI-Versionen)I2C4 Drähte mit I2C-Modul
Im SonnenlichtSchwer lesbarSchwer lesbarBesser lesbar

Technische Daten

MerkmalWert
TreiberchipSSD1306
Bildschirm0,96" 128×64 (die 0,91"-Version 128×32)
FarbeEinfarbig: weiß, blau oder oben gelb und unten blau
Versorgung3,3–5 V (Spannungsregler auf der Platine)
StromEtwa 10–25 mA (je nach Anzahl leuchtender Pixel)
I2C-Adresse0x3C (bei manchen Modellen 0x3D)
PinsGND, VCC, SCL, SDA

Anschluss des OLED-Displays

OLED-PinArduino UnoESP32Raspberry Pi Pico
GNDGNDGNDGND
VCC5V oder 3.3V3V33V3
SCLA5GPIO 22GP5
SDAA4GPIO 21GP4
Bei manchen OLED-Modulen ist die Pinreihenfolge VCC, GND, bei anderen GND, VCC. Lies vor dem Anschließen immer die Beschriftung auf der Platine; vertauschte Versorgung zerstört das Display sofort.

Bei zweifarbigen Modellen leuchten die oberen 16 Zeilen gelb, der Rest blau; diese Farben lassen sich per Software nicht ändern, daher sieht es gut aus, den oberen Teil wie eine Titelleiste zu gestalten. Bist du dir bei der Adresse nicht sicher, nutze den I2C-Scanner aus I2C-LCD-Display verwenden.

Bibliotheken installieren

  1. Öffne in der Arduino IDE den Bibliotheksverwalter und suche nach Adafruit SSD1306.
  2. Wenn bei der Installation nach Abhängigkeiten gefragt wird, wähle Install all, damit auch Adafruit GFX und Adafruit BusIO installiert werden.
  3. Wenn du möchtest, öffne Datei > Beispiele > Adafruit SSD1306 > ssd1306_128x64_i2c und probiere es mit der Adresse 0x3C aus.

Erstes Programm: Text auf dem Display

Arduino (C++)
1#include <Wire.h>
2#include <Adafruit_GFX.h>
3#include <Adafruit_SSD1306.h>
4
5Adafruit_SSD1306 display(128, 64, &Wire, -1);   // genişlik, yükseklik, I2C, reset pini yok / width, height, I2C, no reset pin
6
7void setup() {
8  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {   // I2C adresi / I2C address
9    for (;;);                                         // ekran bulunamadı / display not found
10  }
11  display.clearDisplay();
12  display.setTextColor(SSD1306_WHITE);
13  display.setTextSize(2);                   // 2 kat büyük / double size
14  display.setCursor(0, 0);
15  display.println(F("BlueGrays"));
16  display.setTextSize(1);
17  display.setCursor(0, 24);
18  display.println(F("OLED 128x64 hazir!"));
19  display.display();                        // tamponu ekrana gönder / push the buffer to the screen
20}
21
22void loop() {
23}
Die Bibliothek zeichnet alles zuerst in einen Puffer im Speicher; um es auf dem Display zu sehen, musst du display.display() aufrufen. Diesen Befehl zu vergessen, ist die häufigste Ursache für ein "leeres Display". Am Uno spart es außerdem RAM, feste Texte in F("...") zu schreiben.

Formen zeichnen: Funktionen von Adafruit GFX

FunktionWas sie zeichnet
drawPixel(x, y, farbe)Ein einzelnes Pixel
drawLine(x0, y0, x1, y1, farbe)Eine Linie
drawRect / fillRect(x, y, breite, hoehe, farbe)Rechteck oder gefülltes Rechteck
drawCircle / fillCircle(x, y, radius, farbe)Kreis oder gefüllter Kreis
drawRoundRect(x, y, breite, hoehe, ecke, farbe)Rechteck mit abgerundeten Ecken
drawTriangle(x0, y0, x1, y1, x2, y2, farbe)Dreieck
drawBitmap(x, y, array, breite, hoehe, farbe)Ein fertiges Bild (Bitmap)

Die linke obere Ecke des Displays ist (0, 0), die rechte untere (127, 63). Als Farbe nutzt du SSD1306_WHITE (an), SSD1306_BLACK (aus) oder SSD1306_INVERSE (umkehren).

Sensorwerte anzeigen: ein Live-Thermometer

Die Stärke des OLED ist, Messwerte mit großen Ziffern und Grafiken zu zeigen. Der folgende Code schreibt die Temperatur eines DHT11 in großer Schrift und zeigt die Luftfeuchtigkeit darunter als Balken. Zum Anschluss des Sensors siehe DHT11 Temperatur- und Feuchtigkeitssensor.

Arduino (C++)
1#include <Wire.h>
2#include <Adafruit_GFX.h>
3#include <Adafruit_SSD1306.h>
4#include <DHT.h>
5
6Adafruit_SSD1306 display(128, 64, &Wire, -1);
7DHT dht(2, DHT11);
8
9void setup() {
10  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
11  display.setTextColor(SSD1306_WHITE);
12  dht.begin();
13}
14
15void loop() {
16  float t = dht.readTemperature();
17  float h = dht.readHumidity();
18  display.clearDisplay();
19  display.setTextSize(1);
20  display.setCursor(0, 0);
21  display.print(F("Sicaklik / Temp"));
22  display.setTextSize(3);
23  display.setCursor(0, 16);
24  display.print(t, 1);
25  display.print(F("C"));
26  display.drawRect(0, 52, 128, 10, SSD1306_WHITE);                    // nem çubuğu çerçevesi / humidity bar frame
27  display.fillRect(2, 54, (int)(h / 100.0 * 124), 6, SSD1306_WHITE);  // nem oranı kadar dolu / filled by humidity
28  display.display();
29  delay(2000);
30}

Eigene Symbole zeichnen: Bitmaps

Um ein Logo oder Symbol zu zeigen, wandelst du das Bild in ein Byte-Array um: Jedes Bit ist ein Pixel. Konverter wie image2cpp machen aus einem Schwarz-Weiß-Bild direkt ein Arduino-Array. Kleine Symbole kannst du auch von Hand schreiben; das 8×8-Array unten zeichnet ein Herz:

Arduino (C++)
1const unsigned char PROGMEM heart[] = {
2  0b01100110,
3  0b11111111,
4  0b11111111,
5  0b11111111,
6  0b01111110,
7  0b00111100,
8  0b00011000,
9  0b00000000
10};
11
12// setup() ya da loop() içinde / inside setup() or loop()
13display.drawBitmap(60, 28, heart, 8, 8, SSD1306_WHITE);
14display.display();

OLED mit ESP32 und Raspberry Pi Pico

Am ESP32 laufen derselbe Arduino-Code und dieselben Bibliotheken; die I2C-Pins sind GPIO 21 (SDA) und 22 (SCL). Weil der ESP32 viel Speicher hat, laufen Animationen und schnell aktualisierte Grafiken deutlich flüssiger. Für MicroPython auf dem Pico kopierst du einfach die Treiberdatei ssd1306.py (aus micropython-lib) auf den Pico:

MicroPython
1from machine import Pin, I2C
2import ssd1306                                 # ssd1306.py Pico'da olmalı / must be on the Pico
3
4i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=400000)
5oled = ssd1306.SSD1306_I2C(128, 64, i2c)       # adres varsayılan 0x3C / default address 0x3C
6
7oled.fill(0)                                   # ekranı temizle / clear the screen
8oled.text("BlueGrays", 0, 0)
9oled.text("Pico + OLED", 0, 16)
10oled.rect(0, 40, 128, 20, 1)                   # çerçeve / frame
11oled.fill_rect(2, 42, 80, 16, 1)               # dolu çubuk / filled bar
12oled.show()                                    # ekrana gönder / push to the screen

Lebensdauer und Einbrennen (Burn-in)

OLED-Pixel verlieren mit der Nutzung an Helligkeit. Bleibt dasselbe Bild monatelang unverändert stehen, kann sich an häufig leuchtenden Pixeln ein schwacher Schatten bilden. Um das zu vermeiden, schalte das Display bei Nichtbenutzung ab (display.ssd1306_command(SSD1306_DISPLAYOFF)), senke die Helligkeit (display.dim(true)), verschiebe statische Inhalte ab und zu um einige Pixel oder schalte das Display mit einem PIR-Sensor nur ein, wenn jemand in der Nähe ist.

Projektideen mit dem OLED-Display

  • Mini-Wetterstation: Temperatur, Feuchtigkeit und Luftdruck mit Symbolen anzeigen.
  • Taschenspiele: Spiele wie Pong oder den T-Rex-Läufer mit Tastern oder einem Joystick spielen.
  • Wetteranzeige: das mit einem ESP32 aus dem Internet geholte Wetter mit Symbolen anzeigen.
  • Parksensor-Anzeige: die mit einem HC-SR04 gemessene Entfernung als Zahl und Balken anzeigen.
  • Signalplotter: analogRead-Werte als laufendes Diagramm auf dem Display zeichnen.
  • Tischuhr: Internetzeit, Datum und das Wetter des Tages auf einem Display vereinen.

Typische Fehler und ihre Lösungen

  • Das Display bleibt leer: display.display() wird nicht aufgerufen, die Adresse ist falsch (0x3D statt 0x3C) oder SDA und SCL sind vertauscht.
  • "SSD1306 allocation failed": Dem Uno geht der RAM aus; der Puffer eines 128×64-Displays belegt 1 KB. Schreibe Texte mit F(), verschiebe große Arrays in den PROGMEM oder nutze die sparsame Bibliothek U8g2.
  • Das Bild ist verstümmelt oder nur halb: Ein 128×32-Display wurde als 128×64 deklariert (oder umgekehrt); trage die richtige Größe ein.
  • Das Bild steht auf dem Kopf: mit display.setRotation(2) um 180 Grad drehen.
  • VCC und GND vertauscht: Das zerstört das Display dauerhaft; lies vor dem Anschließen die Pinbeschriftung.
  • Zufällige Hänger: Lange, lose I2C-Kabel; halte die Kabel kurz und senke bei Bedarf den I2C-Takt.

Ein OLED-Display ist der günstigste Weg, deinem Projekt einen professionellen Look zu geben. Musst du nur Zahlen zeigen, ist eine 7-Segment-Anzeige eine gute Wahl, für Text, der in der Sonne lesbar sein muss, ein I2C-LCD. In der BlueGrays-App findest du OLED-Spiele wie Pong und T-Rex, eine ESP32-Wetteranzeige, einen Parksensor und einen Temperaturlogger mit Schaltplänen und Code.

Häufige Fragen

Hat mein OLED-Display die Adresse 0x3C oder 0x3D?

Die meisten 128×64-OLED-Module nutzen 0x3C; manche werden über einen Widerstand auf der Rückseite zu 0x3D. Steht auf der Rückseite "0x78", ist das die 8-Bit-Schreibweise und entspricht 0x3C im Code. Sicher bist du mit dem I2C-Scanner.

Funktioniert das OLED-Display mit 5 V?

Die meisten SSD1306-Module haben einen Regler auf der Platine, können also mit 3,3 V oder 5 V versorgt und direkt an einen Arduino Uno angeschlossen werden. An ESP32 und Pico versorgst du das Modul über den 3V3-Pin, dann bleiben auch die I2C-Leitungen bei 3,3 V.

Warum erscheint der Fehler "SSD1306 allocation failed"?

Die Bibliothek will für ein 128×64-Display einen Bildpuffer von 1 KB reservieren; sind die 2 KB RAM des Arduino Uno mit anderen Variablen belegt, fehlt der Platz. Schreibe feste Texte mit dem Makro F(), verschiebe große Arrays in den PROGMEM oder nutze die Bibliothek U8g2, die seitenweise zeichnet.

Kann ein OLED-Display Sonderzeichen anzeigen?

Die Standardschrift von Adafruit GFX enthält keine Buchstaben wie ş, ğ oder Umlaute in UTF-8. Die Bibliothek U8g2 kann sie mit UTF-8-Unterstützung und Schriften mit großem Zeichensatz darstellen; mit Adafruit GFX musst du eine eigene Schrift erstellen oder die Buchstaben als Bitmaps zeichnen.

Gibt es farbige OLED-Displays?

SSD1306-Displays sind einfarbig; selbst bei zweifarbigen Modellen sind die Farben fest. Für farbige Bilder nutzt man farbige OLEDs mit SSD1331- oder SSD1351-Treiber oder farbige TFT-Displays wie ST7789 und ILI9341.

Kann ich zwei OLED-Displays an einen Arduino anschließen?

Ja. Änderst du die Adresse eines Displays durch Umsetzen des Widerstands auf der Rückseite auf 0x3D, teilen sich beide denselben I2C-Bus. Lässt sich die Adresse nicht ändern, nutzt du an ESP32 und Pico einen zweiten I2C-Bus oder einen I2C-Multiplexer wie den TCA9548A.

Alle Projekte ansehen
Pong-Spiel - SSD1306
#86Mittel
Premium

Pong-Spiel - SSD1306

Das klassische Pong-Spiel, gebaut mit Arduino und SSD1306 OLED-Display, ausgestattet mit einer autonomen künstlichen Intelligenz (CPU) Gegner, die sofort verfolgt die Bewegungen des Balls und reagiert

4.5(47)
65
OLED T-Rex Run: Arduino Dinosaurier Spiel 🦖
#87Fortgeschritten
Premium

OLED T-Rex Run: Arduino Dinosaurier Spiel 🦖

Wir haben das legendäre Dinosaurierspiel "No Internet" auf Hardware gebracht! Mit diesem Projekt, das wir mit Arduino, OLED-Display (SH1106/SSD1306) und TM1637-Punktestandanzeige entwickelt haben, kön

4.7(33)
53
ESP32 HTTPClient + Wetter-API (mit SSD1306-OLED-Display)
#134Fortgeschritten
Premium

ESP32 HTTPClient + Wetter-API (mit SSD1306-OLED-Display)

In diesem Projekt führen wir mit dem ESP32 über das Internet mithilfe von `HTTPClient.h` einen REST-API-Aufruf an die Wetter-API (wttr.in) durch. Im Gegensatz zur vorherigen I2C-LCD-Version verwenden wir hier ein SSD1306-OLED-Display (128×64) – dies ermöglicht große Schriftarten, Vektor-Symbole und eine reichhaltige visuelle Darstellung auf einem einzigen Bildschirm. Für die Wetteranzeige werden 7 verschiedene Vektor-Symbole (sonnig, teilweise bewölkt, bewölkt, regnerisch, schneereich, stürmisch

4.3(10)
18
ESP32 Deep Sleep – Batteriesparmodus (OLED + RTC-RAM-Zähler)
#135Fortgeschritten
Premium

ESP32 Deep Sleep – Batteriesparmodus (OLED + RTC-RAM-Zähler)

Der Deep-Sleep-Modus des ESP32 senkt den Stromverbrauch auf etwa 10 µA, indem er die CPU und die meisten Peripheriegeräte abschaltet, und ist für batteriebetriebene IoT-Geräte von entscheidender Bedeutung. In diesem Projekt verwenden wir drei verschiedene Weckquellen: den Timer (15 s), einen externen Pin (EXT0 – Taste GPIO 33) und die Berührungserkennung (T0/GPIO 4). Mit `RTC_DATA_ATTR` markierte Variablen bleiben während des Deep-Sleep-Modus erhalten – der Boot-Zähler, der Timer-Wake-Zähler und

4.3(10)
16
ESP32-Gebets-Rakat-Zähler (HC-SR04 + SSD1306-OLED + 2 Tasten)
#136Fortgeschritten
Premium

ESP32-Gebets-Rakat-Zähler (HC-SR04 + SSD1306-OLED + 2 Tasten)

Vergessen Sie manchmal beim Beten, wie viele Rak’ahs Sie bereits absolviert haben? Bei diesem Projekt wird ein Rak’ah-Zähler gebaut, der neben dem Gebetsteppich platziert wird und die Sujud zählt, sobald Sie Ihre Hand nähern. Der Ultraschall-Abstandssensor HC-SR04 erkennt die Annäherung der Hand, das SSD1306-OLED-Display zeigt die Anzahl der Rak’ahs an, und mit zwei Tasten können Sie zwischen 2, 3 oder 4 Rak’ahs wählen und den Zähler zurücksetzen. Dank einer intelligenten Zustandsmaschine gibt e

4.8(11)
14
ESP32-Farbmischerlampe (3 Potentiometer + RGB-LED + OLED)
#138Fortgeschritten
Premium

ESP32-Farbmischerlampe (3 Potentiometer + RGB-LED + OLED)

Eine intelligente Farbmischer-Lampe mit ESP32, die durch Drehen von drei Potentiometern die gewünschte Farbe mischt! Wenn Sie die Potentiometer für Rot, Grün und Blau drehen, ändert die RGB-LED mit gemeinsamer Kathode sofort ihre Farbe. Auf dem SSD1306-OLED-Display werden für jede Farbe Werte im Bereich von 0 bis 255, visuelle Füllbalken und der HEX-Webfarbcode (z. B. #FF8040) in Echtzeit angezeigt. Ein professionelles Mini-Farbstudio – vermittelt in einem einzigen Projekt Kenntnisse über die RG

4.7(6)
10
ESP32 Intelligente Beleuchtung (PIR + LDR + Relais + OLED)
#141Fortgeschritten
Premium

ESP32 Intelligente Beleuchtung (PIR + LDR + Relais + OLED)

Verwandle deinen Flur, dein Badezimmer oder deine Speisekammer mit dem ESP32 in intelligente Beleuchtung! Mit einem PIR-Bewegungssensor, einem LDR-Lichtsensor und einem Relaismodul realisieren wir das klassische Szenario "Licht geht an, wenn im Dunkeln Bewegung erkannt wird" — bei Tageslicht bleibt das Licht trotz Bewegung aus, was tagsüber Energie spart. Das Licht bleibt 30 Sekunden lang an; bei anhaltender Bewegung wird der Timer zurückgesetzt und das Licht bleibt länger an. Das SSD1306 OLED-D

4.3(6)
11
ESP32 Temperatur-Datenlogger (DHT22 + DS1307 RTC + microSD + OLED)
#144Fortgeschritten
Premium

ESP32 Temperatur-Datenlogger (DHT22 + DS1307 RTC + microSD + OLED)

Baue einen zeitgestempelten Temperaturlogger mit ESP32! Lese Temperatur/Feuchtigkeit vom DHT22 alle 10 Sekunden, hole die aktuelle Zeit vom DS1307 RTC und protokolliere auf microSD-Karte als CSV. Das OLED zeigt live Temperatur (große Schrift), Luftfeuchtigkeit, Zeitstempel und Logzähler. Die `/temp_log.csv`-Datei auf der SD-Karte öffnet sich in Excel, Google Sheets oder Python pandas zur Analyse — perfekt für Gewächshausüberwachung, Raumtemperaturverfolgung, Laboraufzeichnung, Lebensmittellageru

4.7(7)
12

Lerne, ein kleines, aber gestochen scharfes OLED-Display an den Arduino anzuschließen, Text und Formen zu zeichnen, Sensorwerte als Balkendiagramm zu zeigen, eigene Symbole einzubauen und die Lebensdauer des Displays zu verlängern.

OLED-Display (SSD1306) verwenden: Text, Formen und Grafiken mit Arduino | BlueGrays