I2C, yalnızca iki hat (SDA veri, SCL saat) üzerinden bir mikrodenetleyicinin çok sayıda sensör, ekran ve modülle haberleşmesini sağlayan seri bir haberleşme yoludur. Her cihazın 7 bitlik benzersiz bir adresi vardır (ör. 0x27, 0x3C, 0x76). Hatlar açık kollektörlüdür ve çalışmak için besleme gerilimine pull-up dirençleri (genellikle 4,7 kΩ) gerekir. Arduino Uno'da SDA A4, SCL A5 pinidir ve Wire kütüphanesiyle kullanılır.
Bir projeye LCD, OLED ekran, sıcaklık sensörü ve saat modülünü aynı anda bağlamak istediğinizde pin sayısı hızla tükenir. I2C bu sorunu çözer: tüm bu cihazlar aynı iki kabloyu paylaşır. Bu rehberde I2C'nin nasıl çalıştığını, Arduino ile kullanımını ve sık karşılaşılan sorunların çözümünü anlatıyoruz.
I2C nedir?
I2C (Inter-Integrated Circuit, "ay-kare-si" diye okunur), Philips (bugün NXP) tarafından geliştirilmiş, iki telli, senkron bir seri haberleşme yoludur. SDA (Serial Data) veri hattı, SCL (Serial Clock) ise saat hattıdır. Genellikle bir ana cihaz (mikrodenetleyici) ve ona bağlı çok sayıda bağımlı cihaz (sensör, ekran, genişletme modülü) bulunur.
I2C nasıl çalışır?
Ana cihaz haberleşmeyi başlatır, konuşmak istediği cihazın adresini hatta gönderir; adresi eşleşen cihaz yanıt verir, diğerleri sessiz kalır.
- Adres: Her cihazın genellikle 7 bitlik bir adresi vardır; aynı hatta yaklaşık 112 farklı adres kullanılabilir.
- Açık kollektör hatlar: Cihazlar hattı yalnızca GND'ye çekebilir; hattı HIGH seviyeye pull-up dirençleri çeker.
- Hız: Standart mod 100 kHz, hızlı mod 400 kHz yaygındır.
- Mesafe: I2C kart içi ve kısa kablolar için tasarlanmıştır; uzun kablolarda hat kapasitesi sinyali bozar.
Yaygın cihazların I2C adresleri
| Cihaz | Tipik adres |
|---|---|
| LCD I2C adaptörü (PCF8574) | 0x27 ya da 0x3F |
| SSD1306 OLED ekran | 0x3C (bazen 0x3D) |
| BME280 / BMP280 | 0x76 ya da 0x77 |
| MPU6050 | 0x68 ya da 0x69 |
| DS3231 saat modülü | 0x68 |
| MCP23017 genişletici | 0x20-0x27 |
Bazı modüllerde adres, lehim köprüleri ya da adres pinleriyle değiştirilebilir. MPU6050 ve DS3231'in aynı adresi (0x68) kullanması gibi çakışmalarda adres pini değiştirilir.
Arduino'da I2C pinleri
- Arduino Uno / Nano: SDA = A4, SCL = A5
- Arduino Mega: SDA = 20, SCL = 21
- ESP32: Varsayılan SDA = GPIO 21, SCL = GPIO 22 (başka pinlere de atanabilir)
- ESP8266 (NodeMCU): SDA = D2, SCL = D1
Kartlar arasındaki farklar için Arduino Uno, Nano ve Mega rehberimize bakın.
I2C cihazı adım adım nasıl bağlanır?
- Bağlantı: Cihazın VCC ve GND'sini, SDA'sını kartın SDA'sına, SCL'sini kartın SCL'sine bağlayın. Birden fazla cihazda tüm SDA'lar ve tüm SCL'ler birbirine bağlanır.
- Pull-up: Modüllerin çoğunda pull-up dirençleri hazırdır. Çıplak entegrelerde SDA ve SCL'den VCC'ye birer 4,7 kΩ direnç bağlayın. Çok sayıda modül kullanıldığında paralel pull-up'lar toplam direnci düşürebilir.
- Adresi bulun: Bir I2C tarayıcı (I2C scanner) kodu yükleyin; seri monitörde bulunan cihazların adresleri listelenir.
- Kütüphane: Cihazın kütüphanesini kurun ve bulunan adresi kodda kullanın. Arduino'nun Wire kütüphanesi I2C haberleşmesinin temelidir.
3,3V ve 5V cihazları birlikte kullanmak
5V'luk bir Arduino ile 3,3V'luk bir I2C sensörü kullanırken hatlardaki seviyelerin uyumlu olması gerekir; aksi hâlde 3,3V cihaz zarar görebilir. Çözüm, iki yönlü bir 3,3V-5V lojik seviye dönüştürücü kullanmak ya da pull-up dirençlerini 3,3V'a bağlamaktır (pek çok 5V cihaz 3,3V'u HIGH olarak algılar). Regülatörlü ve seviye dönüştürücülü modüller doğrudan 5V ile kullanılabilir; modülün belgesini kontrol edin.
I2C ile pin sayısını artırmak
I2C genişletme entegreleri, iki pinle çok sayıda yeni giriş-çıkış sağlar: MCP23017 16 kanal genişletici ve PCF8574 8 kanal genişletici. Aynı adresli birden fazla cihaz kullanmak için ise 8 kanal I2C genişleme (çoklayıcı) modülü hattı kanallara ayırır. Tipik I2C cihazlarına örnek: BME280 sensörü ve 0,96 inç OLED ekran; ayrıntılar OLED rehberimizde.
Sık sorulan sorular
I2C cihazı bulunamıyor, ne yapmalıyım?
SDA ve SCL'nin yer değiştirmediğini, ortak GND olduğunu ve beslemenin doğru olduğunu kontrol edin. I2C tarayıcıyla adresi doğrulayın; çıplak entegrelerde pull-up dirençlerinin bağlı olduğundan emin olun.
I2C kablosu ne kadar uzun olabilir?
I2C kısa mesafeler için tasarlanmıştır; pratikte genellikle bir metrenin altında güvenilirdir. Daha uzun mesafeler için hızı düşürmek, daha güçlü pull-up kullanmak ya da I2C uzatıcı entegreler gerekir; uzun hatlarda RS485 gibi yöntemler daha uygundur.
Aynı adresteki iki cihaz nasıl kullanılır?
Cihazda adres seçme pini ya da lehim köprüsü varsa biri farklı adrese alınır. Yoksa bir I2C çoklayıcı ile cihazlar farklı kanallara bağlanır.
I2C ile SPI arasındaki fark nedir?
I2C iki hatla çok sayıda cihazı adresle yönetir ama daha yavaştır. SPI daha hızlıdır, ancak her cihaz için ayrı bir seçme (CS) pini ve toplam dört hat gerektirir; ekranlar ve SD kartlarda sıkça kullanılır.
Pull-up direnci kaç ohm olmalı?
Çoğu uygulamada 4,7 kΩ uygundur. Hızlı modda ya da çok sayıda cihaz bağlıyken 2,2 kΩ gibi daha düşük değerler, çok kısa ve yavaş hatlarda 10 kΩ kullanılabilir.
Özet
- I2C, SDA ve SCL iki hattıyla çok sayıda cihazı adresle yönetir.
- Hatlar açık kollektörlüdür; pull-up dirençleri gerekir.
- Uno'da SDA A4, SCL A5; ESP32'de GPIO 21 ve 22.
- Adresler I2C tarayıcıyla bulunur; çakışmada adres pini ya da çoklayıcı kullanılır.
- 3,3V ve 5V cihazlar arasında seviye uyumuna dikkat edilir.