OLED Display 0,96 Zoll mit Arduino: Schaltung und Beispielsketch

Board: Arduino
Hinzugefügt: 17. April 2025
cpp
/**
 * OLED-Display "Hallo Welt!" Test für Arduino Uno
 * 
 * Dieser Sketch zeigt "Hallo Welt!" auf einem 0.96" OLED-Display
 * mit SSD1306-Controller über I2C-Kommunikation an.
 * 
 * Hardware-Verbindungen:
 * - OLED VCC -> Arduino 5V (oder 3.3V - abhängig vom Display)
 * - OLED GND -> Arduino GND
 * - OLED SCL -> Arduino A5 (SCL)
 * - OLED SDA -> Arduino A4 (SDA)
 * 
 * Bibliotheken, die installiert werden müssen:
 * - Adafruit SSD1306
 * - Adafruit GFX Library
 */

// Einbinden der benötigten Bibliotheken
#include 
#include 
#include 

// Definieren der Display-Parameter
#define SCREEN_WIDTH 128    // OLED-Display-Breite in Pixeln
#define SCREEN_HEIGHT 64    // OLED-Display-Höhe in Pixeln
#define OLED_RESET -1       // Reset-Pin (-1, wenn der Arduino Reset-Pin geteilt wird)
#define SCREEN_ADDRESS 0x3C // I2C-Adresse des Displays (typischerweise 0x3C oder 0x3D)

// Erstellen des Display-Objekts
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  // Initialisierung der seriellen Kommunikation zur Fehlersuche
  Serial.begin(9600);
  Serial.println("OLED 'Hallo Welt!' Test für Arduino Uno");

  // Initialisierung des Displays
  // SSD1306_SWITCHCAPVCC = Spannungsversorgung intern generieren
  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println("SSD1306-Initialisierung fehlgeschlagen");
    for (;;); // Endlosschleife bei Fehler
  }

  // Display löschen und Puffer leeren
  display.clearDisplay();

  // Textparameter konfigurieren
  display.setTextSize(1);                // Textgröße 1 (1:1 Pixelverhältnis)
  display.setTextColor(SSD1306_WHITE);   // Weißer Text auf schwarzem Hintergrund
  display.setCursor(0, 0);               // Startposition des Textes (x, y)

  // Text zum Puffer hinzufügen
  display.println("Hallo Welt!");

  // Zweite Textzeile hinzufügen mit etwas mehr Info
  display.setCursor(0, 20);
  display.println("Arduino Uno Test");

  // Inhalt des Puffers auf dem Display anzeigen
  display.display();

  Serial.println("Setup abgeschlossen. Text wird auf dem Display angezeigt.");
}

void loop() {
  // Nichts zu tun im Hauptloop, da wir den Text nur einmal anzeigen
  // Hier könnten Erweiterungen wie blinkender Text oder
  // wechselnde Inhalte implementiert werden.
}

Informationen zum Code

Arduino Uno - OLED Display Anschlussanleitung

OLED-Displays sind eine beliebte Ergänzung für Arduino-Projekte, da sie hell, energieeffizient und einfach zu bedienen sind. Diese Anleitung zeigt dir, wie du ein I2C OLED-Display mit deinem Arduino Uno verbindest und programmierst.

Was sind OLED-Displays?

OLED (Organic Light Emitting Diode) Displays bieten gegenüber herkömmlichen LCD-Displays mehrere Vorteile:

  • Hoher Kontrast - echte schwarze Pixel, da keine Hintergrundbeleuchtung benötigt wird
  • Geringer Stromverbrauch - ideal für batteriebetriebene Projekte
  • Schnelle Reaktionszeit - keine Verzögerungen bei Animationen
  • Weiter Betrachtungswinkel - von fast allen Seiten gut ablesbar
  • Kompakte Bauweise - dünner als LCDs

Die meisten für Arduino verwendeten OLED-Displays basieren auf dem SSD1306-Controller und kommunizieren über den I2C-Bus, was die Verkabelung vereinfacht.

Hinweis: Diese Anleitung ist für monochrome OLED-Displays mit I2C-Schnittstelle. Farbige OLED-Displays oder Displays mit SPI-Schnittstelle erfordern andere Anschlüsse und Bibliotheken.

Pinbelegung

Der Anschluss eines I2C OLED-Displays an einen Arduino Uno ist dank des I2C-Bus sehr einfach und benötigt nur 4 Verbindungen:

OLED Display Pin Arduino Uno Pin Beschreibung
VCC 5V oder 3.3V Stromversorgung (je nach Display-Typ)
GND GND Masse
SCL A5 I2C Clock-Leitung
SDA A4 I2C Data-Leitung
6801621420989_arduino_oled_schaltung.webp
Schematische Darstellung des Anschlusses eines OLED-Displays an einen Arduino Uno

Achtung: Überprüfe die Spezifikationen deines OLED-Displays, bevor du es anschließt. Manche Displays benötigen 3.3V, während andere mit 5V betrieben werden können. Ein Anschluss an die falsche Spannung kann dein Display beschädigen!

Benötigte Bibliotheken

Für die Verwendung eines OLED-Displays benötigst du folgende Bibliotheken:

  • Adafruit SSD1306: Für die Steuerung des OLED-Displays
  • Adafruit GFX Library: Für die Grafikfunktionen
  • Wire.h: Für die I2C-Kommunikation (standardmäßig in Arduino enthalten)

Installation der Bibliotheken

So installierst du die benötigten Bibliotheken über den Bibliotheksverwalter:

  1. Öffne die Arduino IDE
  2. Navigiere zu Werkzeuge > Bibliotheken verwalten
  3. Suche nach "Adafruit SSD1306" und installiere diese Bibliothek
  4. Suche nach "Adafruit GFX" und installiere diese Bibliothek

Alternativ kannst du die Bibliotheken auch manuell von GitHub herunterladen:

I2C-Adresse

Die Standard-I2C-Adresse des Displays ist 0x3C. Falls dein Display nicht erkannt wird, versuche 0x3D als alternative Adresse.

Um herauszufinden, welche Adresse dein Display verwendet, kannst du einen I2C-Scanner verwenden. Hier ist ein einfacher Code dafür:

#include 

void setup() {
  Wire.begin();
  Serial.begin(9600);
  Serial.println("I2C Scanner bereit!");
}

void loop() {
  byte error, address;
  int deviceCount = 0;
  
  Serial.println("Scanning...");
  
  for(address = 1; address < 127; address++) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    
    if (error == 0) {
      Serial.print("I2C-Gerät gefunden an Adresse 0x");
      if (address < 16) {
        Serial.print("0");
      }
      Serial.println(address, HEX);
      deviceCount++;
    }
  }
  
  if (deviceCount == 0) {
    Serial.println("Keine I2C-Geräte gefunden!");
  } else {
    Serial.println("Scan abgeschlossen!");
  }
  
  delay(5000); // Warte 5 Sekunden, dann scanne erneut
}

Display-Initialisierung

Hier ist ein Beispiel, wie du das OLED-Display initialisierst:

#include 
#include 
#include 
#include 

#define SCREEN_WIDTH 128    // OLED-Display-Breite in Pixeln
#define SCREEN_HEIGHT 64    // OLED-Display-Höhe in Pixeln
#define OLED_RESET -1       // Reset Pin (-1 = teilt Arduino Reset Pin)
#define SCREEN_ADDRESS 0x3C // Siehe Adresse deines Displays (0x3C oder 0x3D)

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  Serial.begin(9600);
  
  // SSD1306 Display initialisieren
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 Initialisierung fehlgeschlagen"));
    for(;;); // Programm anhalten, wenn Display nicht gefunden wurde
  }

  // Display leeren
  display.clearDisplay();
  
  // Grundeinstellungen
  display.setTextSize(1);              // Normale Textgröße
  display.setTextColor(SSD1306_WHITE); // Weißer Text
  display.setCursor(0, 0);             // Start links oben
  
  // Text anzeigen
  display.println(F("OLED Test"));
  display.println(F("Es funktioniert!"));
  
  // Änderungen anzeigen
  display.display();
}

void loop() {
  // Hier kommt dein Code hin
}

Beispiel mit Text und Grafik

Hier ist ein komplettes Beispiel, das Text und einige Grafikelemente auf dem Display zeigt:

#include 
#include 
#include 
#include 

#define SCREEN_WIDTH 128    // OLED-Display-Breite in Pixeln
#define SCREEN_HEIGHT 64    // OLED-Display-Höhe in Pixeln
#define OLED_RESET -1       // Reset Pin (-1 = teilt Arduino Reset Pin)
#define SCREEN_ADDRESS 0x3C // Siehe Adresse deines Displays (0x3C oder 0x3D)

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  Serial.begin(9600);
  
  // SSD1306 Display initialisieren
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 Initialisierung fehlgeschlagen"));
    for(;;); // Programm anhalten, wenn Display nicht gefunden wurde
  }

  // Display leeren
  display.clearDisplay();
}

void loop() {
  // Text demonstrieren
  textDemo();
  delay(2000);
  
  // Formen zeichnen
  drawShapes();
  delay(2000);
  
  // Animation zeigen
  bounceDemo();
  delay(1000);
}

void textDemo() {
  display.clearDisplay();
  
  // Verschiedene Textgrößen demonstrieren
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println(F("Hello, Arduino!"));
  
  display.setTextSize(2);
  display.setCursor(0, 16);
  display.println(F("Size 2"));
  
  display.setTextSize(3);
  display.setCursor(0, 36);
  display.println(F("BIG"));
  
  display.display();
}

void drawShapes() {
  display.clearDisplay();
  
  // Rechteck zeichnen
  display.drawRect(0, 0, 60, 30, SSD1306_WHITE);
  
  // Gefüllter Kreis
  display.fillCircle(95, 15, 15, SSD1306_WHITE);
  
  // Linie zeichnen
  display.drawLine(0, 40, 127, 40, SSD1306_WHITE);
  
  // Dreiecke zeichnen
  display.fillTriangle(
    30, 60, 60, 45, 90, 60,
    SSD1306_WHITE);
  
  display.display();
}

void bounceDemo() {
  const int ballSize = 8;
  int x = random(ballSize, SCREEN_WIDTH - ballSize);
  int y = random(ballSize, SCREEN_HEIGHT - ballSize);
  int xSpeed = 2;
  int ySpeed = 1;
  
  for(int i = 0; i < 60; i++) { // Animation für 60 Frames
    display.clearDisplay();
    
    // Position aktualisieren
    x += xSpeed;
    y += ySpeed;
    
    // Auf Kollision mit Rändern prüfen
    if(x <= ballSize || x >= SCREEN_WIDTH - ballSize) {
      xSpeed = -xSpeed;
    }
    if(y <= ballSize || y >= SCREEN_HEIGHT - ballSize) {
      ySpeed = -ySpeed;
    }
    
    // Ball zeichnen
    display.fillCircle(x, y, ballSize, SSD1306_WHITE);
    display.display();
    delay(50);
  }
}

Anpassungen für verschiedene Display-Größen

Wenn dein Display andere Abmessungen als 128x64 Pixel hat, passe diese Parameter im Code an:

#define SCREEN_WIDTH 128    // OLED-Display-Breite in Pixeln
#define SCREEN_HEIGHT 64    // OLED-Display-Höhe in Pixeln

Übliche OLED-Display-Größen sind:

  • 128x64 - Standard-Größe
  • 128x32 - Häufig bei kleineren Displays
  • 96x16 - Schmale Displays
  • 64x48 - Kompakte quadratische Displays

Display-Rotation

Um das Display zu drehen, füge nach der Display-Initialisierung folgende Zeile hinzu:

display.setRotation(2); // Werte 0-3 für 0°, 90°, 180°, 270°

Die Werte für setRotation() entsprechen folgenden Drehungen:

  • 0 - Keine Drehung (0°)
  • 1 - 90° im Uhrzeigersinn
  • 2 - 180° gedreht (umgedreht)
  • 3 - 270° im Uhrzeigersinn (90° gegen den Uhrzeigersinn)

Text-Formatierung und Positionierung

Die Adafruit GFX Bibliothek bietet verschiedene Möglichkeiten zur Text-Formatierung:

// Textgröße festlegen (1-6)
display.setTextSize(1); // 1 ist die kleinste Größe

// Textfarbe festlegen
display.setTextColor(SSD1306_WHITE); // Weißer Text (Standard)
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Invertierter Text

// Cursor-Position setzen
display.setCursor(0, 0); // x, y Position in Pixeln

// Text ausrichten (nur für Textblock mit mehreren print-Befehlen)
display.setTextWrap(true); // Zeilenumbruch aktivieren (Standard)
display.setTextWrap(false); // Zeilenumbruch deaktivieren

// Text ausgeben
display.print("Normaler Text");
display.println("Mit Zeilenumbruch");

// Nach jedem Zeichnen display.display() aufrufen, um Änderungen zu zeigen
display.display();

Energiesparfunktionen

OLED-Displays verbrauchen weniger Strom als LCDs, können aber dennoch in batteriebetriebenen Projekten optimiert werden:

// Display ausschalten (niedriger Stromverbrauch)
display.ssd1306_command(SSD1306_DISPLAYOFF);

// Display wieder einschalten
display.ssd1306_command(SSD1306_DISPLAYON);

// Helligkeit einstellen (0x00 bis 0xFF)
display.ssd1306_command(SSD1306_SETCONTRAST);
display.ssd1306_command(0x8F); // Wert zwischen 0 und 255

Tipp: Wenn du das Display nur gelegentlich aktualisieren musst, kannst du es zwischen den Aktualisierungen ausschalten, um Strom zu sparen. Beachte, dass das Display seinen Inhalt behält, auch wenn es ausgeschaltet ist.

Fehlerbehebung

Hier sind einige häufige Probleme und deren Lösungen:

  • Display bleibt leer: Überprüfe die Verkabelung und die I2C-Adresse. Benutze den I2C-Scanner, um die richtige Adresse zu ermitteln.
  • Unscharfe oder fehlerhafte Anzeige: Überprüfe die eingestellte Display-Größe in deinem Code. Möglicherweise wird eine falsche Größe verwendet.
  • Fehler "Adafruit SSD1306 allocation failed": Dein Arduino hat nicht genügend RAM. Versuche, weniger Variablen zu verwenden oder den Code zu optimieren.
  • Nur ein Teil des Displays funktioniert: Überprüfe die Stromversorgung. Manche Displays benötigen mehr Strom für eine vollständige Anzeige.
  • Text ist invertiert/negativ: Du verwendest möglicherweise SSD1306_BLACK für die Textfarbe statt SSD1306_WHITE.

Wenn dein Display extrem heiß wird oder Rauch entwickelt, trenne sofort die Stromversorgung! Dies ist ein Zeichen für einen Kurzschluss oder eine falsche Verkabelung.

Weiterführende Projekte

Nach dem erfolgreichen Anschluss deines OLED-Displays könntest du folgende Projekte ausprobieren:

  • Temperatur- und Feuchtigkeitsanzeige mit einem DHT22-Sensor
  • Mini-Wetterstation mit Barometer und Außentemperatur
  • Batterieanzeige für batteriebetriebene Projekte
  • Kleinspannungs-Messgerät mit Spannungsanzeige
  • Arduino-Spiel mit einfacher Grafik (z.B. Pong, Snake)
  • Status-Display für Smart Home mit Raumtemperatur und Luftqualität

Die Möglichkeiten sind nahezu endlos, und ein OLED-Display verleiht deinen Arduino-Projekten eine professionelle visuelle Komponente!