Î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 memori 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ă, sincroană, multi-master/multi-slave, inventat în 1982 de Philips Semiconductor (acum NXP).”

Traducerea simplă: În loc să tragi câte 4-8 fire pentru fiecare senzor sau ecran în parte și să rămâi rapid fără pini pe Arduino sau ESP32, I2C creează o „magistrală” (o linie comună de autobuz). Legi toate componentele la aceleași 2 fire, iar fiecare componentă are o adresă unică (ca un număr de casă pe o stradă). Microcontrolerul strigă adresa: „Hei, senzorule 0x68, cât e temperatura?”, iar doar acel senzor răspunde.

2Cele 2 Fire Magice: SDA și SCL

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

SDA (Serial Data)

Linia de DATE. Pe aici călătoresc pachetele de informație în ambele sensuri (de la microcontroler la senzor și înapoi).

SCL (Serial Clock)

Linia de CEAS (Ritm). Microcontrolerul trimite impulsuri regulate pentru a sincroniza citirea datelor pe ambele părți.

📍 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 știi cui vorbești?

Fiecare cip I2C vine din fabrică cu o adresă pe 7 biți scrisă în format hexazecimal (ex: 0x27, 0x68, 0x3C).

Adrese I2C comune în proiecte DIY:

0x3C sau 0x3D

Ecrane OLED SSD1306

0x27 sau 0x3F

Ecrane LCD 16x2 cu adaptor

0x68

Giroscop MPU6050 / Ceas DS3231

4Atenționare Tehnică: Rezistoarele Pull-Up

⚠️ Liniile I2C sunt de tip "Open-Drain": Asta înseamnă că dispozitivele pot doar să tragă linia la GND (0V), dar nu o pot ridica singure la 5V sau 3.3V.

💡 Soluția: Liniile SDA și SCL au nevoie de două rezistoare de 4.7 kΩ legate între ele și linia de alimentare (VCC). Majoritatea modulelor cumpărate (ex: senzor BME280 sau ecran OLED) au deja aceste rezistoare integrate pe plăcuța lor mică, deci nu trebuie să le pui tu separat decât dacă folosești cipuri brute.

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
}