Arduino Uno kartında I2C haberleşme için kullanacağımız pinler A4 ve A5 pinleridir. A4->SDA, A5->SCL hattıdır. Atmega328 entegresinde ise I2C pinleri 27. ve 28. pindir. 27->SDA, 28->SCL hattıdır.
SDA ve SCL pinleri, kullanılan Arduino türüne göre değişiklik göstermektedir. Arduino türlerine göre SDA ve SCL pinleri aşağıdaki tabloda gösterilmiştir.
I2C haberleşmede Master ve slave cihazların aynı besleme hattına bağlanmasına gerek yoktur. Fakat iletişimin sağlanması için toprak hatlarının aynı olması gerekir.
Haberleşmenin tüm hat boyunca hatasız bir şekilde
sağlanabilmesi için SDA ve SCL hatları, pull-up dirençlerle VCC hattına
bağlanmalıdır.
Arduino I2C
Seri Haberleşme Komutları
Arduino'nun I2C haberleşmesini yapabilmesi için
kullanılması gereken komutlar vardır. Bu komutlar Arduino'nun "Wire.h" kütüphanesi
içerisinde bulunmaktadır. Bu yüzden öncelikle bu kütüphaneyi projemize dâhil
etmeliyiz. “Wire” kütüphanemizi kullanabilmek için öncelikle #include <Wire.h> komutu
ile “wire” kütüphanemizi projemize dahil etmeliyiz.
1.  Wire.begin();
I2C haberleşmesini başlatan fonksiyondur. Wire.begin();
fonksiyonu setup() yapımız içerisinde yalnızca 1 kez çağrılır. Eğer fonksiyona
herhangi bir parametre girilmemişse, cihazımız Master olarak çalışacak
demektir. Eğer 0 ile 127 arasında bir değer girilmişse, cihazımız slave olarak
çalışacak demektir ve bu değer slave cihazımızın kimliğini belirtecektir.
Wire.begin(); ……………master cihaz haberleşmesini başlatır.
Wire.begin(1); …………..slave cihaz haberleşmesini başlatır. Slave
cihaz adresi = 1.
2.  Wire.available();
Fonksiyon hat üzerinden Arduino'ya ulaşmış veri
paketlerinin sayısını döndürür. Okunmaya hazır ama okunmamış mevcut byte
sayısını almak için kullanılır. Eğer fonksiyonun değeri 0'dan büyükse
Arduino'ya gelen yeni veri paketi vardır. Herhangi bir parametre almaz, geriye
tampon bellekteki okunmaya hazır byte sayısının integer türü değerini döndürür.
Byte_sayisi = Wire.available();
3.  Wire.beginTransmission(adres);
Master cihazın hat üzerinde bulunan slave
cihazlardan hangisiyle haberleşmek istediğini belirler. Fonksiyon, parametre
olarak haberleşmeye başlayacağı slave cihazın adresini alır.
adres: Veri gönderilecek slave cihazın adresi.
4.  Wire.endTransmission();
Wire.beginTransmission(); fonksiyonu ile başlatılan veri iletimini
sonlandırmak için kullanılır. Herhangi bir parametre almaz ve geriye değer
döndürmez. 
5.  Wire.read();
Veri hattından gelen verinin okunmasını sağlar. Herhangi
bir parametre almaz. Geriye alınan 1 byte değerindeki veriyi döndürür. Eğer bir
byte değerinden fazla veri alınmış ise, bir döngü yardımı ile alınan veriler
diziye aktarılabilir. Hem Master cihazda hem de Slave cihazda veri okumak için
kullanılır. 
Örneğin; I2C iletişimde Master Arduino cihazına slave
bir cihazdan veri geldiğinde bu veri önce master Arduino cihazının buffer(tampon) ara belleğinde depolanır.
Bu bellek 32 bayttır ve veri Wire.read() komutuyla bayt bayt okunarak herhangi bir
değişkene atanır.
6.  Wire.write();
Kısaca veri yollamak için kullanılır. Master ve
Slave cihaz için veri gönderme fonksiyonudur. Wire.write() fonksiyonu master
cihazdan slave cihaza ya da slave cihazdan master cihaza veri göndermek için
kullanılır. 1 byte değerindeki veri, string ya da byte dizisi gönderilebilir.
Wire.write(value);
Wire.write(string);
Wire.write(dizi, uzunluk);
value   : 1 byte değerindeki veri (byte)
string    : metin türünden karakter dizisi
dizi        : gönderilecek byte dizisi
uzunluk:
gönderilecek byte dizisi uzunluğu
Örnek:
7.  Wire.requestFrom(adres, miktar,
durak);
Master cihaz tarafından, slave cihazdan byte isteğinde
bulunmak için kullanılmaktadır. Master tarafında kullanılan bu fonksiyon ile
slave cihazdan veri istenir. Daha sonra bu baytları toplamak için “Available()” ve “read()” işlevleri kullanılabilir.
adres   :
Veri istenecek slave cihazın adresini belirler (7 bitlik cihaz adresi).
miktar  :
Slave cihazdan kaç byte'lık veri beklendiğini belirler. Talep edilen byte
sayısıdır.
durak   :
İstekten sonra veri yolunun durumunu belirler (boolean).
·        
True ise istekten sonra veri yolu serbest bırakılarak stop komutu gönderilir, 
·        
False ise veri yolu açık tutularak master cihazın başka
bir slave cihaza istekte bulunması engellenir.
Geriye byte cinsinden Slave cihazdan gönderilen
bayte sayısını döndürür.
Örnek:
Wire.requestFrom(1,2);    // 1 numaralı slave cihaza 2 byte okuma isteği gönder.
8.  Wire.onRequest(istek_fonksiyonu);
Slave tarafından kullanılan bu fonksiyon, master
cihazdan veri isteği geldiğinde slave cihazda çalıştırılacak fonksiyonu
belirler. 
istek_fonksiyonu: Master cihaz Slave cihazdan veri talep ettiğinde,
slave cihazda çalışacak olan fonksiyon. Bu fonksiyonun parametre almasına gerek
yoktur. Geriye değer döndürmez.
void istek_fonksiyonu ()
{
       komutlar…
}
9.  Wire.onReceive(veri_fonksiyonu);
Slave olarak tanımlanmış cihaza veri geldiğinde,
çalışacak fonksiyonu belirleyen komuttur. Bu fonksiyonun parametre alması
gerekmektedir.
veri_fonksiyonu: Master cihazdan veri geldiğinde slave cihazda
çalışacak fonksiyon. Bu fonksiyon tanımlandığında aşağıdaki şekilde bir
parametre almalıdır. Geriye değer döndürmez.
void veri_fonksiyonu (int x)
{
       komutlar…
}
_____________________________________________________________________________________________________________________________________________________





