Raspberry Pi Pico: OLED-Display mit I2C programmieren (SSD1306)

Die Bezeichnung „SSD1306“ wird im Zusammenhang mit monochromen OLED-Displays verwendet. Es handelt sich dabei aber nicht um die Display-Bezeichnung, sondern die Bezeichnung für den Chip mit dem das Display angesteuert wird. Will man das Display programmieren, muss man den SSD1306-Chip programmieren.

Für die Darstellung von Text existiert ein Zeichensatz mit einer Schrift mit fester Breite.

  • Ein Display mit 128 x 64 Pixeln hat 6 ganze Zeilen mit 16 Zeichen. Die 7. Zeile eignet sich nicht zur Darstellung von Text, weil diese Zeile unten abgeschnitten ist.
  • Ein Display mit 128 x 32 Pixeln hat 3 ganze Zeilen mit 16 Zeichen. Die 4. Zeile eignet sich nicht zur Darstellung von Text, weil diese Zeile unten abgeschnitten ist.

Zwei Dinge gibt es noch zu beachten.

  • Bei der Ausgabe von Text muss man sich selber um die Zeilenumbrüche kümmern. Überlanger Text wird nach 16 Zeichen einfach abgeschnitten.
  • Grundsätzlich lassen sich alle Pixel einzeln ansteuern. Man kann also auch vergleichsweise komplexe Grafiken darstellen.
  • Tatsächlich kann das Display nur einfarbig Darstellen. Man kann einen einzelnen Pixel leuchte lassen oder ausschalten.

Wir wollen hier ausprobieren, wie wir das OLED-Display hardwareseitig und softwareseitig ansteuern, und was wir alles mit dem OLED-Display machen können. Dazu experimentieren wir im folgenden Programmcode mit Text, einzelnen Pixeln und dem Zeichnen einfacher Formen.

Aufbau und Bauteile

Raspberry Pi Pico: OLED-Display mit I2C programmieren (SSD1306)

Hinweis: In diesem Beispiel wird ein 0,96 Zoll großes OLED-Display mit 128 x 64 Pixeln verwendet. Man kann selbstverständlich auch ein Display mit 128 x 32 Pixeln verwenden. Nur wird dann mit dem folgenden Programmcode nicht alles dargestellt.

Raspberry Pi Pico Display
Pin 38 GND GND
Pin 36 VCC +3,3V VCC
Pin 22 GPIO 17 SCL/SCK
Pin 21 GPIO 16 SDA

MicroPython-Bibliothek für OLED-Display mit SSD1306

Zur Ansteuerung des OLED-Displays (SSD1306) ist eine externe Bibliothek erforderlich, die kann über den integrierten Paket-Manager der Thonny Python IDE sehr leicht installiert werden.

  • Der Raspberry Pi Pico auf dem die Pakete verwaltet werden sollen, muss mit dem Host-Computer verbunden sein.
  • Im Menü „Werkzeuge“ oder „Extras“ klickt man auf „Verwalte Pakete“. Darüber erreicht man die Verwaltungsoberfläche des Paketmanagers.
  • Dort gibt man ins Suchfeld ssd1306 ein. Darunter werden die Suchergebnisse angezeigt.
  • Das Paket mit der Bezeichnung ssd1306 @ micropython-lib klickt man an und anschließend auf den Button „Installieren“.

Programmcode

Im Programmcode werden die Bibliotheken geladen und dann die I2C-Schnittstelle und das OLED-Display initialisiert. Anschließend werden verschiedene sinnvolle Möglichkeiten der Darstellung beispielhaft realisiert:

  • Text zeilenweise darstellen
  • Überlangen Text darstellen
  • Pixel-Test
  • Blinkender Pixel in der Mitte
  • Display ausschalten
  • Display einschalten
  • Darstellung invertiert
  • Helligkeit ändern
  • Darstellung um 180 Grad drehen
  • Horizontale Linie zeichnen (von links nach rechts)
  • Vertikale Linie zeichnen (von oben nach unten)
  • Linien zeichnen
  • Rechteck zeichnen
  • Gefülltes Rechteck zeichnen

Damit die Anzeige richtig interpretiert werden kann, wird zusätzlich auf der Kommandozeile angezeigt, was auf dem Display dargestellt bzw. welche Funktion gerade ausgeführt wird.

Die Variable „pause“ gibt in Sekunden an, wie lange zwischen den unterschiedlichen Darstellungen gewartet werden soll.

# Bibliotheken laden
from machine import Pin, I2C
import ssd1306
import time

# Wartezeit zwischen den Darstellungen
pause = 4 # Sekunden

# Pin-Konfiguration
i2c_scl_gpio = 17
i2c_sda_gpio = 16

print('I2C Initialisieren')
i2c = I2C(0, scl=Pin(i2c_scl_gpio), sda=Pin(i2c_sda_gpio))

print('OLED-Display initialisieren')
oled_width = 128 # Breite: Pixel
oled_height = 64 # Höhe: Pixel
#oled_width = 128 # Breite: Pixel
#oled_height = 32 # Höhe: Pixel
display = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
time.sleep(0.1)

print('Text zeilenweise darstellen')
display.text('Hallo Welt 1', 0, 0) # Text, X, Y
display.text('Hallo Welt 2', 0, 10)
display.text('Hallo Welt 3', 0, 20)
display.text('Hallo Welt 4', 0, 30)
display.text('Hallo Welt 5', 0, 40)
display.text('Hallo Welt 6', 0, 50)
display.text('Hallo Welt 7', 0, 60)
display.show()

time.sleep(pause)

print('Display löschen')
display.fill(0)
display.show()

print('Überlangen Text darstellen')
display.text('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 0, 0) # Text, X, Y
display.text('abcdefghijklmnopqrstuvmxyz', 0, 20)
display.show()

time.sleep(pause)

print('Display löschen')
display.fill(0)
display.show()

print('Pixel-Test')
display.fill(1)
display.show()

time.sleep(pause)

print('Display löschen')
display.fill(0)
display.show()

print('Blinkender Pixel in der Mitte')
for _ in range (10):
    display.pixel(63, 32, 1) # X, Y, AN
    display.show()
    time.sleep(0.5)
    display.pixel(63, 32, 0) # X, Y, AUS
    display.show()
    time.sleep(0.5)

print('Display löschen')
display.fill(0)
display.show()

print('Display-Funktionen')
display.text('Display-', 28, 15)
display.text('Funktionen', 20, 35)
display.show()

time.sleep(pause)

print('Display ausschalten')
display.poweroff()

time.sleep(pause)

print('Display einschalten')
display.poweron()

print('Darstellung invertiert')
display.invert(True)
display.show()
time.sleep(pause)
print('Darstellung normal')
display.invert(False)
display.show()

time.sleep(pause)

print('Helligkeit ändern')
for brightness in range (0, 100, 10):
    display.contrast(brightness)
    time.sleep(0.5)

time.sleep(pause)

print('Darstellung um 180 Grad drehen')
display.rotate(0)
time.sleep(pause)
display.rotate(1)

time.sleep(pause)

print('Display löschen')
display.fill(0)
display.show()

print('Horizontale Linie (von links nach rechts) zeichnen')
display.hline(0, 0, 128, 1) # Startpunkt: x,y, width (Länge auf X-Achse), colour (Farbe)
display.show()

time.sleep(pause)

print('Vertikale Linie (von oben nach unten) zeichnen')
display.vline(0, 0, 63, 1) # Startpunkt: x,y, height (Länge auf Y-Achse), colour (Farbe)
display.show()

time.sleep(pause)

print('Linien zeichnen')
display.line(10, 10, 117, 53, 1) # Von x,y / Nach x,y / Farbe
display.show()
time.sleep(pause)
display.line(117, 53, 10, 10, 1) # Von x,y / Nach x,y / Farbe
display.show()

time.sleep(pause)

print('Rechteck zeichnen')
display.rect(10, 10, 108, 44, 1) # Von x,y / Pixel nach rechts,unten / Farbe
display.show()

time.sleep(pause)

print('Gefülltes Rechteck zeichnen')
display.fill_rect(20, 20, 88, 24, 1) # Von x,y / Pixel nach rechts,unten / Farbe
display.show()

print('Ende')

Hinweis: In der Informatik gilt, dass „0“ auch einen Wert hat. Das heißt man beginnt im Display für die X-Achse und Y-Achse bei „0“ zu zählen und endet bei einer Breite von 128 Pixeln bei „127“. Entsprechend bei der Höhe um 1 weniger als die Anzahl der Pixel.

I2C verbinden und programmieren

Um Probleme mit dem I2C, dessen Verkabelung und Konfiguration im Programmcode auszuschließen, kann man erstmal einen I2C-Scan durchführen, der die Adressen (in dezimaler Schreibweise) der Geräte, die mit diesem I2C-Bus verbunden sind anzeigt.

Anwendungen: OLED-Display zum Anzeigen der Kommandozeile

Ein mehrzeiliges OLED-Display kann vergleichsweise einfach als Ersatz für die Anzeige der Kommandozeile in der Thonny Python IDE verwendet werden.

Weitere verwandte Themen:

Frag Elektronik-Kompendium.de

Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython

Elektronik-Set Pico Edition

Das Elektronik-Set Pico Edition ist ein Bauteile-Sortiment mit Anleitung zum Experimentieren und Programmieren mit MicroPython.

  • LED: Einschalten, ausschalten, blinken und Helligkeit steuern
  • Taster: Entprellen und Zustände anzeigen
  • LED mit Taster einschalten und ausschalten
  • Ampel- und Lauflicht-Steuerung
  • Elektronischer Würfel
  • Eigene Steuerungen programmieren

Elektronik-Set jetzt bestellen Online-Workshop buchen

Online-Workshop: Programmieren mit dem Raspberry Pi Pico

Programmieren mit dem Raspberry Pi Pico

Gemeinsam mit anderen und unter Anleitung experimentieren? Wir bieten unterschiedliche Online-Workshops zum Raspberry Pi Pico und MicroPython an. Einführung in die Programmierung, Sensoren programmieren und kalibrieren, sowie Internet of Things und Smart Home über WLAN und MQTT.

Online-Workshop buchen

Besuchen Sie unser fast monatlich stattfindendes Online-Meeting PicoTalk und lernen Sie uns kennen. Die Teilnahme ist kostenfrei.

Termine und Newsletter-Anmeldung

 

Elektronik-Sets für das Hardware-nahe Programmieren