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:

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.

I2C Sensoren op breadboard
I2C uitleg

Voordelen van I²C

Hardware-aansluitingen

Voor een Arduino Uno gebruik je de volgende pinnen:

Voor een ESP32 gebruik je de volgende pinnen:

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

Met I²C voeg je eenvoudig sensoren en modules toe aan je project met minimale bedrading.