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

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

Kategorien: Arduino

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

Wir haben in unserem Shop beispielsweise das 0,91 Zoll I2C OLED-Display 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 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/

Ö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

 

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 (“ADAFRUIT SSD1306“)
https://github.com/adafruit/Adafruit-GFX-Library (“ADAFRUIT GFX”)

 

OLED-Install_DLL

 

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.

 


12 Comments

Ingo

20. November 2023 at 12:31 pm

Hallo Michael, leider funktioniert der sketch nicht. Habe beide Bibliotheken eingebunden, werden erkannt. Die Adresse des displays angepasst.
Nix passiert ausser kleinen sich bewegenden Streifen am oberen Rand.
Sketche mit SSD1306Ascii Bibliothek funktionieren einwandfrei.
Würde mich über Hilfe freuen.
Gruß Ingo

Bernd Schulze

17. Februar 2022 at 2:30 pm

Also ich habe bisher noch keinen Erfolg mit den Adafruit_SSD1306 Bibliotheken gehabt. Obwohl es keine Fehlermeldungen beim Hochladen gibt, wird auf dem Display nur Unfug dargestellt: haufenweise Pixel und nur eine Zeile Text oder Grafik, die zudem auch noch querscrollt ohne Grund. Eine Bibliothek namens “Tiny4kOLED.h” schaffte Abhilfe. Hier gibt es zwar nicht dieselben Befehle wie bei Adafruit, aber sie funktioniert wenigstens. Alles andere muss angepasst werden, ist eben so! Und sie verbraucht wenig Speicher, weil sie für ATtiny vorgesehen ist. Die Bibliothek “U8g2lib.h” macht auch keine Probleme. Sie ist aber hauptsächlich für grafische Dinge zu benutzen und daher sehr speicherintensiv, wie auch Adafruit. Es ist ausschlaggebend was man machen will.

Chrisotph Schultz

20. März 2021 at 12:03 pm

ja aber wenn der Oled-Display nur 4 Pins (sda, scl, gnd u vcc) hat und pin rst fehlt, dann muss du OLED_RESET auf -1 setzen, sonst bleibt dein Display dunkel…

Alfred Bernst

17. August 2020 at 7:07 pm

Hallo,
ich habe das 0,42 Zoll OLED Display mit dem Arduino in Betrieb!
Ich möchte die Anzeigen mit einem Attiny85 übernehmem!

Wäre nett wenn mir jemand helfen könnte.

Mfg.
Alfred

#include
#include
#define OLED_RESET 4
//eine neue instanz für das Display erzeugen
Adafruit_SSD1306 display(OLED_RESET);
//Variable zum speichern der aktuellen Zahl
int index = 0;
void setup() {
//aufbauen der Kommunikation zum Display mit der I2C Adresse 0x3C
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
//setzen der Textgröße auf den Wert 2
display.setTextSize(1);
//setzen der Textfarbe auf Weiß
display.setTextColor(WHITE);
}
void loop() {

delay(4000);
//löschen des inhalts des Displays
display.clearDisplay();
//positionieren des Cursors zum schreiben eines Textes
//an der Position X / Y
display.setCursor(46, 18);//36,12
//incrementieren des Index
//index = index +1;
//schreiben des Indexes auf das Display
display.println(“Polizei”);//String(index,DEC
display.display();
delay(3000);
display.clearDisplay();
display.setCursor(46, 18);
display.println(“Bitte”);
//aktualisieren des Displays
display.display();
delay(4000);
display.clearDisplay();
display.setCursor(46, 18);
display.println(“Folgen”);
//aktualisieren des Displays
display.display();

//eine kleine Pause von 25ms.
delay(25);
}

    Ronin

    17. August 2020 at 7:14 pm

    Hi Alfred,

    am Einfachsten geht das mit einer fertigen Library für den ATtiny.
    Selbst habe ich sie noch nicht getestet, aber schau Dir mal diese hier an: https://github.com/datacute/Tiny4kOLED

    Viel Erfolg und teile uns mit, ob Du mit dieser Library erfolgreich warst.

    Viele Grüße,
    Michael

Volkmar

6. August 2020 at 11:25 am

Hallo,
der Sketch ” I2C-Scanner ” ist sehr hilfreich. Jedoch ist es wichtig den Chipsatz des jeweiligen OLEDs zu ermitteln, um die richtige Bibliothek zu verwenden.
Gibt es eine Möglichkeit zum Auslesen oder eine Bedruckung, die ich übersehen habe?
Viele Grüße Volkmar

Reinhold Schäfer

25. April 2020 at 9:22 am

Super Sketch.
Ich habe eine Frage. Mit den Scrollmöglichkeiten, die gezeigt wurden, verschiebt sich das gesamte Display. Wie kann ich nur einen bestimmten Teil scrollen. Bsp. der Bereich Zeile 20, Spalte 15 bis Zeile 28, Spalte 128. Hierin soll ein Text durchlaufen. Längerer Text links verschwinden.

    Ronin

    25. April 2020 at 10:40 pm

    Hallo Reinhold,

    wenn ich richtig verstanden habe, was Du meinst, dann geht das gar nicht, denn Du musst den Bildschirm jedes Mal komplett neu aufbauen. Das läuft so schnell ab, dass unser träges Auge das als eine Bewegung wahrnimmt. Somit zeichnest Du quasi ein Daumenkino und jede einzelne Seite wird aufgebaut mit den Funktionen display() und wieder gelöscht mit clearDisplay(). Dazwischen setzt Du Pausen, bspw. mittels delay().

    Viele Grüße,
    Michael

michael

4. November 2019 at 7:47 pm

Super Projekte.Dreimal Daumen hoch.Weiter so

    Ronin

    4. November 2019 at 11:01 pm

    Dankeschön 🙂

    Viele Grüße, Michael

Thorsten Papendorff

30. September 2019 at 3:07 pm

Hallo, ich habe ein OLED Display mit 24Pins……wie schliesse ich dieses an??

    Ronin

    30. September 2019 at 7:32 pm

    Hallo Thorsten,

    das kann man so nicht einfach sagen. Ich hab hier bspw. ein Display mit 16 Pins. Werden nicht mal alle benötigt für einen Betrieb.
    Hast Du eine Typbeschreibung des Displays? Vielleicht kann ich Dir dann mehr dazu sagen.
    Ohne Infos wird es schwer das zum Laufen zu bekommen, denn wenn es ein Exot ist, kannst Du nicht auf Bibliotheken zurückgreifen und musst die Ansteuerung komplett selbst programmieren.

    Viele Grüße, Michael

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.