Projekt I04 - Grafik und Text mit SSD1306
Beginner-Projekte B01-B08 abgeschlossen, I2C-Grundlagen aus B07 (LCD) hilfreich
Was du brauchst
Selbstleuchtendes OLED-Display ohne Hintergrundbeleuchtung. Hoher Kontrast und weiter Blickwinkel.
Aufloesung: 128 x 64 Pixel
Schnittstelle: I2C (4 Pins)
Farbe: Weiss auf Schwarz (monochrom)
I2C-Adresse: 0x3C (Standard)
OLED-Displays brauchen keine Hintergrundbeleuchtung - jedes Pixel leuchtet selbst. Das ergibt echtes Schwarz und hohen Kontrast, verbraucht aber mehr Strom bei viel weissem Inhalt.
Der SSD1306 hoert auf Adresse 0x3C. Mehrere I2C-Geraete koennen am selben Bus haengen!
Arduino Uno SSD1306
┌─────────┐ ┌─────────┐
│ │ │ │
│ A4 ────┼──SDA──┼── SDA │
│ │ │ │
│ A5 ────┼──SCL──┼── SCL │
│ │ │ │
│ 5V ────┼──VCC──┼── VCC │
│ │ │ │
│ GND ───┼──GND──┼── GND │
└─────────┘ └─────────┘
Geschwindigkeit: Standard 100 kHz, Fast 400 kHz
Verbindungen zum Arduino
Arduino Uno SSD1306 OLED
┌───────────┐ ┌──────────────┐
│ │ │ ┌──────┐ │
│ 5V ──────┼────────┼───┤ VCC │ │
│ │ │ └──────┘ │
│ GND ─────┼────────┼───┤ GND │ │
│ │ │ └──────┘ │
│ A4 ──────┼────────┼───┤ SDA │ │
│ │ │ └──────┘ │
│ A5 ──────┼────────┼───┤ SCL │ │
│ │ │ └──────┘ │
└───────────┘ └──────────────┘
A4 und A5 sind die festen I2C-Pins des Arduino Uno. Bei anderen Boards koennen diese Pins abweichen.
// Schritt 1: Libraries einbinden und Display initialisieren
#include <Wire.h> // I2C-Kommunikation
#include <Adafruit_GFX.h> // Grafik-Grundfunktionen
#include <Adafruit_SSD1306.h>
// Display-Konfiguration
#define SCREEN_WIDTH 128 // Breite in Pixel
#define SCREEN_HEIGHT 64 // Hoehe in Pixel
#define OLED_RESET -1 // Kein Reset-Pin
#define OLED_ADDR 0x3C // I2C-Adresse
// Display-Objekt erstellen
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);Wire.h - Arduino I2C-BibliothekAdafruit_GFX.h - ZeichenfunktionenAdafruit_SSD1306.h - Display-TreiberDer Konstruktor bekommt Breite, Hoehe, Wire-Objekt und Reset-Pin. -1 bedeutet: kein Hardware-Reset.
void setup() {
// Display starten (mit I2C-Adresse)
if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
Serial.println("SSD1306 nicht gefunden!");
while (true); // Anhalten bei Fehler
}
display.clearDisplay(); // Bildschirm loeschen
display.setTextSize(1); // Schriftgroesse (1-4)
display.setTextColor(SSD1306_WHITE);
display.setCursor(20, 10); // Position X=20, Y=10
display.println("Hallo Welt!");
display.setCursor(20, 30);
display.setTextSize(2); // Groessere Schrift
display.println("Arduino");
display.display(); // Buffer zum Display senden!
}Alle Zeichenbefehle schreiben nur in einen Speicherpuffer. Erst display.display() uebertraegt den Inhalt zum OLED!
void demoShapes() {
display.clearDisplay();
// Rechteck (nur Rahmen)
display.drawRect(0, 0, 128, 64, SSD1306_WHITE);
// Gefuelltes Rechteck
display.fillRect(10, 10, 30, 20, SSD1306_WHITE);
// Linie von (50,10) nach (120,50)
display.drawLine(50, 10, 120, 50, SSD1306_WHITE);
// Horizontale und vertikale Linien (schneller)
display.drawFastHLine(50, 30, 70, SSD1306_WHITE);
display.drawFastVLine(85, 10, 40, SSD1306_WHITE);
display.display(); // Nicht vergessen!
}drawRect(x, y, w, h, color) - RahmenfillRect(x, y, w, h, color) - GefuelltdrawLine(x0, y0, x1, y1, color)drawFastHLine(x, y, len, color)drawFastVLine(x, y, len, color)Simulation in Wokwi
Erstelle ein neues Projekt mit Arduino Uno und SSD1306:
Probiere diese Aufgaben aus
Grosse Zeitanzeige mit millis() - Stunden, Minuten und Sekunden
Balkendiagramm das den Potentiometer-Wert visualisiert
Einfaches Pong mit 2 Tastern fuer Auf/Ab-Bewegung
Ball-Animation die an den Raendern abprallt
Du beherrschst jetzt das OLED-Display
SDA/SCL Kommunikation verstanden
Schriftgroessen und Cursor gesetzt
Rechtecke und Linien gezeichnet
I05: NeoPixel RGB-LEDs - Adressierbare LEDs mit FastLED steuern