Arduino Dersleri-5 Arduino Kontrol Yapıları

Merhabalar, bu yazımızda Arduino Kontrol Yapıları -if, else, for, switch case, do while, break, return, continue, goto komutlarını işleyeceğiz. Arduino’da bazı devre elemanlarını veya sensörleri “belli koşulları sağladığı sürece” çalıştırmak isteyebiliriz. Bu gibi durumlar için birçok programlama dilinde olduğu gibi Arduino programlama dilinde de akış kontrol yapıları bulunmaktadır. Bu yazımızda da sizlere Arduino kontrol yapıları hakkında bilgi vereceğim.

if /else if/ else Komutu:

if komutu, Arduino kod içerisinde belirli koşula göre devrenin çalışmasını sağlar. “if” ‘ten sonra verilen koşul doğru ise bu if bloğundaki işlemler gerçekleşir, yanlış ise “else” bloğundaki işlemler gerçekleşir.

if (koşul)
{
// Koşul sağlanıyor ise yapılacak işlem
}
else
{
// Koşul sağlanmıyor ise yapılacak işlem
}

Örnek Uygulama:

Aşağıdaki örnek uygulama ldr devresinden alıntı yapılmıştır.

int deger = analogRead(A0); //deger isimli bir değişken tanımladık ve Analog A0 portundan sinyal okunmasını sağladık.
if(deger<800)  // Analog A0 dan okunan LDR direnç değeri 800 altına indiğinde aşağıdaki işlemleri yap diyoruz.
{
digitalWrite(led, HIGH);  // Koşul gerçekleşirse led diyota enerji göndererek ışık vermesini sağladık.
}
else
{
digitalWrite(led, LOW);  //Koşul gerçekleşmezse led diyotun enerjisini keserek ışığın sönmesini sağladık.
}

if döngüsü içerisinde birden fazla koşul eklemek istersek else if komutunu kullanırız. Örneğin yukarıdaki örnekte 800 değerinin üzerinde ve altındaki koşullar için iki farklı koşul yazdık. else if ile bir ara koşul daha eklemek istersek kod kısmı aşağıdaki gibi olacaktır.

int led=7; // Led’in bağlı olduğu pin
void setup() {
pinMode(led,OUTPUT); // Led’in bağlı olduğu pini çıkış olarak ayarladık.
Serial.begin(9600); //Seri haberleşme hızını ayarlıyoruz.
}
void loop() {
int deger = analogRead(A0); //deger isimli bir değişken tanımladık ve Analog A0 portundan sinyal okunmasını sağladık.
Serial.println(deger); // Değişen direnç değerinin Seri Portta gösterilmesini sağladık
delay(250); // 250 milisaniye bekleyerek değer göstermesini istedik
if(deger<800) // Analog A0 dan okunan LDR direnç değeri 800 altına indiğinde aşağıdaki işlemleri yap diyoruz.
{
digitalWrite(led, HIGH); // 800 değeri altında koşul gerçekleşirse led diyota enerji göndererek ışık vermesini sağladık.
}
else if (deger>=950) // 900 değeri üzerinde koşul gerçekleşirse led diyotun enerjisini keserek ışığın sönmesini sağladık.
{
digitalWrite(led, LOW);
}
else // Üstteki koşullar dışında değer 800 ile 900 arasında ise ledi 500 milisaniye aralıklarla yakıp söndürmesini sağladık.
{
digitalWrite(led, HIGH);
delay(500);
digitalWrite(led, LOW);
delay(500);
}
}

Not: Burada if komutu ile else if komutu aynı yapıdadır.  else komutu ise tanımlanan ifadelerin dışındaki ifadeleri kapsamaktadır. Bundan dolayı else komutuna tanım aralığı girmiyoruz.

for Komutu:

Genellikle artış veya azalış sayacı olarak kullanılır. Bir değerden farklı bir değere kadar artırılıp veya azaltılarak son belirlenen değerden sonra döngüyü bitiren operatördür. for içinde yer alan koşul doğru olduğu sürece, döngüdeki işlemler gerçekleştirilir.

Örnek Kullanım:

for (başlangıç değeri; koşul; artım) {
//işlemler
}

Örnek Uygulama:

Arduino For değişkeni - Arduino Kontrol Yapıları

Açıklama:

int : Değişken tanımlama fonksiyon ismi.

i=0 : döngünün başlangıç değerini ifade eder. Burada i bir değişkendir. Başka harflerde değişkenlerde başlangıç için kullanılabilir.

i<100 : bu kısım döngünün şart kısmıdır. İlk değer verildikten sonra şart kontrol edilir. Şart doğru ise süslü parantez içindeki kodlar çalıştırılır. Sonra her artış ya da azalıştan sonra şart tekrar kontrol edilir. Şart sağlanıyorsa süslü parantezler arası tekrar çalıştırılır.

i++: Döngünün çalıştırılması için şart miktarının belirlendiği bölümdür. Bu örnekte şart 1 artacak şekilde belirlenmiştir. Program buraya her uğradığında i değeri bir artacaktır.

 i değeri 99’a ulaşana kadar döngü devam edecek. i değeri 99 olduğu zaman döngü bitecektir.

i değerinin artışını daha farklı bir değer yazmak istersek son satırdaki i++ ifadesini i=i+2 şeklinde yazabiliriz. Ya da i+=2 şeklinde de yazabiliriz. Bu sayede i sayısı 2şer 2 şer artacaktır.

Örnek Arduino Uygulaması:

//for döngüsü ile Yürüyen ışık devresi
void setup() {
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
Serial.begin(9600);
}
void loop() {
for (int i = 5; i < 10; i++) //Baştan sona doğru ledleri yakıp söndürecek.
{
digitalWrite(i, HIGH);
delay(100);
digitalWrite(i, LOW);
delay(100);
}
for (int i = 9; i > 4; i–) //Sondan başa doğru ledleri yakıp söndürecek.
{
digitalWrite(i, HIGH);
delay(100);
digitalWrite(i, LOW);
delay(100);
}
}

Yukarıdaki uygulamada ledler baştan sona doğru yanıp sönecek, son ledden sonra sondan başa doğru ledler yanıp sönecek ve döngü bu şekilde devam edecektir.

switch case Komutu:

switch komutu, bir değişkene atanan değerleri alır ve case operatörüne gönderir. case operatörü, gelen değeri karşılaştırır ve uygun olan değerleri çalıştırır. case ifadesinin sonunda ‘break’ komutu yer alır. Bu komutla döngü bitirilir. case komutuna yazılan ifadeler sadece bir kez çalışarak ‘break’ komutu ile sonlanır. Bu sayede algoritmada çakışmalar önlenmiş olur. Son olarak ‘default’ komutu ile, case komutlarında tanımlanmamış ifadeler burada çalıştırılarak algoritma tamamlanır.

Kullanımı:

int a = 1;
switch (a)
{
case 1:
digitalWrite(led,HIGH);
break;
case 2:
digitalWrite(led,LOW);
default:
Serial.println(“Tanımlanmayan ifade”);
}

Yukarıdaki ifadede a değişkenine 1 değeri tanımlanmıştır. Bu şekilde kod satırı derleme yapıldığında Arduino 1 sayısının karşılığı olarak led diyot yanacaktır. Eğer 2 değeri verilse idi led diyot sönük olacaktı. Daha farklı bir değer girildiğinde bir işlem yapılmayacaktır.

Örnek Arduino Uygulaması:

//Seri port ekranında klavyeden harf girerek led yakma
void setup()
{
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
Serial.begin(9600);
Serial.println(“Bir harf giriniz: “);
}
void loop()
{
if (Serial.available() > 0)
{
int veri = Serial.read(); //Seri port ekranından yazılan bilgiyi oku, veri değişkenine ata
switch (veri) //Girilen veri değerine göre aşağıdaki eylemleri yap
{
case ‘a’:
digitalWrite(5, HIGH);
Serial.println(“Kırmızı Lamba Yandı”);
break;
case ‘b’:
digitalWrite(6, HIGH);
Serial.println(“Sarı Lamba Yandı”);
break;
case ‘c’:
digitalWrite(7, HIGH);
Serial.println(“Yeşil Lamba Yandı”);
break;
case ‘d’:
digitalWrite(8, HIGH);
Serial.println(“Mavi Lamba Yandı”);
break;
case ‘e’:
digitalWrite(9, HIGH);
Serial.println(“Beyaz Lamba Yandı”);
break;
case ‘f’:
for (int led = 5; led < 10; led++)
{
digitalWrite(led, LOW);
Serial.println(“Tüm Lambalar Söndü”);
}
break;
default:
break; //default içerisine değer girilmeyecekse break; komutu eklenir. Değer girilirse break; komutu eklenmez.
// Ya da değer girilmeyecekse default komutu eklemeye gerek yoktur.
}
}
}

Not: Seri porttan okunan değer “char” yani karakter formatındadır.  “int” şeklinde değer değildir. Bu nedenle seri port ekranından değer girilecekse case ifadelerinde tek tırnak işareti kullanılır. Eğer kodlama içerisinde biz case değerini belirtip Arduino kartına göndereceksek case ifadelerinde tek tırnak işareti kullanılmaz.

Yukarıdaki örnekte seri port ekranından harf girerek harflere karşılık gelen ledlerin yakılması ve söndürülmesi uygulamasını yaptık.

while Komutu:

while komutu içerisinde belirtilen şartlar sağlandığında şarta bağlı kodların çalışmasını sağlar. Şartlar tamamlandığında döngü sonlandırılır. Çalışma şekli for döngüsü ile benzemektedir. while komutu, döngünün kaç kez çalışacağının belirtilmediği durumlarda kullanılır. Döngü sayısı while parantez dışında istenirse ayrıca belirtilebilir.

Örnek yazım:

while (şart ifadesi)
{
Şarta göre gerçekleştirilecek kodlar buraya yazılır.
}

Örnek Arduino Uygulaması:

//while fonksiyonu ile led yakma
int x=0;
void setup() {
pinMode(6,OUTPUT);
Serial.begin(9600);
}
void loop() {
Serial.println(“While Komutu Test Ekranı:”);
while(x<4)
{
digitalWrite(6, HIGH);
delay(250);
Serial.println(“Led Yandı”);
digitalWrite(6, LOW);
delay(250);
Serial.println(“Led Söndü”);
x++;
}
while(true);
}

Yukarıdaki örnekte while komutu içerisinde yer alan x değeri, 0 dan başlayarak 4 e kadar devam edecek ve ledler 0,1,2,3 değerleri okunduğunda yanıp sönecek ve döngü duracaktır. Eğer while komutu öncesinde çalışan başka bir komut dosyası var ise (örn: seri porta yazılan yazı) while(1); veya while(true); komutlarını komut satırının sonuna ekleyerek döngünün tekrar etmemesini sağlayabiliriz.

do while Komutu:

while döngüsü ile arasındaki fark, while komutu, do komutundan sonra gelmekte ve do komutu içerisindeki komutlar bir kez çalıştıktan sonra while komutundaki koşulun çalışmasıdır. Koşul çalıştırılmaya uygun olmasa bile do içerisindeki komut mutlaka 1 kez çalıştırılır. Projelerde ilk çalıştırmada bir lambanın, bir motorun tek bir hareket yapıp daha sonra döngüye girmesini istediğimiz koşullarda bu komutu kullanabiliriz. Bu komut kullanılırken while koşulundan sonra noktalı virgül kullanmamız gerekmektedir.

Örnek Yazım:

do {
kod kısmı
} while (koşul);

Örnek Arduino Uygulaması:

//do while fonksiyonu ile led yakmavoid setup() {
pinMode(6,OUTPUT);
Serial.begin(9600);
}
void loop() {
int x=0;
do {
Serial.println(“Sayı değeri belirtilen değere ulaşmadı…”);
delay(1000);
x++;
}
while(x<4);
Serial.println(“Sayı değeri belirtilen değere ulaştı!”);
digitalWrite(6, HIGH);
delay(500);
Serial.println(“Led Yandı”);
digitalWrite(6, LOW);
delay(500);
Serial.println(“Led Söndü”);
while(true);
}

Yukarıdaki kodlama satırında do döngüsü öncesi x adında bir değişken tanımlanıp başlangıç değeri 0 olarak ayarlanmıştır. do döngüsü içerisine seri port ekranında ilk satırda yazacak bir metin eklenmiştir. x değeri her döngü başlangıcında 1 artacak kadar x++ satırı eklenmiştir. while döngüsü içerisindeki ifade do döngüsü içerisinde belirtilen değerden küçük olduğu müddetçe döngü başa döner ve do döngüsü tekrar çalışır. Eğer belirtilen şart uymuyorsa bu sefer while komutu altında belirtilen kodlar çalışır. Bu örnekte de seri port ekranında 4 kez do döngüsü çalışır, 5. kez sayı 4 den büyük olduğu için koşulu karşılamaz ve while altındaki kodlar çalışır. Burada while altındaki kodların tek sefer çalışması istenirse son satıra while(true); komutu eklenir.

break Komutu:

break komutu for, while, do..while döngülerinde döngüyü durdurma veya döngüden çıkmak için kullanılır. Aynı zamanda switch case kontrol yapısından da çıkmak için break komutu kullanılır.

Örnek Yazım:

break;

Örnek Arduino Uygulaması:

// Break komutu PWM Sinyali Örneği
int led = 5;
int x;
void setup() {
Serial.begin(9600);
}
void loop() {
for (x = 0; x < 255; x ++)
{
if (x > 25)
{
break;
}
analogWrite(led, x);
delay(50);
Serial.println(x);
delay(50);
}
}

Yukarıdaki uygulamada x değeri, 0 dan 255 e kadar birer artarak led değerine yazılmaktadır. if (x > 25) komutu ile 25 değerinden sonraki değer için break; komutu kullanılmış ve döngü 25 değerinde durarak tekrar başa dönmüştür. Seri port ekranında da bu durum görülebilmektedir.

continue Komutu:

continue komutu, for, while, do..while döngülerinde bir aralığı atlamak için kullanılır.

Örnek Yazım:

continue;

Örnek Arduino Uygulaması:

// Continue komutu PWM Sinyali Örneği
int led = 5;
int x;
void setup() {
Serial.begin(9600);
}
void loop() {
for (x = 0; x < 255; x ++)
{
if (x > 25 && x < 75)
{
continue;
}
analogWrite(led, x);
delay(50);
Serial.println(x);
delay(50);
}
}

Yukarıdaki uygulamada x değeri, 0 dan 255 e kadar birer artarak led değerine yazılmaktadır. if (x > 25 && x < 75) komutu ile 25 ile 75 rakamı arasındaki değerler continue; komutu kullanılarak atlanılmıştır. Döngü 25 değerinden sonra 75 e atlayarak devam edip 255 değerinden sonra tekrar başa dönmüştür. Seri port ekranında da bu durum görülebilmektedir.

return Komutu:

return komutu, fonksiyonların sonlandırılması için kullanılır. Bir başka kullanım şekli ise, yazmış olduğunuz fonksiyonda bir değer veya değişkenle birlikte kullanıldığında fonksiyonun sonucunu return komutu ile alabiliriz.

Örnek Yazım:

return;

Fonksiyon Sonlandırmaya Örnek Arduino Uygulaması:

//return ile fonksiyon sonlandırma – Yürüyen ışık devresi
void setup() {
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
}
void loop() {
for (int i = 5; i < 10; i++) //Baştan sona doğru ledleri yakıp söndürecek.
{
digitalWrite(i, HIGH);
delay(100);
digitalWrite(i, LOW);
delay(100);
}
return;
for (int i = 9; i > 4; i–) //Sondan başa doğru ledleri yakıp söndürecek.
{
digitalWrite(i, HIGH);
delay(100);
digitalWrite(i, LOW);
delay(100);
}
}

Yukarıdaki uygulama, for döngüsü ile ledleri baştan sona doğru ve sondan başa doğru yakmaktadır.  return; kodunu ikinci for döngüsü öncesine koyduğumuzda kodlar return komutuna kadar çalıştırılır, return komutundan sonra döngü tekrar başa dönerek çalışma baştan başlar. return komutunun altındaki komut satırları çalıştırılmaz. Bazen uzun kodlama gerektiren durumlarda kodda çıkan sorunun hangi satırdan sonra oluştuğunu bulmak için return komutu ile kod belirli bir yerde durdurulur ve kodlar bu şekilde kontrol edilebilir.

Geriye Değer Döndüren Fonksiyona Örnek Arduino Uygulaması:

//return geriye fonksiyon uygulaması – Potansiyometre değer okuma
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println(deger()); //deger metodunu seri port ekranında görüntüledik.
delay(250);
}
int deger(){ //deger isimli yeni bir metod oluşturduk.
int pot = analogRead(A0); //pot isimli değişken oluşturarak A0 ‘dan veri okuma yaptık.
return pot; //pot değeri okunarak fonksiyon geri döndürülmüş olacak.
}

Yukarıdaki uygulamada Arduino A0 portuna bir potansiyometre bağladık. deger isimli yeni bir metot oluşturduk. pot isimli bir değişken oluşturarak A0 ‘dan veri okuma yaptık. return komutu ile pot değeri okunarak fonksiyonu geri döndürmüş olduk. Böylece döngü tekrar baştan çalışmış oldu. Seri port ekranında ise deger metodunu görüntülemiş olduk.

goto Komutu:

goto komutu, belirlemiş olduğumuz bir etiket değerine, program akışının gitmesini sağlar. fonksiyonların sonlandırılması için kullanılır. Bir başka kullanım şekli ise, yazmış olduğunuz fonksiyonda bir değer veya değişkenle birlikte kullanıldığında fonksiyonun sonucunu return komutu ile alabiliriz.

Örnek Yazım:

etiket:

goto etiket;

goto Örnek Arduino Uygulaması:

//goto komutu örneği – Yürüyen ışık devresi
void setup() {
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
Serial.begin(9600);
}
void loop() {
adim1:
for (int i = 5; i < 10; i++)
{
digitalWrite(i, HIGH);
delay(100);
digitalWrite(i, LOW);
delay(100);
}
goto adim1;
for (int i = 9; i > 4; i–)
{
digitalWrite(i, HIGH);
delay(100);
digitalWrite(i, LOW);
delay(100);
}
}

Yukarıdaki uygulama, 5 ledli yürüyen ışık devresi. Ledler baştan sona doğru ve sondan başa doğru yanmaktadır. goto komutu ile döngünün herhangi bir yerine çalışmanın geri gitmesini sağladık. goto komutunun gitmesini istediğimiz kısımaa bir etiket oluşturmamız gerekiyor. Biz adim1: şeklinde bir etiket oluşturduk. Daha sonra goto adim1; yazarak çalışmayı etiket bloğuna tekrar yönlendirdik. Arduino komutları içerisinde kullanım alanı çok azdır diyebiliriz. Uzun kod blokları arasında deneysel çalışmalar yapmak ve sonuçlarını görmek istediğiniz yerlerde bu komutu kullanarak programınızı test etmiş olursunuz.

ARİTMETİK OPERATÖRLER

% (kalan)

* (çarpma)

+ (toplama)

– (çıkarma)

/ (bölme)

= (atama operatörü) – Karşısındaki ifadeye atama yapar.

KARŞILAŞTIRMA OPERATÖRLERİ

== (eşittir) – Gelen veri değerini karşılaştırır

!= (eşit değil)

< (küçüktür)

<= (küçüktür veya eşittir)

> (büyüktür)

>= (büyüktür veya eşittir)

SÖZ DİZİMLERİ

#define (tanımla)

#include (dahil et)

/* */ (yorumu engelle)

// (tek satırlık yorum)

; (noktalı virgül)

{} (süslü parantezler)

MANTIKSAL OPERATÖRLER

! (mantıksal değil)

&& (mantıksal ve)

|| (mantıksal veya)

REFERANS OPERATÖRLER

& (referans operatörü)

* (referans operatörü)

Arduino Kontrol Yapıları -if, else, for, switch case, do while, break, return, continue, goto

Devre hakkında yorumlarınızı aşağıdaki yorum kısmına yazabilirsiniz. Youtube kanalımızda da Temel Elektrik- Elektronik, Arduino ve mBlock ile ilgili ders videoları bulabileceksiniz. Youtube kanalıma abone olmayı da unutmayınız.

https://www.youtube.com/@candemirahmet

Oval@3x 2

Bu ipuçlarını kaçırmayın!

Kayıt butonuna bastıktan sonra e-postanız gelen kutunuza giderek gelen e-postayı onaylamayı unutmayınız. Gelen kutusunda görülmeyen postalar için Önemsiz -Spam klasörünü kontrol edebilirsiniz. Eğer kayıt e-postası ulaşmadıysa iletişim menüsünden bu durumu bildirebilirsiniz.

Yazan: Ahmet Candemir
Teknik Öğretmen - Cisco Instructor - Microsoft MCP - ECDL MS Office Advanced Expert - Adobe Eğitmeni - MEB Fatih Projesi Koordinatörü - Robotik Kodlama Eğitmeni