İçeriğe geç

Rehber

Arduino Nasıl Kodlanır? Sketch’i Satır Satır Anlatım

setup ve loop, pinMode, digitalWrite, delay, değişken, if, analogRead ve Serial. Blink kodunu satır satır okuyoruz.

5 dakika okuma

Arduino’da yazdığınız dosyaya sketch denir. Dil, C ve C++’ın sadeleştirilmiş bir yüzüdür: süslü parantez, noktalı virgül, fonksiyonlar ve değişken tipleri vardır. IDE iki zorunlu fonksiyon bekler. `setup()` kart açılınca veya reset’e basınca bir kez çalışır; pin yönlerini ve seri portu burada ayarlarsınız. `loop()` ise `setup` bittikten sonra sonsuza kadar tekrar eder. LED yakıp söndürmek, mesafe ölçmek, motor sürmek hep `loop` içindedir.

Bu yazıda önce klasik Blink kodunu satır satır okuyacağız. Sonra aynı dilin buton, analog okuma ve seri monitörde nasıl durduğuna bakacağız. Amaç “kopyala yapıştır çalıştı” değil, her satırın ne işe yaradığını söyleyebilmek.

Aşağıdaki sketch, Uno üzerindeki 13 numaralı pine bağlı L LED’ini saniyede bir yakıp söndürür. Arduino IDE içinde Dosya → Örnekler → 01.Basics → Blink aynı işi görür; burada satırları bilinçli olarak açık yazıyoruz.

void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  delay(1000);
}

`void setup()` bir fonksiyon tanımlar. `void`, fonksiyonun geriye sayı veya metin döndürmediği anlamına gelir. Parantezlerin içi boştur; bu fonksiyona dışarıdan parametre verilmez. Arduino çekirdeği kart açılınca bu fonksiyonu sizin yerinize çağırır, siz `setup`’ı ayrıca çağırmazsınız.

Süslü parantez `{` fonksiyon gövdesini açar. Gövde kapanmadan yazılan her satır `setup`’ın parçasıdır.

`pinMode(13, OUTPUT);` 13 numaralı pini çıkış yapar. İlk argüman pin numarasıdır, ikinci argüman yöndür. `OUTPUT` demek “bu pinden 0 veya 5 volt basacağım” demektir. `INPUT` veya `INPUT_PULLUP` ise pini okumak içindir; Blink’te LED sürdüğümüz için çıkış seçilir. Satır sonundaki noktalı virgül C ailesinde zorunludur; unutulursa derleyici o satırda hata verir.

`}` ile `setup` biter. Bundan sonra `setup` bir daha kendiliğinden çalışmaz. Pin yönü bir kez ayarlanır, `loop` her turda `pinMode` tekrarlamak zorunda değildir.

`void loop()` ikinci zorunlu fonksiyondur. Yine değer döndürmez, yine parametre almaz. `setup` bittikten sonra Arduino `loop`’u bitince yeniden başlatır. Bu yüzden LED sonsuza kadar yanıp söner; sizin “tekrar et” diye bir while yazmanız gerekmez.

`digitalWrite(13, HIGH);` 13 numaralı pine yüksek seviye basar. Uno’da yüksek seviye yaklaşık 5 volttur, LED iletir, L yanar. `HIGH` yerine `1` de yazılabilir; okunaklı olan `HIGH` ve `LOW` sabitleridir.

`delay(1000);` milisaniye cinsinden bekler. 1000 milisaniye bir saniyedir. Bu süre boyunca kart başka iş yapmaz: buton okumaz, mesafe ölçmez. Blink için sorun değildir. Robot arabada uzun `delay` kullanmak, ultrasonik sensörün geç okunmasına yol açar; orada milisaniye sayacı (`millis`) tercih edilir, o konu bu ilk dersin dışındadır.

`digitalWrite(13, LOW);` aynı pini alçak seviyeye çeker, LED söner. İkinci `delay(1000)` sönük halde bir saniye bekler. `loop` fonksiyonu kapanınca Arduino başa döner ve LED yeniden yanar.

Sabit ve değişken

Pin numarasını her satırda 13 yazmak çalışır, ama pini 8’e alınca dört yeri değiştirmeniz gerekir. Bunun yerine başta bir sabit tanımlanır.

const int ledPin = 13;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  digitalWrite(ledPin, HIGH);
  delay(400);
  digitalWrite(ledPin, LOW);
  delay(400);
}

`const int ledPin = 13;` bir tam sayı değişkendir ve `const` yüzünden program çalışırken değeri değiştirilemez. `int` işaretli tam sayıdır. Pin numarası ve milisaniye için yeterlidir. `ledPin` adı sizin verdiğiniz isimdir; derleyici için `kirmiziLed` de aynı işi görür, okuyan kişi için anlamlı ad daha iyidir.

`delay(400)` yanık ve sönük süreyi kısaltır, LED daha sık yanıp söner. Sayıyı değiştirmek programın ritmini değiştirir; donanımı değiştirmez.

Yorum satırları

`//` ile başlayan satır derlenmez. Neden 220 ohm kullandığınızı veya hangi pine gittiğinizi buraya yazarsınız. `/* ... */` bloğu birden fazla satırı yorum yapar. Yorum, karta yüklenen boyutu pratikte etkilemez; sizin üç ay sonra kodu okumanızı etkiler.

Buton: dijital okuma ve if

LED çıkıştır, buton giriştir. Aşağıdaki sketch’te buton 2. pin ile GND arasına bağlıdır, dahili pull-up açıktır. Pin boştayken `HIGH` okunur, basınca GND’ye iner ve `LOW` olur.

const int butonPin = 2;
const int ledPin = 8;

void setup() {
  pinMode(butonPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  int durum = digitalRead(butonPin);
  if (durum == LOW) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
}

`digitalRead(butonPin)` pinin anlık seviyesini döndürür. Sonuç bir değişkene atlanır: `int durum = ...`. `if (durum == LOW)` koşul doğrudur çünkü basılıdır. `==` karşılaştırır, `=` atar; `if (durum = LOW)` yazmak yeni başlayanların klasik hatasıdır, derleyici bazen uyarır bazen uyarmadan yanlış çalışır.

`else` dalı buton basılı değilken LED’i söndürür. Süslü parantezler if gövdesini sınırlar; tek satırda parantez zorunlu olmasa da her zaman yazmak, sonra eklenen ikinci satırın if dışına kaçmasını önler.

analogRead ve map

A0’a bağlı bir potansiyometre 0–5 volt üretir. `analogRead(A0)` bunu 0–1023 arası bir tam sayı yapar. Servo 0–180 derece bekler; iki aralık `map` ile oranlanır.

int ham = analogRead(A0);
int aci = map(ham, 0, 1023, 0, 180);

`map` beş argüman alır: değer, girişin min ve max’ı, çıkışın min ve max’ı. Bu bir sihir değildir, bir doğru orantıdır. Eşik ile LED yakmak için `map` şart değildir: `if (ham < 400)` yeter, 400 sayısı sizin odanızın ışığına göre seri monitörden seçilir.

Serial: kodun konuşması

Kartın ne gördüğünü anlamanın yolu seri monitördür.

void setup() {
  Serial.begin(9600);
}

void loop() {
  int ham = analogRead(A0);
  Serial.print("A0 = ");
  Serial.println(ham);
  delay(200);
}

`Serial.begin(9600)` saniyede 9600 bitlik haberleşmeyi açar. IDE’deki seri monitör baud’u da 9600 olmalıdır. `print` aynı satıra yazar, `println` satır sonu ekler. `delay(200)` ekranın okunamayacak kadar hızlı akmasını keser.

Kendi fonksiyonunuz

`loop` şişmesin diye işi parçalara bölersiniz. L298N yazısındaki `ileri()` ve `dur()` tam olarak budur: birkaç `digitalWrite` bir ismin altına toplanır, `loop` yalnızca sırayı söyler.

Arduino kodlamak, ezber komut listesi değil bu yapıları üst üste koymaktır. Pin yönü `setup`’ta, tekrar eden iş `loop`’ta, okunan değer değişkende, karar `if` ile, insan gözü `Serial` ile. Uno donanımı Arduino Uno nedir yazısında, WiFi’li taraf ESP32 yazısında duruyor.

Mağaza

Bu yazıdaki parçalar stokta

WhatsApp