31 Mayıs 2025 Cumartesi




sq(a) : a'nın karesini alır.

sqrt(b) : b'nin karekökünü alır.

pow(b, a) : b'nin a üssünü alır.

min(c, d) : c ile d değerlerinden küçük olanı alır.

abs(e) : e'nin mutlak değerini alır.

constrain(d, 10, 20) : d değişkeni; 10 ile 20 arasında ise d'yi alır. 10'dan küçükse 10'u alır. 20'den büyükse 20'yi alır.

map(h, 0, 200, 0, 50) : 0 ile 200 arasında olan h değerini 0 ile 50 arasındaki değere dönüştürür.


Program Kodları

int a = 2, b = 9, c = 4, d = 9, g = 0, h = 120, j = 0;

int e = -6;

void setup()

{

      Serial.begin(9600);


      Serial.print("a nın karesi= ");

      Serial.println(sq(a));    //a nın karesini al ekrana yazdır.


      Serial.print("b nin karekökü= ");

      Serial.println(sqrt(b));  //b nin karekökünü ol ekrana yazdır.


      Serial.print("b nin a üssü= ");

      Serial.println(pow(b, a));  //b nin a üssünü al ekrana yazdır.


      Serial.print("minimum değer= ");

      Serial.println(min(c, d));  //c ve d değerlerinden küçük olanı ekrana yazar.


      Serial.print("e nin mutlak değeri= ");

      Serial.println(abs(e));     //e nin mutlak değerini al ekrana yazdır.


      g = constrain(d, 10, 20);   //d değişkeni; 10 ile 20 arasında ise g = d, 10'dan küçükse g = 10, 20'den büyükse g = 20 olur.

      Serial.print("g= "); Serial.println(g);


      j = map(h, 0, 200, 0, 50);  //0 ile 200 arasında olan h değerini 0 ile 50 arasındaki değere dönüştürüp j ye atar.

       Serial.print("j= "); Serial.println(j);


}


void loop()

{


}




___________________________________________________________________________________


Programlamada değişkenler önemlidir. Hangi tür işleme göre hangi tür değişken tanımlamamız gerektiğine doğru karar vermemiz gerekir. Aksi halde sonuçlarda yanlışlıklarla karşılaşırız. Değişkenlerin tanımlandığı yerler de önem arz etmektedir. Bu kapsamda Arduino'da değişkenleri tanımladığımız yerleri iki gruba ayırırsak, Global ve Yerel değişkenler olmak üzere iki gruptan bahsedebiliriz.

Global değişkenler: Programın tamamında geçerlidir ve her yerde kullanılabilir. En üstte tanımlanır.

Yerel(lokal) değişkenler: Değişkenin bulundu void() ya da döngü ya da fonksiyon içerisinde kullanılabilirler.


Değişkeni herhangi bir döngü ya da void() içerisinde kullanacağımız zaman program bu değişkenin tanımını önce yerelde sonra globalde arar. Aramaya içten dışa doğru devam eder.


*Arduino penceresinin alt kısmındaki mesajlarda, global değişkenlerin ve yerel değişkenlerin bellekte ne kadar yer kapladığını ve kalan bellek miktarını görebiliriz.
*Büyük projelerde global değişken kullanmak sevilmez. Yerel değişkenler tercih edilir. Global değişkenler bellekte sürekli yer kapladığı için yerel değişkenler kullanılır ve işi bittiğinizde ömürleri sonlandırılır.



Örnek Program:

Değişken a üç farklı yerde kullanılmış ve sonuçlar ekrana yazdırılmıştır. En içteki for döngüsü, a değişkenini, önce kendi lokalinde aramış ve bulmuştur. Bu nedenle globaldeki değeri değil kendi lokalindeki değeri yazdırmıştır.


int a = 3;

int i = 0;

void setup()

{

      int a = 5;

      Serial.begin(9600);

      Serial.print("void setup içindeki a= "); Serial.println(a);

      delay(5000);

}

void loop()

{

      int a = 5;

      Serial.print("void loop içindeki a= "); Serial.println(a);

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

  {

        int a = 7;

        Serial.print("for içindeki a= "); Serial.println(a);

  }

      delay(5000);

}


Global ve Yerel değişkenlerin yerleri:




___________________________________________________________________________________






Program Kodları

float x1, x2, x3, y, z;     //sonuc ondalıklı çıkma durumu varsa değişkenlerin hepsi float olarak tanımlanır.

int a, b, c, d, k, m, n;

void setup()

{

      a = 3; b = 5; c = 7; d = 27;

      y = 23; z = 9;

      Serial.begin(9600);

      

      //a'yı ekrana yazdırır.

      Serial.print("a= ");    Serial.println(a);


      //işlemin sonucunu ekrana yazdırır.

      k = a + b;

      Serial.print("k= ");    Serial.println(k); 


      //işlemin sonucunu ekrana yazdırır.

      m = c * d;

      Serial.print("m= ");    Serial.println(m); 


      //işlemin sonucunu ekrana yazdırır.

      n = d - a;

      Serial.print("n= ");    Serial.println(n); 


      //x,y,z float tanımlandıysa sonuç virgüllü çıkar.

      x1 = y / z;

      Serial.print("x1= ");

      Serial.println(x1, 5);     //virgülden sonra 5 basamak.


      //x float, c ve a int tanımlandıysa sonuc tam çıkar.

      x2 = c / a;

      Serial.print("x2= ");

      Serial.println(x2, 5);     //virgülden sonra 5 basamak.


      //işleme giren tam sayılardan birine virgüllü kısım eklenirse sonuç virgüllü çıkar.

      x3 = 5.0 / 2;

      Serial.print("x3= ");

      Serial.println(x3, 5);     //virgülden sonra 5 basamak.


      //d sayısının b ile bölümünden kalan a ya atanır.

      a = d % b;

      Serial.print("Kalan= "); 

      Serial.println(a);

}


void loop()

{


}


 


1. int    :Hafızada 2 byte yer kaplar. Tam sayıdır. -32768 ile 32767 arasında değer alır.

2. unsigned int    :Hafızada 2 byte yer kaplar. Tam sayıdır. 0 ile 65535 arasında değer alır.

3. long    :Hafızada 4 byte yer kaplar. Tam sayıdır. -2147483648 ile 2147483647 arasında değer alır.

4. unsigned long    :Hafızada 4 byte yer kaplar. Tam sayıdır. 0 ile 4294967295 arasında değer alır.

5. float    :Hafızada 4 byte yer kaplar. Ondalıklı sayıdır. -3.14*10^38 ile 3.14*10^38 arasında değer alır.

6. bool    :Hafızada 1 byte yer kaplar. Mantıksal değer tutar. 1(true) veya 0(false).

7. char    :Hafızada 1 byte yer kaplar. Karakter tanımlamak için kullanılır. ASCII standartlarına göre tanımlama yapılır.

8. byte    :Hafızada 1 byte yer kaplar. 1 bayt yani 8 bit. 0 ile 255 arası değer alır.

9. static    :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.

10. int(veri)    :"veri"değişkeni int türüne dönüştürüldü.

11. char(veri)    :"veri" değişkeni char türüne dönüştürüldü.

12. const int b = 3;     :const ifadesi ile tanımlanan değişken program içerisinde sadece okunabilir, değiştirilemez. İlk kaç olarak tanımlandıysa öyle kalır. Örnekte b değişkenine atanan 3 değeri sabit kalır. Programın tümünde artık b=3'tür. Programın başka yerinde, herhangi bir döngü içerisinde b'ye farklı bir değer atanamaz.

13. #define c 5     :#define ile tanımlanan durumda ise; program, derlendiği sırada, kodlar içerisinde nerede c görürse oraya 5 koyar. Bunu arka planda yapar. Biz göremeyiz. Bir nevi ön derleyicidir. Bu nedenle bellekte yer kaplamaz. #define c 5 yazdıktan sonra sonuna noktalı virgül koyulmaz.


ÖNEMLİ:

float olarak tanımlanan bir değişkene, "int" türünden sayılarla ya da değişkenlerle yapılan işlem sonucu atanırsa, float olarak tanımladığımız değişken sonucu "int" türünden verilir. Örneğin;


void loop()

{

       float a;

       a = 5 / 2;

       Serial.print(a);

}


Bu kod parçacığı çalıştırıldığında a değeri 2.5 olması gerekirken 2 olarak sonuç verir. Bu durumun önüne geçmek için yani sonucu float olarak almak için işleme giren değişkenlerden birini veya hepsini float olarak tanımlamalı ya da işleme giren sayılardan birini veya hepsini ondalıklı sayı olarak yazmalıyız. 


a = 5.0 / 2; gibi ya da 

a = 5.0 / 2.0; gibi.



Örnek Program Kodları:

int a = 0;

const int b = 3;

#define c 5

void setup()

{

      Serial.begin(9600);

      Serial.println(b);

      Serial.println(c);

}


void loop()

{


}



___________________________________________________________________________________









  • 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()
{

}


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