Was ist I²C?
I²C (gesprochen: “I-squared-C” oder “I-two-C”) steht für Inter-Integrated Circuit — ein serielles Kommunikationsprotokoll, das 1982 von Philips entwickelt wurde. Es ermöglicht die Kommunikation zwischen einem Mikrocontroller und mehreren Sensoren oder Modulen über nur zwei Leitungen.
Bei ESP32, Arduino und Raspberry Pi ist I²C eine der meistgenutzten Schnittstellen — fast jeder OLED-Display, viele Temperatursensoren und zahlreiche andere Module kommunizieren darüber.
Wie funktioniert I²C?
I²C nutzt zwei Leitungen:
| Leitung | Bedeutung | Pin beim ESP32 |
|---|---|---|
| SDA | Serial Data — Datenleitng | GPIO 21 |
| SCL | Serial Clock — Taktleitung | GPIO 22 |
Jedes Gerät am I²C-Bus hat eine eindeutige Adresse (meist 7-Bit, z.B. 0x3C für viele OLED-Displays). Der Mikrocontroller ist der “Master”, alle angeschlossenen Geräte sind “Slaves”. Bis zu 127 Geräte können theoretisch am gleichen Bus hängen — solange ihre Adressen unterschiedlich sind.
I²C in der Praxis — OLED-Display anschließen
Ein 0,96” OLED-Display (SSD1306) per I²C an den ESP32:
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
Wire.begin(21, 22); // SDA=21, SCL=22
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Hallo DigitaleWelt!");
display.display();
} I²C vs. SPI — was soll ich verwenden?
| Eigenschaft | I²C | SPI |
|---|---|---|
| Leitungen | 2 (SDA + SCL) | 4 (MOSI, MISO, SCK, CS) |
| Geräte pro Bus | bis 127 | 1 pro CS-Pin |
| Geschwindigkeit | 100 kHz – 400 kHz | bis 80 MHz |
| Typischer Einsatz | Sensoren, kleine Displays | SD-Karte, TFT-Displays |
| Verkabelung | Einfacher | Komplexer |
Faustregel: Für Sensoren und kleine Displays nimm I²C — weniger Leitungen, einfacher. Für schnelle Datenübertragung (SD-Karte, große TFT-Displays) nimm SPI.
I²C-Adresse herausfinden
Wenn du nicht weißt, welche Adresse ein Modul hat, hilft ein I²C-Scanner-Sketch:
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(115200);
Serial.println("I2C Scanner...");
for (byte addr = 1; addr < 127; addr++) {
Wire.beginTransmission(addr);
if (Wire.endTransmission() == 0) {
Serial.print("Gerät gefunden: 0x");
Serial.println(addr, HEX);
}
}
}