31 Mayıs 2025 Cumartesi








  • Seri monitör Arduino kartı PC ye takılıyken kullanılabilir.

  • Program içerisinde void loop() altında Serial.begin(9600); komutu ile seri monitörün 9600 baudrate hızında başlangıç ayarı yapılır. 

  • Serial.begin(9600) komutundaki baudrate ile seri monitörün baudrate i aynı olmalıdır.

  • Seri monitör Arduino IDE'sinin sağ üst tarafından açılır ve alt taraftan baudrate ayarı yapılır.

  • Seri port ekranı PC ile Arduino arasındaki veri iletişimini izlememizi ve veri gönderip almamızı sağlar.

  • Serial.end(); komutu seri portu kapatır.


Baudrate Nedir? 

Baud hızı (sembol "Bd"), iki elektronik cihaz arasındaki iletişimin "hızını" tanımlamak için kullanılan birimdir. 9600 baud hızı, cihazlar arasında saniyede 9600 sinyal değişimi hızında veri akışı olacağı anlamına geliyor. Sinyal değişimi HIGH’dan LOW’a ya da LOW’dan HIGH’a durumudur. Seri portta 1 sinyal değişimi 1 biti kodladığı için, "9600 baud", seri portun saniyede maksimum 9600 bit aktarabildiği anlamına gelir. Fakat sinyal değişiminin 1 birden fazla biti kodladığı iletişim yöntemleri de mevcuttur. Örneğin; 

Faz Kaydırmalı Anahtarlama olan PSK’da her sinyal değişikliği 2 bit kodlar. Yani, 1 baud = saniyede 2 bittir. Dörtlü Genlik Modülasyonu QAM’da ise her sinyal değişimi 4 biti kodlar. Bu nedenle 1 baud = saniyede 4 bit olur. 

Arduino ile PC iletişimi seri port ile olduğu için; 1 sinyal değişimi 1 biti kodlar. Bundan dolayı 9600 baud hız saniyede maksimum 9600 bit aktarır.

İki cihazı aynı hıza ayarlamazsanız, bir cihaz, diğerine, beklenenden daha hızlı veya daha yavaş veri gönderecektir. İki seri cihaz aynı iletişim hızına ayarlanmadığında, veri alışverişi güvenilir olmayacaktır.


Arduino Seri Port Komutları Kullanımı

Serial.print(); Komutu Kullanımı

  1. Serial.print("Merhaba"); : Seri monitör ekranına Merhaba yazıldı.

  2. Serial.println("Merhaba"); : Seri monitör ekranına Merhaba yazıldı ve satır başı yapıldı.

  3. Serial.print(x); : x değerini ekrana yazar.

  4. Serial.print(x, 5); : x sayısını virgülden sonra 5 basamak olacak şekilde yazdır.

  5. Serial.println(port, DEC); : Port değerinin decimal(onlu) değerini yazar. Satır başı yapar.

  6. Serial.println(port, HEX); : Port değerinin hexadecimal(on altılı) değerini yazar. Satır başı yapar.

  7. Serial.println(port, BIN); : Port değerinin binary(ikili) değerini yazar. Satır başı yapar.

  8. Serial.println(port, OCT); : Port değerinin octal(sekizli) değerini yazar. Satır başı yapar.

  9. Serial.println(char(deger)); : “deger” değişkenini ekrana karakter türünde yazdırır.

  10. Serial.println(int(deger)); : “deger” değişkenini ekrana tam sayı türünde yazdırır.

  11. Serial.println(float(deger)); : “deger” değişkenini ekrana ondalıklı sayı türünde yazdırır.

  12. Serial.print("\t"); : 1 tab boşluk bırakır.

  13. Serial.print("\n");: Satır başı yap.

  14. Serial.print("yazı\n"); : yazı'dan sonra satır başı yapar. 

  15. Serial.println(); : Satır başı yapar.

  16. Serial.print("\nyazı");  : yazı'dan önce satır başı yapar.

  17. Serial.println("Sayı= " + String(x)); :x değişkeni int olarak tanımlanıp herhangi bir sayı atandıktan sonra Serial.println() komutunun belirtilen şekilde kullanılması ile String olarak ekrana yazdırılabilir.



sprintf(); Komutu Kullanımı

sprintf() fonksiyonu, metinleri ve sayıları birleştirme, biçimlendirme, formatlı hale getirme işlemini tek satırda, son derece düzenli bir şekilde yapmamızı sağlayan bir C/C++ fonksiyonudur. "String Print Formatted" (Biçimlendirilmiş Metne Yazdır) anlamına gelir. Serial.print() fonksiyonunun yaptığı gibi veriyi doğrudan seri porta göndermez; bunun yerine oluşturduğu biçimlendirilmiş metni bir karakter dizisinin (char dizisi / buffer) içine kaydeder. Yani paketleyip hazır hâle getirir. sprintf() fonksiyonu temel olarak üç ana bileşenle çalışır:

  1. Buffer (Metin Deposu): Oluşturulan son metnin kaydedileceği boş bir char dizisi.

  2. Format String (Şablon): Metnin nasıl görüneceğini belirleyen, içinde özel belirteçler (%d, %s vb.) barındıran ana kalıp.

  3. Argümanlar: Şablondaki belirteçlerin yerine sırasıyla gelecek olan değişkenler.


Kullanımı:

  • sprintf(buffer, "%d sensör değeri: %s", degisken1, degisken2); 

sprintf ile biçimlendirilen veri “buffer” değişkenine atandı.

Komut içerisine yazacağınız değişkenin türüne göre şu belirteçleri kullanırsınız:

Belirteç

Veri Türü

Açıklama

%d veya %i

int

İşaretli tam sayılar için

%u

unsigned int

İşaretsiz tam sayılar için

%ld

long

Büyük tam sayılar için

%c

char

Tek bir karakter için

%s

char[] (String)

Karakter dizileri (metinler) için

%%

Yüzde işareti

Ekrana doğrudan % yazdırmak için




  • Serial.println(buffer);

Ardından hazır olan veri seri port ekranına yazdırıldı.


Örnek: 

void setup()

{

  Serial.begin(9600);

  int en = 10;

  int boy = 20;

  int yukseklik = 30;

  char boyutlar[50];

  sprintf(boyutlar, "Cisim Eni: %d Cisim Boyu: %d Cisim Yüksekliği: %d", en, boy, yukseklik);

  Serial.println(boyutlar);

}


void loop()

{


}


Ekran Çıktısı: Cisim Eni: 10 Cisim Boyu: 20 Cisim Yüksekliği: 30


Karakter Dizisi Yazdırırken Dikkat Edilmesi Gereken

sprintf(); komutu içerisinde %s karakter formatı kullandığımızda karakter değişkeninin sonuna c_str(); ekini koymamız gerekir. Örn: kelime.c_str() gibi. Bunun nedeni: sprintf eski bir C fonksiyonudur. Arduino doğmadan çok önce, C dilinde yazılmış köklü bir fonksiyondur. C dilinde bugünkü anlamıyla gelişmiş bir String veri tipi yoktur; metinler sadece yan yana dizilmiş karakterler (char dizileri) olarak tutulur. Eğer sprintf fonksiyonuna doğrudan Arduino'nun modern String nesnesini verirsen, sprintf bunu tanımaz ve Arduino derleyicisi hata verir. İşte c_str() eki Arduino'nun modern String nesnesini sprintf fonksiyonuna tanıtır. 



Örnek:

String kelime = "Elma";

char yazi[10];

sprintf(yazi, "%s meyvesi", kelime.c_str());

Serial.println(yazi);



Hizalama ve Sıfır Ekleme Özellikleri

1. %5d : Sağa hizalar. Yazdırılacak veri için 5 karakter yer ayırır. Veri 5 karakterden küçükse örneğin 3 karakterse soluna 2 karakter boşluk bırakır.



1

2

3

 


2. %-5d : Sola hizalar. Yazdırılacak veri için 5 karakter yer ayırır. Veri 5 karakterden küçükse örneğin 3 karakterse sağına 2 karakter boşluk bırakır.

1

2

3






3. %02d : 2 karakterlik yer ayırır. Yazı tek karakterse soluna sıfır koyar.


Arduino'da sprintf() Kullanırken Dikkat Edilmesi Gerekenler

1. Ondalıklı Sayı (float / double) Kısıtlaması:

Standart Arduino (UNO, Nano, Mega gibi AVR tabanlı olanlar) belleği optimize etmek için sprintf() içinde %f (float) desteğini kapatmıştır. Eğer %f kullanırsanız ekranda sadece bir soru işareti (?) görürsünüz. Ondalıklı sayıları metne dönüştürmek için önce dtostrf() fonksiyonunu kullanmalı, ardından çıkan sonucu %s ile sprintf() içine gömmelisiniz. ESP8266, ESP32 veya STM32 gibi daha güçlü kartlarda %f doğrudan çalışır.

2. Buffer Taşması (Buffer Overflow):

Eğer oluşturduğunuz char mesaj[20]; dizisi 20 karakterlik yer açtıysa ve sprintf() ile içine 30 karakterlik bir metin yazmaya çalışırsanız, Arduino belleğindeki diğer verilerin üzerine yazar. Bu da programın kilitlenmesine veya saçmalamasına neden olur. Bu durumda sprintf() yerine snprintf() kullanabilirsiniz. Bu fonksiyon sizden maksimum karakter sınırı ister ve o sınırı asla aşmaz:

snprintf(mesaj, sizeof(mesaj), "Değer: %d", deger);



NOT: Arduino’da sprintf(); komutuyla yaptığımız veriyi formatlı hale getirme işlemini ESP32, ESP8266 veya Raspberry Pi Pico gibi daha gelişmiş kartlarda Serial.printf(); komutuyla yapabiliriz. 




Örnek: Serial.print() Komutu Kullanımı
float x = 3.141516;
int port = 32;
int deger = 65;
void setup()
{
  Serial.begin(9600);

  Serial.println("____________________Yazı yazdırma__________________________");
  Serial.print("Merhaba");   //seri monitör ekranına Merhaba yazıldı.
  Serial.println("Merhaba"); //seri monitör ekranına Merhaba yazıldı ve satır başı yapıldı.

  Serial.println("____________________Virgülden sonra basamak__________________________");
  Serial.println(x, 3);        //x sayısını virgülden sonra 3 basamak olacak şekilde yazdır.

  Serial.println("____________________Sayı tipleri__________________________");
  Serial.println(port, DEC); //port değerinin decimal(onlu) değerini yazar. Satır başı yapar.
  Serial.println(port, HEX); //port değerinin hexadecimal(on altılı) değerini yazar. Satır başı yapar.
  Serial.println(port, BIN); //port değerinin binary(ikili) değerini yazar. Satır başı yapar.
  Serial.println(port, OCT); //port değerinin octal(sekizli) değerini yazar. Satır başı yapar.

  Serial.println("____________________Veri tipleri__________________________");
  Serial.println((char)deger);    //deger değişkenini ekrana karakter türünde yazdırır.
  Serial.println((int)deger);     //deger değişkenini ekrana tam sayı türünde yazdırır.
  Serial.println((float)deger);   //deger değişkenini ekrana ondalıklı sayı türünde yazdırır.

  Serial.println("____________________Tab bırakma__________________________");
  Serial.print("\t");             //1 tab boşluk bırakır.
  Serial.println("solda bir tab boşluk bırakıldı");

  Serial.println("____________________Satır başı__________________________");
  Serial.print("\n");             //satır başı yap.
  Serial.print("yazı\n");         //yazı'dan sonra satır başı yapar.
  Serial.print("\nyazı");         //yazı'dan önce satır başı yapar.
}

void loop()
{

}



Örnek: Serial.sprintf() Komutu Kullanımı

void setup()
{
  Serial.begin(9600);
  
  Serial.println("_______________________Sayıları Yazdırma_______________________");
  int en = 10;
  int boy = 20;
  int yukseklik = 30;
  char boyutlar[50];
  sprintf(boyutlar, "Cisim Eni: %d Cisim Boyu: %d Cisim Yüksekliği: %d", en, boy, yukseklik);
  Serial.println(boyutlar);

  Serial.println("\n_________________________Sıfır Ekleme_________________________");
  int saat = 9;
  int dakika = 5;
  char zaman[10];
  sprintf(zaman, "%02d:%02d", saat, dakika);
  Serial.println(zaman);

  Serial.println("\n_________________Karakter Dizilerini Yazdırma__________________");
  String kelime = "Elma";
  char yazi[10];
  sprintf(yazi, "%s meyvesi", kelime.c_str());
  Serial.println(yazi);

  Serial.println("\n___________Sayı ve Karakter Dizilerini Hizalı Yazdırma__________");
  String kelime1 = "Elma";   // 4 karakter
  String kelime2 = "Armut";  // 5 karakter
  String kelime3 = "Mandalina"; // 9 karakter

  int fiyat1 = 20;
  int fiyat2 = 25;
  int fiyat3 = 15;

  char tablo[50]; // Satırın kaydedileceği geçici hafıza

  // %-15s -> Metni sola yasla ve toplam 15 karakterlik yer ayır.
  sprintf(tablo, "%-15s %d TL", kelime1.c_str(), fiyat1);
  Serial.println(tablo);

  sprintf(tablo, "%-15s %d TL", kelime2.c_str(), fiyat2);
  Serial.println(tablo);

  sprintf(tablo, "%-15s %d TL", kelime3.c_str(), fiyat3);
  Serial.println(tablo);
}

void loop()
{

}


0 comments:

Yorum Gönder

Arduino Eğitimi Konu - 7

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

Sensörlerin Arduino İle Kullanımı

Popular Posts

Yararlanılan Kaynaklar

İletişim

gokdag17@gmail.com