21 Eylül 2025 Pazar

I2C Nedir?

Inter-Integrated Circuit devre iletişim protokolü anlamına gelir. Kısa menzilli veri aktarım uygulamaları için sadece 2 kablo gerektiren, senkron haberleşen seri iletişim protokolüdür. Philips ( NXP ) firması tarafından oluşturulmuştur. Bir entegre ya da parça eğer içerisinde I2C sistemi var ise bu protokol ile kullanılabilir. Yok ise bu protokol ile kullanılamaz. I2C tabanlı sensörler, LCD/OLED ekranlar vb. için projelerde kullanılan çok popüler bir iletişim protokolüdür. I2C protokolünde sadece 2 pin ayrılarak aynı hat üzerine birçok RAM, EEPROM, RTC vb. parça bağlanıp kullanılabilir. Bu da fazladan pin ihtiyacını ortadan kaldırır. 

I2C protokolünde yönetici MCU’lara “master” yönetilen diğer parçalara ise “slave” denir. 



I2C haberleşmesinde, haberleşmeyi kontrol eden master cihazı bulunur. Her haberleşmede bir tane master bulunmalıdır. Haberleşmenin sağlanabilmesi için haberleşme hattına en az bir adet slave (köle) cihaz bağlanmalıdır. Hatta bağlanan birden fazla slave cihazlardan hangisinin veri aktaracağına, master cihaz karar verir. Böylece hat sayısında bir değişiklik olmadan birden fazla cihazla haberleşme sağlanır. 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. 
Hat sayısının fazla olması nedeniyle, uzun mesafeli haberleşmelerde tercih edilmez. Genellikle kısa mesafeli ve düşük veri aktarım hızının yeterli olduğu yerlerde kullanılır.
I2C haberleşme yöntemi ile birden fazla cihaz haberleşme sağlayabilir ancak, bir cihaz veri gönderirken diğer cihazlar veri yolunun boşalmasını beklemek zorundadır. Aynı anda 2 cihaz veri gönderirse, data hattında çakışma meydana gelecektir.
I2C protokolünde hat üzerine başka MCU’lar da bağlanabilir. Bunlar gerekli zamanlarda hem master hem slave olarak yerini alabilir. I2C birden fazla master’ın veri yolu üzerindeki tüm cihazlarla iletişim kurmasına izin veren bir sistemi destekleyebilir. Ancak master cihazlar veri yolu üzerinden birbirleriyle konuşamaz.


I2C Pinleri
Veri aktarımı için SDA (Serial Data Line) ve SCL (Serial Clock) olmak üzere iki adet haberleşme hattı bulunur. Bu hatlardan SDA, cihazlar arasındaki veri aktarımının sağlandığı hattır. Bu hatta çift yönlü veri aktarımı olur. Bu durum master cihazın veriyi gönderip alabildiği anlamına gelir. SDA hattı boyunca 8 bitlik veriler bit bit aktarılır. Her 8 bitlik veri için, fazladan bir bit( “ACK / NACK” biti) iletilmelidir. ACK / NACK biti, slave cihaz tarafından önceki bit dizisini başarıyla alıp almadığını belirtmek için kullanılır. 
ACK : Acknowledge(onaylamak, kabullenmek).
NACK : Not Acknowledge(onaylamamak, kabullenmemek).
SDA hattına aktarılan verilerin senkronizasyonu SCL hattı tarafından gerçekleştirilir. SCL hattında master cihaz tarafından üretilen saat sinyali bulunur. SCL hattı cihazlar arasında veri iletimini senkronize eder. SDA hattına bağlı tüm slave cihazların benzersiz adresi vardır. I2C ile 7 bit adresleme kullanıldığında 128(112) adet, 10 bit adresleme kullanıldığında 1024(1008) adet aygıt ile tek veri yolu üzerinde iletişim kurulabilir. Bu adresleme sayesinde master, istediği cihaz ile iletişim kurabilir.
I2C’de, RS232 seri porttaki gibi hem alıcının hem de vericinin kendi clock sinyalini üretme gibi bir durumu yoktur. I2C’de master tarafından üretilen clock sinyali tüm cihazlardan tarafından kullanılır. RS232 seri portta sadece iki cihaz arasında iletişim kurulurken I2C’de birçok cihaz arasında iletişim kurulur. 

Pull-up Dirençleri
I2C veri yolu sürücüleri “open drain” dir. Bu da ilgili sinyal hattını düşük(lojik 0) tutabilecekleri anlamına gelir, ancak yükseğe(lojik 1) çekemezler. Herhangi bir aygıtın yükseğe çekmeye çalışırken diğer bir aygıtın düşüğe çekmeye çalıştığı bir hat çekişmesi olamaz. Her bir sinyal hattında bağlı olan aygıtlar haberleşme yapmadığı zaman veri hattındaki sinyali düşüğe çekemeyecektir ve böyle durumlarda hat boşta kalmamalıdır. Bu nedenle veri yolunun lojik 1 konumunda tutmak için Pull-up dirençler kullanılır. 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.  Bu dirençlerin değeri 2K ile 10K arasında seçilir. Dirençlerin değeri arttıkça iletişim hızı azalır.



I2C protokolü 4 adet hız aralığına sahiptir. Ancak kullanılan parçaların bu hızları desteklemesi gerekmektedir. Aşağıdaki tablodan kullanılacak hıza uygun pull-up direnç değerleri seçilebilir.



Mod

Hız

Direnç Aralığı

Standart

100 khz

5kΩ – 10kΩ

Hızlı

400 khz

2kΩ - 5kΩ

Yüksek Hızlı

3,4 Mhz

1kΩ




I2C Veri İletişim Protokolü




I2C protokolünde iletilen veri bloğuna mesaj denir. Mesajlar 8 bitlik diziler halinde aktarılır. İlk mesaj slave cihazın adresini, ikinci mesaj slave cihazın yazmaç adresini ifade eder. Üçüncü ve sonraki mesajlar veriyi taşırlar.



a. Start biti: İletişim başlatma bitidir. Saat frekansı lojik 1’deyken SDA hattı lojik 1’den 0’a çekilerek iletişim başlatılır. I2C veri yolu start bitinden sonra meşgul olarak kabul edilir.
b. Aygıt adresi: Master’ın hangi slave ile iletişim kurduğunu belirten adres bilgisidir. Aslında 7 bitten oluşur.  8.bit R/W bitidir. 7 bitlik adres bilgisi en anlamlı bit (MSB)’ten başlayarak veri yoluna yazılır. Mesaj tüm slave’lere iletildiğinde sadece bu adrese sahip slave mesajı işler. Bu bilgiler slave cihazda kayıtlıdır. Slave cihazın veri sayfasında bulunur.
c. R/W (Read/Write): Master, slave’e yazmak istiyorsa bu bit 0, slave’den okumak istiyorsa bu bit 1 olarak gönderilir.
d. ACK (Acknowledgement): Onay bitidir. Slave cihaz tarafından önceki bit dizisini başarıyla alıp almadığını belirtmek için kullanılır. Eğer mesaj alıcıya ulaştıysa, alıcı, SDA hattını bu bit süresince lojik 0’a çeker. Master hattı lojik 0’da gördüğünde mesaj’in iletildiğini anlar ve sıradaki mesaj’e geçer. Hattın lojik 0’a çekilmesi, yani mesaj’in alındığının bildirilmesine ACK (Acknowledgement) denir. Eğer hattın meşgul olması gibi bir nedenle mesaj alıcıya ulaşmadıysa, alıcı bu bit süresince hattı lojik 1’de tutar. Bu duruma da NACK (Not Acknowledgement) denir. Hattı dinleyen gönderici NACK okuyunca veri alışverişi durur. Gönderici mesaj’i tekrar gönderir yada nasıl devam edeceğine gönderici kendi karar verir.
e. Yazmaç(register) adresi: Slave aygıtın bellek adres bilgilerini içerir. Master aygıt, slave’in bellek adreslerinin nasıl haritalandığını, hangi yazmaca hangi bilginin yazılacağını veya okunacağını bilmesi gerekir. Bu bilgiler slave cihazda kayıtlıdır. Slave cihazın veri sayfasında bulunur.
f. Veri: Veriyi taşıyan bitlerdir.
g. Stop bit(leri): İletişim sonlandırma bitidir. Saat frekansı lojik 1’deyken SDA hattı lojik 0’dan 1’e çekilerek iletişim sonlandırılır. I2C veri yolu stop bitinden sonra müsait olarak kabul edilir.

NACK Biti Üretilen Durumlar
• Alıcı verileri alamıyor veya iletemiyorsa, bu durumda iletişimi durdurmak için bir NACK biti üretir. 
• İletişim sırasında, alıcı anlaşılmayan herhangi bir veri veya komut aldığında, bir NACK biti üretir. 
• Aktarım sırasında, alıcı herhangi bir gerçek zamanlı işlem gerçekleştirir ve master ile iletişim kuramazsa bir NACK biti üretir. 
• Master bir alıcı olduğunda ve veriyi slave'den okuduğunda, tüm verilerin okunmasından sonra, iletişimi durdurmak için veri hatlarında bir NACK biti üretir. 
• Master tarafından iletilen adrese ait herhangi bir cihaz yoksa, master herhangi bir slave tarafından onay alamaz ve bu durumu NACK olarak kabul eder.

Örneğin aşağıdaki sensörleri inceleyelim:
5 farklı sensörden oluşan GY-80 kartını ve 3 farklı sensörden oluşan GY-521 kartını incelediğimizde I2C veri yolu kullanarak sadece iki kablo ile 8 farklı sensörden veri alabiliriz.




Bu sensörlerle iletişim kurabilmek için onların benzersiz adreslerini ve onlardan veri okuyabilmek için de sensörlerin dahili kayıtçı adreslerini bulmamız gerekiyor. Bunları sensörlerin veri sayfalarından bulabiliriz. 
Örneğin; GY-80 devre kartı için aşağıdaki dört adrese sahibiz: 
3 eksenli ivmeölçer için onaltılı bir 0x53 
3 Eksenli Gyro için onaltılı bir 0x69 
3 Eksenli Manyetometre için onaltılı bir 0x1E 
Barometre ve termometre sensörü için onaltılı bir 0x77
Sensörlerin adreslerini bulduktan sonra, onlardan veri okuyabilmek için dahili kayıtçılarının adreslerini de bulmamız gerekiyor. GY-80 devre kartının 3 Eksen ivmeölçer sensöründen X eksenine ait verileri okumak istiyorsak, X ekseni verilerinin saklandığı dahili kayıtçı adresini bulmamız gerekir. Sensörün veri sayfasından bunları bulabiliriz.
Ayrıca Arduino resmi web sitesinde bulunabilecek I2C scanner ile sensörlerin adreslerini alabilir veya kontrol edebiliriz. Yani bu uygulamayı yükleyip çalıştırırsak, I2C veri yoluna bağlı cihazların adreslerini alabileceğiz.
SDA ve SCL hattı gerekli olan pull-up dirençler kartların üzerinde yer almaktadır. 


I2C Yazma İşlemi




Master, start bitini gönderdikten sonra slave cihazın adres bitini ve yazma yapacağı için R/W bitini 0 gönderir. Gönderilen adres biti I2C hattında slave bir cihazla eşleşiyorsa master, slave cihazdan bir onay biti(ACK) alır. Master onay bitini aldıktan sonra slave cihazın yazma yapacağı bölümün register adresini gönderir. Master yine onay biti(ACK) aldıktan sonra verileri slave cihaza göndermeye başlar. Master gönderdiği her verinin onay bitini ister. Eğer master onay biti alamazsa iletişimi durdurur yada iletişimi yeniden başlatır. Master verileri gönderdikten sonra stop biti göndererek iletişimi sonlandırır.  


I2C Okuma İşlemi




Master, start bitini gönderdikten sonra slave cihazın adres bitini ve okuma yapacağı için R/W bitini 1 gönderir. Gönderilen adres biti I2C hattında slave bir cihazla eşleşiyorsa master, slave cihazdan bir onay biti(ACK) alır. Master onay bitini aldıktan sonra veri yolunu serbest bırakır ama clock sinyalini göndermeye devam eder. Bu durumda master alıcı olur, slave verici olur. Okuma işleminde master, aldığı her bayt veriden sonra slave cihaza onay verir. Master beklediği verileri aldıktan sonra veri yolunu boşaltmak için NACK biti gönderir ve ardından stop biti göndererek iletişimi sonlandırır.  






_____________________________________________________________________________________________________________________________________________________

 


Seri porttan veri geldiğinde serialEvent() fonsiyonu çalışır ve gelen verileri alarak ekrana yazdırır. Bu bir fonksiyondur. Seri porta veri geldiğinde otomatik olarak bu fonksiyon çalışır. Bir nevi seri port kesmesi gibi davranır. 


Program Kodları:

int i = 0;

char veri[10];

bool veri_kontrol = false;

void setup()

{

  Serial.begin(9600);

}


void loop()

{

  Serial.println("Veri Bekleniyor...");

  if (veri_kontrol == true)

  {

    veri[i] = '\0';     //i. indisten itibaren diziyi sonlandır. 

    Serial.print("Veri= "); Serial.println(veri);

    veri_kontrol = false;

    i = 0;

  }

  delay(1000);

}


void serialEvent()

{

  while (Serial.available() > 0)

  {

    veri[i] = Serial.read();

    veri_kontrol = true;

    i++;

  }

}


_________________________________________________________________________________________________________________________________________________________


 


Seri porta veri geldiğinde ona okuma yapması için süre tanımamızı sağlayan uygulamadır. Süreyi 3000 msn yaptığımızda gönderdiğimiz string verinin tamamını yazdırabiliriz. Süreyi 1 msn yaptığımızda gönderdiğimiz string veri parça parça yazdırılır.


Program Kodları:

String veri;

void setup() {

  Serial.begin(9600);     

  Serial.setTimeout(3000);      //süre 3000 ms olarak belirlendi.

  Serial.print("Bekleme Süresi= ");

  Serial.println(Serial.getTimeout());      //belirlenen süre ekrana yazdırıldı.

}


void loop() {


  if (Serial.available() > 0) 

  {

    veri = Serial.readString();

    Serial.print("Alınan veri= ");

    Serial.println(veri);

  }

}


_________________________________________________________________________________________________________________________________________________________


 


Bu komut gönderilen seri veri iletiminin tamamlanmasını beklemek için kullanılır. Herhangi bir parametre almaz ve geriye değer döndürmez. Bu komut kullanıldığında tüm verinin seri port üzerinden gönderildiğinden emin olunur ve seri veri akışını temizleyerek iletim arabelleğini(buffer) bir sonraki veriyi göndermeye hazır hale getirir. Yani seri port üzerinden gönderilen verilerin temizlenmesini de sağlamış olur.


Program Kodları:

byte veri[] = {65, 66, 67, 68, 69};

int deger;


void setup()

{

  Serial.begin(9600);

}


void loop()

{

  Serial.write(veri, 5);  //veri dizisinin ilk 5 elemanını gönder. byte türünde dizi tanımladığımız için Serial.write() komutunda sayı belirtmemiz gerekiyor.

  Serial.flush();         //Verinin tamamı gönderilene kadar bekle.

  delay(1000);

  Serial.println();       //satır başı yap.

}


________________________________________________________________________________________________________________________________________________________


 


Arduino seri portuna gelen veri içinde "ANTALYA" karakter dizisini arar. Bulursa "1(TRUE)" bulamazsa "0(FALSE)" değerini döndürür.


Program Kodları:

bool deger;

void setup()

{

  Serial.begin(9600);

}


void loop()

{

  if (Serial.available() > 0)

  {

    deger = Serial.find("ANTALYA");

    Serial.print("Değer= "); 

    Serial.println(deger);

  }

}


_____________________________________________________________________________________________________________________________________________________


 



Arduino seri portuna gelen veri içinde 'G' karakterini arar. Bulursa "1(TRUE)" bulamazsa "0(FALSE)" değerini döndürür.


Program Kodları:

bool deger;

void setup()

{

  Serial.begin(9600);

}


void loop()

{

  if (Serial.available() > 0)

  {

    deger = Serial.find('G');

    Serial.print("Değer= "); Serial.println(deger);

  }

}


__________________________________________________________________________________________________________________________________________________________


 



Bu program seri port arabelleğindeki veri yazılabilecek kaç bayt(karakter)’lık alan olduğunu bildirir.


Program Kodları:

char dizi[]={'A','M','A','S','Y','A'};

int alan;

void setup()

{

  Serial.begin(9600) ;


  //Seri port arabelleği boşken yazdırılabilir alan

  alan = Serial.availableForWrite();

  Serial.print("Arabellekteki Yazdırabilir Alan Miktarı= ");

  Serial.print(alan); Serial.println(" bayt");


  //Seri port arabelleğine veri gönderdiğimiz durumda kalan yazdırılabilir alan

  Serial.write(dizi);

  alan = Serial.availableForWrite();

  Serial.print("\nArabellekteki Yazdırabilir Alan Miktarı= ");

  Serial.print(alan); Serial.println(" bayt");


  //Seri port arabelleğini boşalttıktan sonraki yazdırılabilir alan

  Serial.end();

  Serial.begin(9600);

  alan = Serial.availableForWrite();

  Serial.print("Arabellekteki Yazdırabilir Alan Miktarı= ");

  Serial.print(alan); Serial.println(" bayt");


}


void loop()

{


}


________________________________________________________________________________________________________________________________________________________


 



Serial.write() komutu 1 byte büyüklüğündeki char veya byte türündeki veriyi yada bu türdeki dizileri göndermek için kullanılır. Aynı zamanda gönderilen verinin bayt sayısı da öğrenilebilir.


char dizi[6] = {'A', 'N', 'K', 'A', 'R', 'A'};

int bayt_sayisi;

void setup()

{

  Serial.begin(9600);


  Serial.write(77);     //77 decimal değerin karşılığı olan M karakterini gönderir.

  Serial.println();     //bir satır boş bırakır.

  Serial.print("Dizi Tam= "); Serial.write(dizi);     //dizi'yi gönderir.

  Serial.println(); 

  Serial.print("Dizi Yarım= "); Serial.write(dizi, 3);      //dizi'nin ilk 3 elemanını(3 bayt) gönderir.


  //diziyi ve dizinin eleman sayısını gönder.

  Serial.println();

  bayt_sayisi = Serial.write(dizi);     //dizi’yi gönderir ve gönderdiği eleman sayısını(kaç baytlık işlem yapıldığını) değişkene atar.

  Serial.println();

  Serial.print("Bayt Sayısı= "); Serial.println(bayt_sayisi);

}


void loop()

{


}


_________________________________________________________________________________________________________________________________________________________


 



Bu programda klavyeden girilen yazı belli bir karaktere kadar okunarak metin olarak seri port ekranına yazdırılır. Seri port arabelleğinde veri varsa okuma işlemine devam eder. Bunu önlemek için "metin" değişkeni sıfırlandı ve port kapatılıp açılarak kalan verilerin silinmesi sağlandı.


Program Kodları:

String metin;

void setup()

{

  Serial.begin(9600);

}


void loop()

{

  if (Serial.available() > 0)

  {

    metin = Serial.readStringUntil('G');

    Serial.println(metin);

    metin='\0';

    Serial.end();

    Serial.begin(9600);

  }

}


_____________________________________________________________________________________________________________________________________________________


 



Bu programda klavyeden girilen yazı metin olarak seri port ekranına yazdırılır.


Program Kodları:

String metin;

void setup()

{

  Serial.begin(9600);

}


void loop()

{

  if (Serial.available() > 0)

  {

    metin = Serial.readString();

    Serial.println(metin);

  }

}


____________________________________________________________________________________________________________________________________________________________


 



Bu uygulamada klavyeden girilen sayılara göre led yakıp-söndürme işlemi yapılır. Uygulamamızda sonlandırma karakteri göndermemek için seri port ekranının altından "satır sonu yok" seçildi.


Program Kodları:

#define kirmizi_led 8

#define sari_led 9

char deger = 0;

void setup()

{

  Serial.begin(9600);

  pinMode(kirmizi_led, OUTPUT);

  pinMode(sari_led, OUTPUT);

  digitalWrite(kirmizi_led, LOW);

  digitalWrite(sari_led, LOW);

  Serial.println("Klavyeden değer girin: (1 veya 2 veya 3)");

}



void loop()

{

  if (Serial.available() > 0)     //seri porta veri geldi mi?

  {

    deger = Serial.read();    //seri portu oku "deger" değişkenine ata.

    switch (deger)

    {

      case '1':

        {

          digitalWrite(kirmizi_led, HIGH);

          Serial.println("Kırmızı Led Yandı");

          break;

        }

      case '2':

        {

          digitalWrite(sari_led, HIGH);

          Serial.println("Sarı Led Yandı");

          break;

        }

      case '3':

        {

          digitalWrite(kirmizi_led, LOW);

          digitalWrite(sari_led, LOW);

          Serial.println("Tüm Led'ler Söndürüldü");

          break;

        }

      default:

        {

          Serial.println("Yanlış Değer Girildi. Lütfen 1,2,3 Değerlerinden Birini Girin");

          break;

        }

    }

  }

}


_________________________________________________________________________________________________________________________________________________________


 



Program, seri port ara belleğine gönderdiğimiz veride 'G' karakterini görene kadar okur. Ekrana yazar. Eğer ara bellekte hala veri varsa okuma işlemine devam edilir. Bunu önlemek için Veri ekrana yazdırıldıktan sonra port aç-kapat yapılarak ara bellek temizlendi ve "gelenveri" dizisi de sıfırlandı. Uygulamamızda sonlandırma karakteri göndermemek için seri port ekranının altından "satır sonu yok" seçildi.


Program Kodları:

char gelen_veri[12];

void setup()

{

  Serial.begin(9600);

}


void loop()

{

  if (Serial.available() > 0)

  {

    Serial.readBytesUntil('G', gelen_veri, 12);

    Serial.print("Gelen Veri= "); Serial.println(gelen_veri);

    delay(1000);


    gelen_veri[0] = '\0';

    Serial.end();

    Serial.begin(9600);

    delay(1000);

  }

}



__________________________________________________________________________________________________________________________________________________________


 



Program, seri port ara belleğine gönderdiğimiz verinin ilk 6 baytını okur. Bir önceki uygulamadaki gibi port ve indis temizleme yapılmadığı için program gönderilen verinin ilk döngüde ilk 6 baytını alır yazdırır. Diğer döngülerde 6 bayt 6 bayt şeklinde veriden kalanları yazdırır. Uygulamamızda sonlandırma karakteri göndermemek için seri port ekranının altından "satır sonu yok" seçildi.


Program Kodları:

char gelenveri[12];

int veri_uzunlugu;

int i;

void setup()

{

  Serial.begin(9600);

}


void loop()

{

  if (Serial.available() > 0)

  {

    veri_uzunlugu = Serial.readBytes(gelenveri, 6);

    Serial.print("Veri Uzunlugu= "); Serial.println(veri_uzunlugu);


    Serial.print("Gelen Veri= ");

    for (i = 0; i < veri_uzunlugu; i++)

    {

      Serial.print(gelenveri[i]);

    }

  }

}


______________________________________________________________________________________________________________________________________________________


 



Program, seri port ara belleğine gönderdiğimiz verinin ilk 6 baytını okur. Eğer ara bellekte hala veri varsa okuma işlemine devam edilir. Bunu önlemek için veri ekrana yazdırıldıktan sonra port aç-kapat yapılarak ara bellek temizlendi ve "gelenveri" dizisi de sıfırlandı. Fakat 6 baytın altında 12 baytın üstünde veri gönderdiğimizde düzgün çalışmıyor. Önceki veriler de geliyor. Bunun sebebi 1 bayt akışını birden fazla okuması olabilir. Uygulamamızda sonlandırma karakteri göndermemek için seri port ekranının altından "satır sonu yok" seçildi.


Program Kodları:

char gelenveri[12];

void setup()

{

  Serial.begin(9600);

}


void loop()

{

  if (Serial.available() > 0)

  {

    Serial.readBytes(gelenveri, 6);     //seri porttan okunan verinin ilk 6 baytını al.

    Serial.println(gelenveri);

    gelenveri[0]='\0';    //diziyi 0. indisten başlayarak temizle.


    Serial.end();       //Seri port kapatıldı.

    Serial.begin(9600);     //Seri port açıldı.

  }

}


_____________________________________________________________________________________________________________________________________________________________


19 Eylül 2025 Cuma

 



Bu uygulamada Arduino seri port ekranı üzerinden veri gönderilir ve seri port ara belleğindeki veri Serial.read() komutuyla bayt bayt okunarak tanımladığımız bir diziye aktarılır. Uygulamamızda sonlandırma karakteri göndermek için seri port ekranının altından "yeni satır" seçildi. static int, static char vb. şekilde tanımlanan değişkenler yerel olarak herhangi bir döngü içerisinde tanımlansa bile void setup() üzerinde tanımlanmış gibi olur. Döngünün her tekrarında ilk verdiğimiz değeri tekrar almaz.


Program Kodları:

const unsigned int maksimum_veri = 12;

void setup()

{

  Serial.begin(9600);

}

void loop()

{

  while (Serial.available() > 0)

  {

    static char veri[maksimum_veri];

    static unsigned int veri_indis_no = 0;

    char okunan_byte = Serial.read();


    if ( okunan_byte != '\n' && (veri_indis_no < maksimum_veri) )

    {

      veri[veri_indis_no] = okunan_byte;

      veri_indis_no++;

    }

    else

    {

      veri[veri_indis_no] = '\0';       //diziyi, belirli indis numarasından itibaren son indise kadar boşalt. son indis dahil. Null yap. diziyi bu şekilde boşaltmazsak sonraki yazdırmada, ilk yazdırdığımız karakterlerden kalanlar olabilir.

      Serial.println(veri);

      veri_indis_no = 0;

    }

  }

}


____________________________________________________________________________________________________________________________________________________


 



Bu uygulamada Arduino seri port ekranı üzerinden veri gönderilir ve yine seri port ekranı üzerinden gönderilen veriyi görebiliriz. Uygulamamızda sonlandırma karakteri göndermek için seri port ekranının altından "yeni satır" seçildi. Serial.read() ile veri okuduğumuzda okuduğumuz alandaki veri silinir. Bu nedenle önce, Serial.available() ile veri uzunluğu okunur sonra Serial.read() ile veri okunur.


Program Kodları:

char veri;

int uzunluk;

void setup()

{

  Serial.begin(9600);

  Serial.println("Klavyeden değer girin:");

}



void loop()

{

  if (Serial.available() > 0)

  {

    uzunluk = Serial.available();

    veri = Serial.read();

    if (veri != '\n') //gelen veri sonlandırma karakteri değilse.

    {

      Serial.print("veri uzunluğu= "); Serial.println(uzunluk);

      Serial.print("veri bilgisi= "); Serial.println(veri);

      delay(1000);

    }

  }

}


______________________________________________________________________________________________________________________________________________________


 



Bu uygulamada Arduino seri port ekranı üzerinden veri gönderilir ve yine seri port ekranı üzerinden gönderilen veriyi görebiliriz. Uygulamamızda sonlandırma karakteri göndermemek için seri port ekranının altından "satır sonu yok" seçildi. Serial.read() ile veri okuduğumuzda okuduğumuz alandaki veri silinir. Bu nedenle önce, Serial.available() ile veri uzunluğu okunur sonra Serial.read() ile veri okunur.


Program Kodları:

int veri;     //veri değişkeni int türünde tanımlandığı için klavyeden girilen harflerin rakamsal karşılıklarını görürüz. Veri değişkeni char türünde tanımlandığı zaman ise klavyeden girilen harfler harf olarak gözükür.

int uzunluk;

void setup()

{

  Serial.begin(9600);

}

void loop()

{

  if (Serial.available() > 0)

  {

    uzunluk = Serial.available();

    Serial.print("veri uzunluğu= "); Serial.println(uzunluk);

  }

  veri = Serial.read();

  Serial.print("veri bilgisi= "); Serial.println(veri);

  delay(1000);

}


_________________________________________________________________________________________________________________________________________________



Arduino Eğitimi Konu - 7

Arduino Eğitimi Konu - 10

Toplam Sayfa Görüntüleme Sayısı

Sensörlerin Arduino İle Kullanımı

Popular Posts

Yararlanılan Kaynaklar

İletişim

gokdag17@gmail.com