Arduino Eğitim Kiti – Tüm Yıl İçin Arduino Müfredatı: Ders 7 Döngü için isterseniz sunu şeklinde alt taraftaki kutucuğu büyüterek takip edebilir, isterseniz de tüm sunu sayfalarının makale haline dönüştürülmüş versiyonu takip edebilirsiniz. İçerikler büyük oranda aynıdır. Sınıf ortamında kolaylık olması açısından sunu şeklinde de sunulmuştur.
Ders İçeriği:
Döngüler
Ders Kazanımları:
- Döngülerin kullanım amaçlarını yazar.
- For, While, Do/While döngülerinin kullanımları arasındaki farkı açıklar.
- Continue, Return, Go to terimlerinin bir kod bloğu içindeki işlevlerini tanımlar.
Döngüler:
- Yazılan kodlarda belirli satırların birden fazla tekrar edilmesi istenebilir. Böyle durumlarda döngü yapıları kullanılır.
- Döngü yapılarında, döngünün kaç kere tekrar edeceği dinamik olarak belirlenebilir. Hatta döngünün tekrarlaması bir koşula bağlanabilir.
“FOR” Döngüsü:
- İçerisinde tanımlanan değişkenin değeri, büyüklük koşulunu sağladığı sürece döngü devam eder.
- Her döngü turu tamamlandığında, yeni tura geçmeden önce değişkenin değeri bir arttırılır ve koşul test edilir. Eğer koşul hala geçerli ise döngü turu başlar.
- Koşulun geçerliliği bittiğinde döngü biter ve program kaldığı yerden devam eder.
- Örneğin; 5 kere tekrar eden for döngüsü yazalım.
for(int i =0; i < 5; i ++)
{
/*
Burası 5 kere okunacak, program buraya her
uğradığında i değeri bir arttırılacak.
i değeri 5’e ulaşana kadar döngü devam
edecek.
i değeri 5 olduğu zaman döngü bitecek.
*/
}
- 5 tane Arduino’ya bağlanan LEDi sırasıyla yakan döngüyü yazalım.
for (int pin = 0; pin <= 5; pin++)
{
pinMode(pin, HIGH);
/* pin değişkenindeki 0’dan 5’e kadar bütün değerler sırasıyla pinMode komutuna gelir. pinMode bölümünde HIGH komutu ile pinlere 5V enerji gönderilir.*/
}
NOT: pinMode komutu Arduino üzerindeki bir LEDi yakmamızı sağlayan koddur. Bu ve buna benzer kodlar 8. sunumda anlatılmaktadır. Şu an için for döngüsünün mantığının kavranması yeterlidir.
“WHILE” DÖNGÜSÜ:
- While döngüsü genellikle bir koşula bağlanır. Eğer koşul doğru ise döngü devam eder. Koşul bozulduğunda döngü biter ve program kaldığı yerden devam eder.
- Örneğin while dışında ‘h’ değişkeni tanımlayalım. Bu değişkenin ilk değeri 5 olsun. Eğer ‘h’ değişkeni 100’den küçükse döngü devam etsin. Döngünün her turunda da ‘h’ değişkeninin değeri 2 katına çıksın. int h = 5; //while döngüsünün başlangıç değeri
while( h < 100) //while döngüsünün bitiş değeri
{ /*
Burası h değişkeni 100 den küçük olduğu sürece çalışacak
*/
h = h * 2;
/*
Üst satırdaki h’ı iki katına çıkartma işlemi alt satırdaki gibi de tanımlanabilirdi.
h *= 2;
Eğer h’ ın değeri arttırılmazsa döngü koşulu doğru olduğu için döngü sonsuza
kadar devam edecektir
*/
}
Örnek: 10’a kadar olan sayıları ekrana yazan programı while döngüsü ile yazalım.
int sayi=0;
while(sayi<=10)
{
Serial.println(sayi); //Arduino da kullanılan bir ekrana
//yazma komutu
sayi++; //sayi değişkeninin birer birer artması
}
NOT: Serial.println komutu Arduino programına ait serial ekranda bilgi okumamızı sağlayan koddur. Bu ve buna benzer kodlar 8. sunumda anlatılmaktadır. Şu an için while döngüsünün öğrenilmesi gerektiğinden ayrıntıya girilmemiştir.
Örnek: Ekrana 5 kez “Robolink Teknoloji” yazan programı while döngüsü ile yazınız.
Cevap:
int say=0;
while(say>5)
{
Serial.println(“Robolink Teknoloji”);
say++;
}
“DO WHILE” DÖNGÜSÜ:
Burada while operatörü karşılaştırmalarda şartı içeriyorsa do ifadesine göndererek tekrar hesaplama yaptırarak yeni değeri karşılaştırır.
do
{
delay(50);
x = readSensor();
} while (x < 100);
Bu örnekte x değeri 100’ün altında olduğu sürece sensörden veri okunacaktır.
NOT: delay komutu bekleme komutudur. 50 milisaniye beklenmesi gerektiği belirtilir. Bu ve
buna benzer kodlar 8. sunumda anlatılmaktadır. Şu an için do while döngüsünün öğrenilmesi gerektiğinden ayrıntıya girilmemiştir.
Örnek: 7 kez dönen ve her döngü döndüğünde ekrana döngü dönüyor şeklinde uyarı yazan programı “do while“ döngüsü ile tasarlayınız.
Cevap:
sayı=0
do
{
Serial.println(“Döngü Dönüyor”);
x++;
} while (x >7);
“SWITCH CASE” YAPISI:
- Switch ifadesi bir nesneye atanan değerleri alır ve alt ifade ‘case’ operatörüne gönderir.
- Bu ifade de değerleri karşılaştırır ve denk gelen ifadeleri çalıştırır.
- Her ‘case’ ifadesinin sonunda ‘break’ komutu yer alır. Bu komutla döngü bitirilir. Yani ‘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 de ‘case’ lerde tanımlanmamış ifadeler bu tanımlamaya girerek gerekli algoritma yapılandırılır.
Örnek: Girilen haftaiçi gününe göre hava durumunu ekrana yazan programı switch case komutu ile tasarlayalım.
Cevap:
switch (gün)
{ case “pazartesi”:
Serial.println(“Hava 29 derece”);
break;
case “salı”:
Serial.println(“Hava 25 derece”);
break;
case “çarşamba”:
Serial.println(“Hava 23 derece”);
break;
case “perşembe”:
Serial.println(“Hava 20 derece”);
break;
case “cuma”:
Serial.println(“Hava 15 derece”);
break;
default:
Serial.println(“Tanımlanmamış ifade”);
break;
}
Örnek: Girilen mevsimin aylarını ekrana yazan programı switch-case komutu ile tasarlayınız.
Cevap:
switch (mevsim)
{ case “ilkbahar”:
Serial.println(“Mart Nisan Mayıs”);
break;
case “yaz”:
Serial.println(“Haziran Temmuz Ağustos”);
break;
case “sonbahar”:
Serial.println(“Eylül Ekim Kasım”);
break;
case “kış”:
Serial.println(“Aralık Ocak Şubat”);
break;
default:
Serial.println(“Tanımlanmamış ifade”);
break;
}
“CONTINUE” YAPISI:
- Do while veya for döngülerinde bir aralığı atlamak istiyorsak bu ifadeyi kullanmamız gerekir.
for (x = 0; x < 255; x ++)
{
if (x > 30 && x < 110)
{
continue;
}
analogWrite(sensor, x);
delay(50);
}
Bu örnekte x değeri 0’dan 255’e kadar birer artarak sensör değerine
yazılmaktadır.
Fakat 30 ile 110 arasındaki değerleri atlayarak sensöre yazmamaktadır.
Örnek: 0’dan 20’ye kadar olan sayıların arasında 5,10,15’i yazmayan diğerlerini yazan programın kodlarını continue kullanarak tasarlayınız.
Cevap:
for (int sayi=0; sayi=20; sayi++)
{
if(sayi==5 || sayi==10 || sayi==15)
{
continue;
}
Serial.println(sayi);
}
“RETURN” YAPISI:
- Bir fonksiyonu sonlandırarak yeni fonksiyon çağırarak yeni değerle döndürür.
double constrain(double x, float a, float b)
{
if(x < a) return a;
if(x> b) return b;
return value;
}
Burada x değeri a’dan küçük ise x’e a değerini ata. x, b’ den büyük ise x‘e b değerini ata.
“GOTO” YAPISI:
Bu yapı programın herhangi bir yerinde çalışmayı durdurup çalışmasını istediğiniz komuta yönlendirme yapmanızı sağlar.
Örneğin: Bir sonraki örnekte i=5 değerini aldığında döngüden çıkıp etiket olarak tanımladığımız yere gitmesi için goto komutunu kullandık.
İnceleyelim..
int i;
for (i = 0; i < 10; i++)
{
if (i == 5)
{
Serial.println(“i = 5 ise goto’da bulunan etikete git.”);
goto etiket;
}
}
etiket:
Serial.println(“Su an goto deyiminde bulunan etiketin oldugu yer”);
}