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:
Linia de date. Pachetele de informații circulă în ambele sensuri, între microcontroler și dispozitiv.
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:
SSD1306 OLED displays
Ecrane LCD 16x2 cu adaptor
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!
#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
}