Anzeige auf einem OLED Display (I2C-Bus)

Schnell können diese kleinen Bildschirme zum laufen gebracht werden.
Hier ein Anschluss Beispiel für ein OLED-Display SSD1306, das per I²C Bus kommuniziert, mit 4 Anschlüssen.
Immer vorab das passende Datenblatt des Herstellers nach Gerätenamen, Typ, Funktion, Spannungsversorgung, Auflösung prüfen.

Was ist I²C

I²C, auch bekannt als Inter-Integrated Circuit, ist ein serieller Datenbus, der 1982 entwickelt wurde. Es hat sich zu einem weitgehend akzeptierten Industriestandard entwickelt und wird hauptsächlich für die interne Kommunikation zwischen verschiedenen Schaltungsteilen verwendet, z. B. innerhalb eines Fernsehgerätes oder zwischen einem Controller und Peripherie-ICs.
Die Besonderheit von I²C ist, dass es mit lediglich 2 Leitungen mit normalerweise bis zu 128 Teilnehmern kommunizieren kann. Es handelt sich dabei um eine Taktleitung (SCL) und eine Datenleitung (SDA). Die Datenübertragung erfolgt seriell, d.h., die Daten werden hintereinander über eine Leitung geschickt.
Es gibt verschiedene Übertragungsraten im I²C-Protokoll, darunter der Standardmodus mit 100 kbit/s, der „schnelle“ Modus (Fast-mode) mit 400 kbit/s, der „Fast-mode Plus“ (Fm+) mit bis zu 1 Mbit/s und der „Ultra Fast-mode“ (Ufm), der unidirektionale Übertragungsraten bis zu 5 Mbit/s unterstützt.
Die Kommunikation im I²C-Bus findet immer zwischen einem Master und den Slaves statt. Der Master kann entweder Daten an Slaves senden oder Slaves auffordern, ihm Daten zu schicken. Ein Slave kann jedoch nie von sich aus Daten senden


Verdrahtung:

VCC = 3,3 Volt (Unbedingt vorab die Hersteller Angaben prüfen)
GND = Ground
SDA = I2C Serial Data
SCL = I2C Serial Clock

Passende Library / Bibliothek suchen und einbinden

  • Gehe ins Sketch Menü.
  • Drücke Bibliothek einbinden.
  • Öffne Bibliotheken verwalten.
  • Suche zB. nach ADAFRUIT GFX und installieren.
  • Suche zB. nach ADAFRUIT SSD1306 und installieren.

Eigene Textausgabe bei einem 128 x 64 (1,3 Zoll) Display erzeugen:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET  -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() 
{
  display.display();
  delay(2000); // Pause for 2 seconds

  // Clear the buffer
  display.clearDisplay();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
}

void loop() 
{
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(30,10);   //Erster Wert = Anzahl Pixel von links, bis Schrift beginnt 
                              // Zweiter Wert = Anzahl Pixel von oben, bis Schrift beginnt
  display.println("Gefunden auf");
  display.setCursor(32,35);
  display.println("Prilchen.de");
  display.display();
  delay(2000); // Pause for 2 seconds
}

2. Beispiel bei einem 128 x 32 (0,91 Zoll) Display:

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display weite in pixel
#define SCREEN_HEIGHT 32 // OLED display höhe in pixel
#define OLED_RESET  -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() 
{
  display.display();
  delay(2000); // Pause 2 sekunden

  // Clear the buffer
  display.clearDisplay();
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
}

void loop() 
{
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(30,5);   //Erster Wert = Anzahl Pixel von links, bis Schrift beginnt 
                              // Zweiter Wert = Anzahl Pixel von oben, bis Schrift beginnt
  display.println("Gefunden auf");
  display.setCursor(32,15);
  display.println("Prilchen.de");
  display.display();
  delay(2000); 
}

Sollten weitere I2C Module zum einsatzkommen könnte das angeben der I2C-Adresse von Nöten sein:
Beispiel-Script aus der Library. Diese benötigt noch die I2C Adresse des Display.

Eine große Menge an Standard I2C Modul Adresse sind bei https://i2cdevices.org zu finden. Hier einfach nach SSD1306 suchen und im Sketch einfügen.

Oder selbst nach der I2C Adresse suchen:
Der Arduino kann aber auch alternativ danach scannen.
Kleines Sketch um die I2C Adresse zu finden:

#include <Wire.h>  //I²C Bibliothek
 
void setup()
{
  Wire.begin();
 
  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}
 
void loop()
{
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for next scan
}

Scanner gibt im Seriellen Monitor dann Auskunft:

Diese Adresse nun in das Beispiel-Script eintragen und dann hochladen.

Display zeigt was an:



Tipp:
Wer lieber ohne Hardware, in einer online Simulation zu diesem Thema experimentieren möchte, findet das bei Wokwi mit der Simulation Adafruit SSD1306 Vitrine

,