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.
De I²C-bus is een veelgebruikte manier om apparaten met elkaar te laten praten. 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 als voeding. Afhankelijk van de sensor kan dit 3.3V of 5V zijn.
Voorbeeldcode
#include <Wire.h>
#define I2C_SDA 21
#define I2C_SCL 22
#define I2C_ADDR 0x76 // Verander dit naar jouw sensoradres (bijv. 0x77)
void setup() {
Serial.begin(115200);
// I2C starten
Wire.begin(I2C_SDA, I2C_SCL); // Je kunt ook gewoon Wire.begin() doen als je de standaard pinnen gebruikt
Serial.println("I2C scan gestart...");
scanI2CDevices();
}
void loop() {
// Eventueel uitlezen hier als je een specifieke sensor gebruikt
delay(5000);
}
void scanI2CDevices() {
byte error, address;
int nDevices = 0;
for (address = 1; address < 127; address++) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C-apparaat gevonden op adres 0x");
if (address < 16)
Serial.print("0");
Serial.print(address, HEX);
Serial.println();
nDevices++;
}
}
if (nDevices == 0)
Serial.println("Geen I2C-apparaten gevonden.");
else
Serial.println("I2C scan klaar.");
}
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.