- kollino.de - https://www.kollino.de -

OLED-Display mit SSD1306-Chipsatz via I2C an Arduino anschließen

OLED-Display mit SSD1306-Chipsatz via I2C an Arduino anschließen

Wir haben in unserem Shop beispielsweise das 0,91 Zoll I2C OLED-Display [1] im Angebot.

Dieses Display wird mit dem SSD1306-Chipsatz angesteuert und somit lässt es sich ganz einfach mit einem Arduino verwenden, da es eigens für diesen Chipsatz eine, bzw. mehrere Bibliotheken gibt.
Damit können wir mit einigen wenigen Befehlen ganz einfach Inhalte auf dem Display darstellen.

Fangen wir mit der Verkabelung an. Das Display hat vier Anschlüsse, die wir mit einem Arduino Uno wie folgt verbinden:

VCC (Display) an +5V (Arduino) – (oder externe Stromquelle),
GND (Display) an GND (Arduino) für eine gemeinsames Bezugspotential (falls externe Stromquelle, dann den Minuspol der Stromquelle auch auf GND legen),
SDA (Display) an Pin A4 (Arduino Uno SDA-Pin),
SCL oder SCK (Display) an den Pin A5 (Arduino Uno SCL-Pin)

Mehr müsst Ihr nicht machen.

Auszug aus der Arduino-Referenz [2] für Wire: Mit dieser Bibliothek können Sie mit I2C / TWI-Geräten kommunizieren. Auf den Arduino-Boards mit dem R3-Layout (1.0-Pinbelegung) befinden sich SDA (Datenleitung) und SCL (Taktleitung) auf den Pin-Headern in der Nähe des AREF-Pins. Der Arduino Due verfügt über zwei I2C / TWI-Schnittstellen SDA1 und SCL1 in der Nähe des AREF-Pins und die zusätzliche befindet sich an den Pins 20 und 21.

Als Referenz zeigt die folgende Tabelle, wo sich TWI-Pins auf den verschiedenen Arduino-Boards befinden.

Board I2C / TWI-Pins
Uno, Ethernet A4 (SDA), A5 (SCL)
Mega2560 20 (SDA), 21 (SCL)
Leonardo 2 (SDA), 3 (SCL)
Fällig 20 (SDA), 21 (SCL), SDA1 , SCL1

 

Jetzt müssen wir im nächsten Schritt die I2C-Adresse des Displays herausfinden.

Hierfür gibt es einen Sketch, den man zuerst auf den Arduino hochladen muss und dann automatisch die Adresse des angeschlossenen Displays heraus zu finden:

Quelle: https://playground.arduino.cc/Main/I2cScanner/ [3]

Öffnet in Eurer Arduino IDE unter “Werkzeuge“->”Serieller Monitor” den seriellen Monitor. Falls keine Ausgabe zu sehen ist, den Arduino ggf. nochmal resetten.
Notiert Euch nun die genaue Adresse, die ausgegeben wird.

I2C-Scanner Ergebnis [4]

 

Jetzt benötigen wir noch die entsprechenden Bibliotheken für das Display, die wir herunterladen und dann über den Menüpunkt “Bibliothek einbinden” in unsere Arduino IDE einbinden müssen. Entweder beim Download via “.ZIP-Bibliothek hinzufügen …“, oder, wie im Screenshot zu sehen, über “Bibliotheken verwalten”  zu suchen und einzubinden :

https://github.com/adafruit/Adafruit_SSD1306 [5] (“ADAFRUIT SSD1306“)
https://github.com/adafruit/Adafruit-GFX-Library [6] (“ADAFRUIT GFX”)

 

OLED-Install_DLL [7]

 

Nachdem diese eingebunden sind, gibt es in der Arduino IDE unter dem Menüpunkt “Datei“->”Beispiele“->”Adafruit SSD1306” einen Sketch namens “ssd1306_128x32_i2c“.

In diesem wird unter den jeweiligen Funktionen genau erklärt, wie Ihr diverse grafische Objekte wie einfache Linien, Dreiecke, Vierecke, usw., oder aber auch eigene Logos, Symbole, usw. anzeigen lassen könnt.
In diesem Tutorial gehe ich nicht näher auf diese grafischen Möglichkeiten  ein (machen wir vielleicht in einem anderen), da es einfach zu umfangreich ist.

Wir schauen uns den einfachen Textmodus ein wenig genauer an. Um einen eigenen Sketch zu erstellen, sind folgende Zeilen aus dem Beispielprogramm notwendig. Damit werden die Bibliotheken geladen (*.h), so wie einige Displayparameter wie Breite und Höhe definiert:

 

Haben wir eine andere I2C-Displayadresse als 0x3C, dann müssen wir das unbedingt in dieser Zeile anpassen, sonst wird das Display nicht gefunden und das Programm wird gleich wieder beendet.

 

Um das Display anzusteuern, gibt es nun die folgenden Befehle:

display.clearDisplay() – Display wird vollständig bereinigt
display.drawPixel(x,y, color) – Zeichnet einen Pixel auf die x,y-Koordinaten
display.setTextSize(n) – Schriftgröße festlegen. Von 1 bis 8. (bei einem zweizeiligen Display natürlich nicht mehr wie 2 🙂 )
display.setCursor(x,y) – Setzt den Cursor an die x,y-Position, an der der Text beginnen soll
display.print(“message”) – zeigt den Text an den zuvor festgelegten Koordinaten
display.display() – Das wird immer am Ende der Befehlskette aufgerufen, damit die vorher aufgebaute/zusammengesetzte Text/Grafik-Ausgabe zum Display zur Ausgabe gesendet wird.

Beispiel für eine Textzeile:

 

So, jetzt das Ganze nochmal am Stück:

Der Ausgabeteil der Textausgabe zwischen Zeile 21-26 kann natürlich auch in der Loop-Schleife verwendet und jederzeit modifiziert werden. Je nachdem, was angezeigt werden soll.

Eine Kleinigkeit gilt es noch zu beachten bei der Verwendung von Displays: Ein Display zeigt immer das letzte an, dass ihm befohlen wurde darzustellen. So lange, wie es genügend Strom bekommt.
Das heißt, man muss immer, wenn man neue Informationen anzeigen lassen will, den alten Inhalt zuerst löschen (display.clearDisplay();) und neu schreiben, sonst überschreibt man den vorhandenen Inhalt mit dem neuen Inhalt und hat nur noch  Kraut und Rüben auf dem Display.

Ein fleißiger Bastler (vielen Dank, Gregor) hat einen kleinen Sketch für den AtMega 2560 (läuft aber auch mit anderen Arduinos. Schaut nur, wo SDA und SCL(SCK) angeschlossen werden muss) erstellt. Mit einem Taster, der an Pin 2 angeschlossen ist, ändert sich eine Laufschrift auf dem Display. Probiert es einfach mal aus. Man kann sehr schöne Dinge mit so einem Display machen. Vor allem, wenn es ein grafikfähiges Display wie dieses ist.

Ein weiteres Programm für das Display von Gregor. Einfach anschließen. Weitere Hardware wird nicht benötigt.
Hier wird nicht nur Text angezeigt, sondern auch geometrische Formen, Rahmen, Linien, Kreise und Scrollen von Displayinhalten.