I2C Functions Kütüphanesi
I2C Functions, AVR tabanlı kartlarda (Arduino vb.) I2C haberleşmesini sadeleştirmek için yazdığım hafif bir yardımcı kütüphanedir. Temel amaç; register okuma/yazma, çoklu okuma/yazma ve I2C multiplexer yönetimi gibi tekrarlayan işleri soyutlayıp sensör/sürücü kütüphanelerini daha okunabilir hale getirmek.
Bu kütüphaneyi; Tek bir I2C sensörle, aynı hatta bağlı birden fazla cihazla, I2C multiplexer (örneğin TCA9548) üzerinden bağlı karmaşık topolojilerle çalışırken kullanabilirsin.
Kütüphanenin GitHub deposu: akkoyun/I2C_Functions
Temel Özellikler
- Basitleştirilmiş I2C API’si
Tek byte / çoklu byte register okuma-yazma fonksiyonları. - I2C Multiplexer Desteği
Obje oluştururken multiplexer adresi ve kanalını tanımlayıp gerisini kütüphaneye bırakma. - Hazır Adres Tanımları
Sık kullanılan bazı sensör ve entegreler için ön tanımlı I2C adresleri. - Daha Temiz Sürücü Kodları
Her entegre için I2C ile uğraşmak yerine iş mantığına odaklanma.

Nesne Oluşturma
Kütüphanenin kalbi I2C_Functions sınıfı. I2C multiplexer kullanıp kullanmama durumuna göre iki farklı kurulum yapabilirsin.
- Direkt I2C Bağlantı
- Multiplexer Arkasında I2C Bağlantı
#include <I2C_Functions.h>
// Multiplexer olmadan doğrudan I2C hattında kullanım
I2C_Functions HDC2010(0x40);
Multiplexer arkasındaki sensörler tüm örneklerde 0x03 (yani 4. kanalda olacak şekilde örneklendirilmiştir.)
#include <I2C_Functions.h>
// I2C Multiplexer (örneğin TCA9548) ile kullanım
// Adres: 0x40 olan bir sensör, MUX kanal 3 üzerinden bağlı
I2C_Functions HDC2010(0x40, true, 3);
Multiplexer kullanıyorsan, kütüphane her I2C işleminden önce ilgili kanalı otomatik seçer. Manuel kanal değiştirmekle uğraşmazsın.
Kütüphane Fonksiyonları
Tek Register Okuma
- Direkt I2C Bağlantı
- Multiplexer Arkasında I2C Bağlantı
I2C hattına bağlı sensör üzerinden (adres çakışmadı olmadığı varsayımı ile), register’dan 1 byte veri okumak için:
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt
I2C_Functions HDC2010(0x40);
// Sensörü başlat
HDC2010.Begin();
// 0x01 adresli register'dan tek byte oku
uint8_t result = HDC2010.Read_Register(0x01);
Multiplexer arkasındaki sensörden register okumak için ek bir iş yapmana gerek yok; obje oluştururken verdiğin MUX bilgisi sayesinde kanal otomatik seçilir ve işlem sensöre yönlendirilir.
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt (0x03 kanalında mux arkasında)
I2C_Functions HDC2010(0x40, true, 3);
// Sensörü başlat
HDC2010.Begin();
// MUX kanal 3 üzerinden bağlı sensörde 0x01 register'ını oku
uint8_t result = HDC2010.Read_Register(0x01);
Çoklu Register Okuma
- Direkt I2C Bağlantı
- Multiplexer Arkasında I2C Bağlantı
Bir başlangıç adresinden itibaren birden fazla byte almak için:
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt
I2C_Functions HDC2010(0x40);
// Sensörü başlat
HDC2010.Begin();
uint8_t data[4];
// 0x00 adresinden itibaren 4 byte oku
HDC2010.Read_Multiple_Register(0x00, data, 4);
Multiplexer arkasında çoklu okuma için ek kod gerekmez; kanal seçimi kütüphane tarafından otomatik yapılır.
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt (0x03 kanalında mux arkasında)
I2C_Functions HDC2010(0x40, true, 3);
// Sensörü başlat
HDC2010.Begin();
// MUX kanal 3 üzerinden bağlı sensörde 0x00 adresinden 4 byte oku
uint8_t data[4];
HDC2010.Read_Multiple_Register(0x00, data, 4);
16 bit adresli register yapıları için de çoklu okuma fonksiyonu mevcuttur:
uint8_t data16[4];
// 0x0001 adresinden itibaren 4 byte oku
HDC2010.Read_Multiple_Register_u16(0x0001, data16, 4, true);
Register Yazma
- Direkt I2C Bağlantı
- Multiplexer Arkasında I2C Bağlantı
Tek byte yazmak için:
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt
I2C_Functions HDC2010(0x40);
// Sensörü başlat
HDC2010.Begin();
// 0x10 adresli register'a 0x22 değerini yaz
HDC2010.Write_Register(0x10, 0x22, true); // son parametre debug çıktısı için
Multiplexer arkasında yazma işlemi için ek kod gerekmez; kanal seçimi kütüphane tarafından otomatik yapılır.
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt (0x03 kanalında mux arkasında)
I2C_Functions HDC2010(0x40, true, 3);
// Sensörü başlat
HDC2010.Begin();
// MUX kanal 3 üzerinden bağlı sensörde 0x10 register'ına 0x22 yaz
HDC2010.Write_Register(0x10, 0x22, true);
Çoklu Register Yazma
- Direkt I2C Bağlantı
- Multiplexer Arkasında I2C Bağlantı
Bir başlangıç adresinden itibaren birden fazla byte yazmak için:
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt
I2C_Functions HDC2010(0x40);
// Sensörü başlat
HDC2010.Begin();
uint8_t config[4] = {0x22, 0x33, 0x44, 0x55};
// 0x10 adresli register'dan itibaren 4 byte yaz
HDC2010.Write_Multiple_Register(0x10, config, 4);
Multiplexer arkasında çoklu yazma için ek kod gerekmez; kanal seçimi kütüphane tarafından otomatik yapılır.
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt (0x03 kanalında mux arkasında)
I2C_Functions HDC2010(0x40, true, 3);
// Sensörü başlat
HDC2010.Begin();
uint8_t config[4] = {0x22, 0x33, 0x44, 0x55};
// 0x10 adresli register'dan itibaren 4 byte yaz
HDC2010.Write_Multiple_Register(0x10, config, 4);
Komut Yazma
- Direkt I2C Bağlantı
- Multiplexer Arkasında I2C Bağlantı
Bazı entegreler register yerine doğrudan komut bekler. Tek komut veya çok baytlı komut gönderimi:
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt
I2C_Functions HDC2010(0x40);
// Sensörü başlat
HDC2010.Begin();
// Tek baytlık komut
HDC2010.Write_Command(0x22);
// Çok baytlı komut
uint8_t command[3] = {0xAA, 0xBB, 0xCC};
HDC2010.Write_Multiple_Command(command, 3);
Multiplexer arkasında komut göndermek için ek kod yazmana gerek yok; kanal seçimi otomatik yapılır.
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt (0x03 kanalında mux arkasında)
I2C_Functions HDC2010(0x40, true, 3);
// Sensörü başlat
HDC2010.Begin();
// Tek bayt komut
HDC2010.Write_Command(0x22);
// Çok baytlı komut
uint8_t command[3] = {0xAA, 0xBB, 0xCC};
HDC2010.Write_Multiple_Command(command, 3);
Register Word Okuma (16-bit)
- Direkt I2C Bağlantı
- Multiplexer Arkasında I2C Bağlantı
Tek register’dan 16-bit (2 byte) veri okumak için:
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt
I2C_Functions HDC2010(0x40);
// Sensörü başlat
HDC2010.Begin();
// 0x02 adresli register'dan 16-bit oku
uint16_t word = HDC2010.Read_Register_Word(0x02);
Multiplexer arkasında 16-bit okuma için ek kod gerekmez; kanal otomatik seçilir.
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt (0x03 kanalında mux arkasında)
I2C_Functions HDC2010(0x40, true, 3);
// Sensörü başlat
HDC2010.Begin();
// MUX kanal 3 üzerinden bağlı sensörde 0x02 register'ından 16-bit oku
uint16_t word = HDC2010.Read_Register_Word(0x02);
16-bit Çoklu Okuma (Komut Göndermeden)
Bazı cihazlar öncesinde komut/register yazımı gerektirmeden ardışık veri okumasına izin verir.
- Direkt I2C Bağlantı
- Multiplexer Arkasında I2C Bağlantı
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt
I2C_Functions HDC2010(0x40);
// Sensörü başlat
HDC2010.Begin();
uint8_t data[4];
// Önceden komut yazmadan 4 byte oku
HDC2010.Read_Multiple_Register_u16_NoCMD(data, 4);
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt (0x03 kanalında mux arkasında)
I2C_Functions HDC2010(0x40, true, 3);
// Sensörü başlat
HDC2010.Begin();
uint8_t data[4];
HDC2010.Read_Multiple_Register_u16_NoCMD(data, 4);
Register Bit İşlemleri
Bit Set
- Direkt I2C Bağlantı
- Multiplexer Arkasında I2C Bağlantı
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt
I2C_Functions HDC2010(0x40);
// Sensörü başlat
HDC2010.Begin();
// 0x10 register'da 2. biti set et
HDC2010.Set_Register_Bit(0x10, 2, true);
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt (0x03 kanalında mux arkasında)
I2C_Functions HDC2010(0x40, true, 3);
// Sensörü başlat
HDC2010.Begin();
// 0x10 register'da 2. biti set et
HDC2010.Set_Register_Bit(0x10, 2, true);
Bit Clear
- Direkt I2C Bağlantı
- Multiplexer Arkasında I2C Bağlantı
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt
I2C_Functions HDC2010(0x40);
// Sensörü başlat
HDC2010.Begin();
// 0x10 register'da 2. biti temizle
HDC2010.Clear_Register_Bit(0x10, 2, true);
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt (0x03 kanalında mux arkasında)
I2C_Functions HDC2010(0x40, true, 3);
// Sensörü başlat
HDC2010.Begin();
// 0x10 register'da 2. biti temizle
HDC2010.Clear_Register_Bit(0x10, 2, true);
Bit Oku
- Direkt I2C Bağlantı
- Multiplexer Arkasında I2C Bağlantı
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt
I2C_Functions HDC2010(0x40);
// Sensörü başlat
HDC2010.Begin();
// 0x10 register'daki 2. bitin değerini oku
bool bit = HDC2010.Read_Register_Bit(0x10, 2);
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt (0x03 kanalında mux arkasında)
I2C_Functions HDC2010(0x40, true, 3);
// Sensörü başlat
HDC2010.Begin();
// 0x10 register'daki 2. bitin değerini oku
bool bit = HDC2010.Read_Register_Bit(0x10, 2);
Cihaz Tespiti (Detect)
- Direkt I2C Bağlantı
- Multiplexer Arkasında I2C Bağlantı
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt
I2C_Functions HDC2010(0x40);
// Sensörü başlat
HDC2010.Begin();
// Cihaz tespiti
bool ok = HDC2010.Detect();
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt (0x03 kanalında mux arkasında)
I2C_Functions HDC2010(0x40, true, 3);
// Sensörü başlat
HDC2010.Begin();
// Cihaz tespiti
bool ok = HDC2010.Detect();
Adres ve MUX Bilgisi
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt (0x03 kanalında mux arkasında)
I2C_Functions HDC2010(0x40, true, 3);
// Sensörü başlat
HDC2010.Begin();
uint8_t addr = HDC2010.Address(); // Cihaz adresi
bool muxOn = HDC2010.Mux_Enable(); // MUX kullanılıyor mu?
uint8_t ch = HDC2010.Mux_Channel(); // MUX kanalı
MUX Kanal Ayarı (Set_Mux_Channel)
- Direkt I2C Bağlantı
- Multiplexer Arkasında I2C Bağlantı
MUX kullanılmıyorsa kanal ayarı gerekmez.
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt
I2C_Functions HDC2010(0x40);
// Sensörü başlat
HDC2010.Begin();
// MUX yoksa çağrı etkisizdir
HDC2010.Set_Mux_Channel();
// Kütüphaneyi yükle
#include <I2C_Functions.h>
// Sensörü kütüphaneye tanıt (0x03 kanalında mux arkasında)
I2C_Functions HDC2010(0x40, true, 3);
// Sensörü başlat
HDC2010.Begin();
HDC2010.Set_Mux_Channel(); // Kanalı (3) aktif eder
Bu yapılar sayesinde, sürücü kütüphanelerinde I2C multiplexer detayı arka planda kalır ve yalnızca iş mantığına odaklanırsın.
Hazır Adres Tanımları
Kütüphane içerisinde bazı entegreler için hazır adres makroları bulunur (örnek: TCA9548, RV3028, DS28C, MAX17055 vb.). Kendi kodunda istersen bu makroları kullanabilir, istersen de yeni cihaz adreslerini aynı mantıkla ekleyebilirsin:
#define __I2C_Addr_HDC2010__ (uint8_t)0x40
#define __I2C_Addr_MAX17055__ (uint8_t)0x36
// ...
Bu sayede projeler arasında adres tipleri daha tutarlı ve okunaklı hale gelir.
Örnek Kullanım Senaryosu
Basit bir sensör sürücüsünde I2C Functions kullanımı şu şekilde olabilir:
#include <I2C_Functions.h>
I2C_Functions Sensor(__I2C_Addr_HDC2010__);
void setup() {
Wire.begin();
Serial.begin(115200);
if (!Sensor.Detect()) {
Serial.println("Sensör bulunamadı!");
while (1);
}
Serial.println("Sensör bulundu, başlatılıyor...");
// Burada initialize register ayarlarını yap
}
void loop() {
uint8_t temp_raw = Sensor.Read_Register(0x00);
// Ham veriyi gerçek sıcaklığa çevir, vb...
}
Bu şekilde sürücü tarafında sadece sensörün mantığına odaklanıp, I2C trafiğini ve multiplexer detayını kütüphaneye bırakırsın.
Bu kütüphane, gerçek sahada kullanılan projelerden gelen ihtiyaçlara göre sürekli gelişen bir açık kaynak projedir. Kullanıcı geri bildirimleri, yeni fonksiyonların eklenmesi ve mevcut yapının iyileştirilmesi açısından kritik öneme sahiptir.
Bu kütüphaneyi hem kişisel hem de ticari projelerinde özgürce kullanabilirsin. Herhangi bir lisans kısıtı uygulanmamaktadır; amacım, bu kütüphanenin mümkün olduğunca fazla gerçek dünya projesinde yer almasıdır. Özel bir entegrasyon ihtiyacın, ticari bir planın veya teknik bir sorunun varsa bana e‑posta üzerinden her zaman ulaşabilirsin: akkoyun@me.com Geri bildirimlerini veya kullanım senaryolarını paylaşman, projeyi geliştirmem açısından büyük katkı sağlar.