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):
Linia de DATE. Pe aici călătoresc pachetele de informație în ambele sensuri (de la microcontroler la senzor și înapoi).
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:
Ecrane OLED SSD1306
Ecrane LCD 16x2 cu adaptor
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!
#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
}