I²C-communicatie
Wat is I²C?
I²C (Inter-Integrated Circuit) is een seriële communicatiebus ontwikkeld door Philips in 1980. Het gebruikt slechts twee lijnen:
- SDA (Serial Data Line): voor data
- SCL (Serial Clock Line): voor kloksignalen
Dankzij deze eenvoud kunnen meerdere apparaten via één bus communiceren met een snelheid van 100kb/s tot 400kb/s in fast mode.
De I²C-bus is een veelgebruikte manier om apparaten met elkaar te laten communiceren. Handig, want je hebt er maar twee datalijnen voor nodig: SDA (data) en SCL (klok).
Daarmee kun je tot wel 112 apparaten aansluiten (bij gebruik van 7-bits adressen) — of zelfs meer als je overstapt op 10-bits adressering.
Het mooie van I²C is dat je één centrale controller (de master) kunt laten communiceren met meerdere sensoren of modules (de slaves).
In sommige gevallen zijn zelfs meerdere masters mogelijk. Dat maakt het een ideale oplossing voor compacte, slimme ontwerpen waar meerdere onderdelen met elkaar moeten samenwerken.
Voordelen van I²C
- Slechts twee draden nodig voor signalen
- Ondersteunt meerdere apparaten met unieke adressen
- Eenvoudige bekabeling
- Breed ondersteund door sensoren en modules
- Meerdere sensoren op één master (ESP32)
- Meerdere masters (ESP32) kunnen één sensor uitlezen
Hardware-aansluitingen
Voor een Arduino Uno gebruik je de volgende pinnen:
- A4 - SDA
- A5 - SCL
Voor een ESP32 gebruik je de volgende pinnen:
- GPIO21 - SDA
- GPIO22 - SCL
VCC en GND zijn voor de voedingsspanning en afhankelijk van de sensor kan dit 3.3V of 5V zijn.
Voorbeeldcode om een scan te doen van de I2C adressen:
#include <Wire.h>
void setup() {
Serial.begin(115200);
while (!Serial) { delay(10); } // Handig voor boards met native USB
Serial.println("\nI2C Scanner");
Wire.begin(); // ESP32/ESP8266: default pins, of geef SDA/SCL mee
}
void loop() {
byte error, address;
int found = 0;
Serial.println("\nScanning...");
for (address = 1; address < 127; address++) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("✅ I2C device gevonden op adres 0x");
if (address < 16) Serial.print("0");
Serial.print(address, HEX);
Serial.print(" (");
Serial.print(address);
Serial.println(")");
found++;
}
else if (error == 4) {
Serial.print("⚠️ Onbekende error op adres 0x");
if (address < 16) Serial.print("0");
Serial.println(address, HEX);
}
}
if (found == 0) Serial.println("Geen I2C devices gevonden.");
else {
Serial.print("Klaar. Totaal gevonden: ");
Serial.println(found);
}
delay(100000); // elke 3s opnieuw scannen
}
}
Populaire I²C-sensoren
- VEML7700: Lichtintensiteit
- BME680: temperatuur, luchtvochtigheid, luchtdruk en luchtkwaliteit
- SSD1306 OLED: Display via I²C
Met I²C voeg je eenvoudig sensoren en modules toe aan je project met minimale bedrading.