Fonksiyonlar, bir program içerisinde aynı işlem defalarca yapılıyorsa, her seferinde aynı kodları yazmak yerine o işlem için bir fonksiyon yazılıp o fonksiyonu gereken yerde çağırmaya yarar.
Fonksiyonlar parametre alan ya da almayan, geriye değer döndüren ya da döndürmeyen olarak sınıflandırılır.
Dersimiz boyunca aşağıdaki devreyi kullanacağız.
Aynı devrenin aşağıda şematik gösterimini veriyorum arkadaşlar. Eğer şematik gösterimini bilmiyorsanız öğrenmenizi tavsiye ederim.
Bu tip fonksiyonlara herhangi bir değer gönderilmez ve geriye değer döndürmesi beklenmez. Geriye değer döndürmediğini belirtmek içim “void” komutu ile başlar.
Sözdizimi:
Fonksiyon tanımlama: void FonksiyonAdi(){ }
Fonksiyonu çağırma: FonksiyonAdi();
void komutunun, fonksiyonun geriye değer döndürmediğini belitmek için kullanıldığını söylemiştik. void kelimesi ardından fonksiyon adı yazılır ve ardından parantez açıp kapatılır. Ardından küme parantezi içerisinde fonksiyon çağrıldığında çalışacak kodlar yazılır.
Örneğin bir fonksiyon yazalım ve 2 numaralı dijital pine bağladığımız butona her bastığımızda fonksiyonu çağıralım. Fonksiyonu her çağırdığımızda 12 ve 13 sayısını toplasın ve toplamı seri porta göndersin. Kodlarımız şu şekilde olacak;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void setup() { pinMode(2, INPUT); // 2 numaralı dijital pini giriş olarak ayarladık Serial.begin(9600); // seri haberleşme hızı 9600 BaudRate } void toplama(){ // toplama adında fonksiyon tanımladık int toplam = 12+13; // toplam adında tamsayı türü değişken tanımladık ve // 12 ile 13 sayısının toplamını değişkene atadık Serial.print(toplam); // değişken değerini seri porta yazdırdık } void loop() { // sonsuz döngümüze girdik if(digitalRead(2)){ // eğer 2 numaralı pindeki butona basılı ise toplama(); // toplama fonksiyonunu çağır } } |
Bu tip fonksiyonlara değer gönderilir ve fonksiyon bu değeri işleme tabii tutar ancak fonksiyon geriye değer döndürmez. Aslında arduino programlarken bu fonksiyonları çok kullanıyoruz. Örneğin digitalWrite() fonksiyonu bu fonksiyonlara örnektir.
Sözdizimi:
Fonksiyon tanımlama: void fonksiyonAdi(int birinciParametre, int ikinci parametre, string n’inciParametre){}
Fonksiyonu Çağırma: fonksiyonAdi(birinciDeger, ikinciDeger, n’inciDeger);
digitalWrite() fonksiyonu int ve bool türünde iki adet parametre alır; digitalWrite(int, bool).
Örneğin bir toplama fonksiyonu yazalım. 2 numaralı pine bir buton bağlayalım. Butona her bastığımızda fonksiyona iki adet sayı gönderelim, fonksiyon bu sayıları toplayıp çıkan sonucu seri porta yazdırsın.
Kodlarımız aşağıdaki gibi olacak;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void setup() { pinMode(2, INPUT); // 2 numaralı dijital pini giriş olarak ayarladık Serial.begin(9600); // seri haberleşme hızı 9600 BaudRate } void topla(int sayi1, int sayi2){ // toplama adında fonksiyon tanımladık int sonuc = sayi1 + sayi2; // toplam adında tamsayı türü değişken tanımladık ve // fonksiyona gönderdiğimiz 2 ve 3 sayısının toplamını değişkene atadık Serial.print(sonuc); // sonuc değişkeni değerini seri porta yazdırdık } void loop() { // sonsuz döngümüze girdik if(digitalRead(2)){ // eğer 2 numaralı pindeki butona basılı ise topla(2,3); // toplama fonksiyonuna 2 ve 3 değerini gönder } } |
Yukarıdaki kodda biz “loop” döngüsü içerisinde 2 numaralı pine bağladığımız butona bastığımızıda on üçüncü satırdaki “if” sorgusu içerisine girdik, sorgu içerisinde “topla” fonksiyonuna “2” ve “3” değerini gönderdik; “topla(2,3)” .
Altıncı satırımızda fonksiyon bu iki değeri sırasıyla sayi1 ve sayi 2 değişkenine atadı ve fonksiyon parantezi içerisine girdi.
Yedinci satırımızda sayi1 ve sayi2 değişkeni değeri toplanıp (2+3) sonuc değişkenine atandı.
Ardından dokuzuncu satırsa sonucu seri porta yazdırdık.
Bu tip fonksiyonlara parametre gönderilmez ancak fonksiyon geriye değer döndürür. Geriye değer döndüren fonksiyonlarda “void” komutu yerine fonksiyonun geri dönüş türü (int, string, bool vs.) yazılır. Fonksiyonun sonunda ise return komutu ile sonuç geriye döndürülür.
Sözdizimi:
Fonksiyon Tanımlama: int fonksiyonAdi(){}
Fonksiyonu çağırma: int gelen = fonksiyonAdi();
Örneğin 2 numaralı dijital pine bağladığımız butona her bastığımızda fonksiyonu çağıralım. Fonksiyonu her çağırdığımızda 12 ve 13 sayısını toplasın ve toplamı bize geri döndürsün. Biz de o değeri alıp seri porta yazdıralım. Kodlarımız şu şekilde olacak;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void setup() { pinMode(2, INPUT); // 2 numaralı dijital pini giriş olarak ayarladık Serial.begin(9600); // seri haberleşme hızı 9600 BaudRate } int toplama(){ // toplama adında fonksiyon tanımladık int toplam = 12+13; // toplam adında tamsayı türü değişken tanımladık ve // 12 ile 13 sayısının toplamını değişkene atadık return toplam; } void loop() { // sonsuz döngümüze girdik if(digitalRead(2)){ // eğer 2 numaralı pindeki butona basılı ise Serial.print(toplama()); // toplama fonksiyonunu çağır ve dönen değeri seri porta yaz } } |
Yukarıdaki kodda biz “loop” döngüsü içerisinde 2 numaralı pine bağladığımız butona bastığımızıda on üçüncü satırdaki “if” sorgusu içerisine girdik, on dördüncü satırda “topla” fonksiyonunu çağırdık ve dönen değeri seri porta yazmasını istedik: Serial.print(toplama()); .
Altıncı satırımızda fonksiyon çalışmaya başladı. Fonksiyon kendi içerisinde 12 ve 13 sayısını toplayıp toplam değişkenine atadı. Ardından dokuzuncu satırda “return” komutu ile sonucu bize geri gönderdi.
Program tekrar ondördüncü satıra gitti ve dönen değeri seri porta yazdırdı.
Bu tip fonksiyonlara değer gönderilir ve fonksiyon bu değeri işleme tabii tutar ve fonksiyon sonucu geriye döndürür. Bir sonraki dersimizde inceleyeceğimiz matematiksel fonksiyonlar bu tür fonksiyonlara örnektir.
Sözdizimi:
Fonksiyon Tanımlama: int fonksiyonAdi(int birinciParametre, int ikinciParametre, string n’inciParametre){}
Fonksiyonu çağırma: int gelen = fonksiyonAdi(birinciDeğer, ikinciDeğer, n’inciDeğer);
Örneğin 2 numaralı dijital pine bağladığımız butona her bastığımızda fonksiyona parametre (değer) göndererek çağıralım. Fonksiyonu her çağırdığımızda gönderdiğimiz sayıları toplasın ve toplamı bize geri döndürsün. Biz de o değeri alıp seri porta yazdıralım. Kodlarımız şu şekilde olacak;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void setup() { pinMode(2, INPUT); // 2 numaralı dijital pini giriş olarak ayarladık Serial.begin(9600); // seri haberleşme hızı 9600 BaudRate } int toplama(int sayi1, int sayi2){ // toplama adında fonksiyon tanımladık int toplam = sayi1 + sayi2; // toplam adında tamsayı türü değişken tanımladık ve // 12 ile 13 sayısının toplamını değişkene atadık return toplam; } void loop() { // sonsuz döngümüze girdik if(digitalRead(2)){ // eğer 2 numaralı pindeki butona basılı ise Serial.println(toplama(14, 18)); // toplama fonksiyonunu çağır ve dönen değeri seri porta yaz } |
Yukarıdaki kodda biz “loop” döngüsü içerisinde 2 numaralı pine bağladığımız butona bastığımızıda on üçüncü satırdaki “if” sorgusu içerisine girdik, on dördüncü satırda “topla” fonksiyonuna 14 ve 18 sayısını göndererek çağırdık ve dönen değeri seri porta yazmasını istedik: Serial.print(toplama(14, 18));.
Altıncı satırımızda fonksiyon bu iki değeri sırasıyla sayi1 ve sayi2 değişkenine atadı ve fonksiyon parantezi içerisine girdi. Sonra fonksiyonumuz sayi1 ve sayi2 değişkeni değerini topladı ve “toplam” değişkenine atadı. Ardından dokuzuncu satırda return komutu ile sonucu bize geri gönderdi.
Program tekrar ondördüncü satıra gitti ve dönen değeri seri porta yazdırdı.
tesekkür