Bu içeriğimizde, Arduino switch case kullanımını inceliyoruz. Gömülü sistemler ve yazılım mühendisliğinde kodun okunabilirliği, bakım kolaylığı ve en önemlisi çalışma performansı hayati önem taşır. Çoklu koşul bloklarını yönetirken sıklıkla başvurduğumuz if-else-if merdiven yapısı, seçenek sayısı arttıkça kodun karmaşıklaşmasına ve işlemci üzerinde ek yük oluşmasına neden olabilir.
Bu gibi durumlarda, C/C++ dillerinin sunduğu en güçlü akış denetim mekanizmalarından biri olan Switch-Case yapısı devreye girer. Bu rehberimizde, gömülü sistemlerde Switch-Case kontrol yapısının çalışma mantığını, derleyici seviyesindeki optimizasyon avantajlarını, if-else yapılarıyla olan performans karşılaştırmasını ve Arduino üzerinde bir LDR sensörünün eşik değerlerini belirleme uygulamasıyla nasıl kullanılacağını tüm teknik detaylarıyla ele alacağız.
Derleyici Düzeyinde Karşılaştırma: If-Else-If mi Switch-Case mi Daha Verimlidir?
Birçok yeni başlayan programcı, switch-case bloğunun yalnızca görsel olarak daha düzenli bir if-else alternatifi olduğunu düşünür. Ancak bilgisayar bilimleri ve derleyici (compiler) optimizasyonları açısından bu iki yapı arasında çok temel bir fark bulunur:
- If-Else-If Merdiveni (
Zaman Karmaşıklığı): İşlemci, programcının yazdığı sıraya göre her koşul ifadesini yukarıdan aşağıya tek tek test etmek zorundadır. Eğer hedef değer listenin en sonundaysa veya hiçbirine uymuyorsa, işlemci tüm koşulları sırayla yürütür. Bu durum, özellikle kısıtlı kaynaklara sahip 8-bitlik mikrodenetleyicilerde gereksiz saat çevrimi (clock cycle) kaybına yol açar. - Switch-Case Yapısı (
Zaman Karmaşıklığı – Dallanma Tabloları): Derleyici, switchifadesindeki vaka (case) değerleri ardışık veya yoğun olduğunda, bu yapıyı bir Dallanma Tablosuna (Jump Table) dönüştürür. Dallanma tablosu, hafızadaki hedef kod adreslerini tutan bir dizidir. İşlemci, koşulları tek tek test etmek yerine, doğrudan indeksleme yöntemiyle hedef vakanın bellekteki adresine tek bir adımda (
karmaşıklıkla) atlar (direct jump). Bu sayede listenin uzunluğundan bağımsız olarak maksimum yürütme hızı elde edilir.
Masaüstü ve gömülü sistemlerde bu iki yapının mikro saniyeler seviyesindeki yürütme farklarını görmek ve deneysel analizleri incelemek için BlackWasp If-Else ve Switch Hız Karşılaştırmalı Test Raporuna göz atabilirsiniz.

Sonuç olarak; karar verilecek seçenek sayısı 3 veya daha fazla olduğunda, derleyicinin kodu optimize etmesine olanak tanımak ve kodun okunabilirliğini en üst düzeyde tutmak amacıyla switch-case yapısını kullanmak bir endüstriyel standarttır.
Arduino Üzerinde Switch-Case Kullanımı ve LDR Sensör Eşik Uygulaması
Projemizde, Switch-Case yapısının çoklu durum yönetimini simüle etmek amacıyla bir LDR (Işık Bağımlı Direnç) sensöründen gelen ortam ışığı verilerini kullanacağız. Sensörden okuduğumuz analog değerleri map() fonksiyonuyla 4 farklı ışık yoğunluk durumuna (0: Karanlık, 1: Loş, 2: Orta, 3: Aydınlık) dönüştüreceğiz. LDR sensörünün detaylı çalışma ve kalibrasyon ilkeleri için Karanlıkta LED Yakan LDR Sensör Devresi Yapımı kılavuzumuzdan yararlanabilirsiniz.
Arduino Switch Case Kullanımı için Gerekli Malzemeler
- Arduino UNO: Projenin kontrol ünitesi.
- LDR (Foto Direnç): Işık yoğunluğunu algılayan sensör.
- 10 kΩ Direnç: Gerilim bölücü devresi oluşturmak için pull-down direnci (Direnç hesaplamaları için direnç renk kodları ve okuma teknikleri rehberimizi inceleyebilirsiniz).
- Breadboard ve Jumper Kablolar: Güvenli devre prototiplemesi için bağlantı elemanları.
Devre Şeması ve Kablolama Rehberi
LDR’nin direnç değişimini Arduino’nun analog-dijital dönüştürücüsünün (ADC) algılayabileceği bir voltaj sinyaline dönüştürmek için basit bir gerilim bölücü kurmamız gerekir. Gerilim bölücülerin donanımsal altyapısını gerilim bölücü (voltage divider) teorisini inceleyerek daha iyi kavrayabilirsiniz. Devre şemasındaki bağlantılar şu şekildedir:

- LDR’nin bir ayağını Arduino
çıkış pinine bağlayın. - LDR’nin diğer ayağını Arduino’nun A0 analog giriş pinine ve aynı zamanda
sabit direncin bir ayağına bağlayın.
direncin boşta kalan diğer ayağını ise Arduino’nun GND pinine bağlayarak devreyi tamamlayın.
Arduino Switch-Case Uygulama Kodları
Aşağıdaki kaynak kod, A0 analog girişinden ortam ışığı seviyesini okur. Okunan bu değeri map() yardımıyla
aralığına indirger ve ardından switch-case bloğuyla durum analizi yaparak bilgisayara ilgili durum mesajını seri port üzerinden gönderir:
Switch-Case Yapısındaki Anahtar Kavramlar
- switch(koşul): Koşul parantezi içine yalnızca
intveyachargibi tamsayı tabanlı veri tipleri yazılabilir.floatveyadoublegibi ondalıklı sayılar switch-case yapısında kullanılamaz. - case [değer]: Koşul değişkeninin eşit olabileceği durumların tanımlandığı etiketlerdir.
- break: İşlemcinin eşleşen case bloğunu çalıştırdıktan sonra switch yapısından derhal çıkmasını sağlar. Eğer
breakkomutu kullanılmazsa, işlemci altındaki diğer case durumlarını da koşulsuz olarak sırayla çalıştırmaya devam eder (fall-through davranışı). - default: Koşul değişkeninin tanımlanan vaka (case) değerlerinin hiçbirine uymaması durumunda çalışacak olan varsayılan güvenlik bloğudur.
Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.

