Înapoi la biblioteca de lecții
Protocoale de Comunicare Serială

Protocolul I2C: Comunicare pe 2 Fire

Cum poți conecta zeci de senzori, ecrane OLED și memorii pe doar două fire fizice, fără să rămâi fără pini pe plăcuță.

1Ce este I2C? (Definiția pe înțelesul tuturor)

Definiție tehnică:

„I2C (Inter-Integrated Circuit, pronunțat I-pătrat-C sau I-two-C) este un bus de comunicare serială, sincronă, multi-master/multi-slave, inventat în 1982 de Philips Semiconductor (acum NXP).”

Pe scurt: În loc să folosești 4–8 fire pentru fiecare senzor sau ecran ?i să rămâi fără pini pe Arduino ori ESP32, I2C creează o magistrală comună. Conectezi toate componentele la aceleași două fire, iar fiecare are o adresă unică, ca numărul unei case. Microcontrolerul apelează adresa unui dispozitiv, iar doar acesta răspunde.

2Cele două fire: SDA și SCL

O conexiune I2C folosește doar două linii de semnal, pe lângă alimentare (5 V/3.3 V) și GND:

SDA (Serial Data)

Linia de date. Pachetele de informații circulă în ambele sensuri, între microcontroler și dispozitiv.

SCL (Serial Clock)

Linia de ceas. Microcontrolerul trimite impulsuri regulate pentru a sincroniza transferul de date.

📍 Unde găsești pinii I2C pe plăcile tale?

  • • Arduino Uno: SDA = Pin A4 | SCL = Pin A5 (sau pinii dedicați de sus)
  • • ESP32: SDA = GPIO 21 | SCL = GPIO 22 (implicit)
  • • Raspberry Pi Pico: SDA = GPIO 4 | SCL = GPIO 5

3Adresele I2C: cum găsești dispozitivul?

Fiecare cip I2C are din fabrică o adresă pe 7 biți, scrisă în format hexazecimal (de exemplu, 0x27, 0x68 sau 0x3C).

Adrese I2C frecvente în proiectele DIY:

0x3C sau 0x3D

SSD1306 OLED displays

0x27 sau 0x3F

Ecrane LCD 16x2 cu adaptor

0x68

MPU6050 gyroscope / DS3231 clock

4Atenționare Tehnică: Rezistoarele Pull-Up

⚠️ Liniile I2C sunt de tip open-drain: Dispozitivele pot doar să tragă linia la GND (0 V); nu o pot ridica singure la tensiunea de alimentare.

💡 Soluția: Liniile SDA și SCL au nevoie de două rezistoare de 4.7 kΩ rezistoare pull-up conectate la VCC. Majoritatea modulelor (de exemplu, senzorul BME280 sau un ecran OLED) le au deja integrate, așa că nu trebuie să le adaugi separat decât dacă folosești cipuri fără modul.

5Proiect practic: „I2C Scanner”

Ai cumpărat un senzor și nu știi ce adresă are? Încarcă acest cod utilitar pe placa ta (Arduino/ESP32). El va verifica toate cele 128 de adrese posibile și îți va afișa în Serial Monitor adresa exactă a senzorului conectat!

i2c_scanner.ino
#include <Wire.h>

void setup() {
  Wire.begin();
  Serial.begin(115200);
  while (!Serial); // Așteptăm deschiderea Serial Monitor
  Serial.println("\n--- I2C Scanner Reznex ---");
}

void loop() {
  byte error, address;
  int nDevices = 0;

  Serial.println("Se scanează magistrala I2C...");

  for (address = 1; address < 127; address++) {
    // Trimitem un pachet gol de test la adresă
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0) {
      Serial.print("✅ Dispozitiv I2C găsit la adresa 0x");
      if (address < 16) Serial.print("0");
      Serial.print(address, HEX);
      Serial.println(" !");
      nDevices++;
    }
  }

  if (nDevices == 0) {
    Serial.println("❌ Nu s-a găsit niciun dispozitiv I2C.");
  } else {
    Serial.println("Gata! Scanare completă.\n");
  }

  delay(5000); // Scanează din nou la fiecare 5 secunde
}