BP–01 · Başlangıç projesi

Buton ile LED Kontrolü

Arduino'nun dış dünyayı nasıl "duyduğunu" öğrenmenin en iyi yolu: bir push butonu dijital giriş olarak okuyup LED'i kontrol edeceğiz. Sonra yazılımsal debounce ile butonu gerçek bir aç/kapa anahtarına çevireceğiz.

SeviyeBaşlangıç
Süre30–40 dk
Malzeme8 çeşit
digitalRead()INPUTPull-down dirençif / elseDebouncemillis()

Proje hakkında

Şimdiye kadar Arduino'ya sadece "şunu yap" dedik; bu projede ilk kez Arduino'ya "dışarıda ne oluyor?" diye soracağız. Push buton, elektronikteki en basit giriş elemanıdır: basıldığında iki bacağı arasındaki yolu kapatır, bırakıldığında açar. Arduino bu farkı bir dijital pin üzerinden HIGH (5V) veya LOW (0V) olarak okur.

Projeyi iki aşamada yapacağız. İlk kodda LED yalnızca butona basılı tuttuğunuz sürece yanacak. İkinci kodda ise her basışta LED'in durumu değişecek; tıpkı odanızdaki ışık anahtarı gibi. İkinci aşamada mekanik butonların neden "zıpladığını" ve bunun yazılımla nasıl çözüldüğünü de öğreneceksiniz.

  • Bir pini INPUT olarak ayarlamayı ve digitalRead() ile okumayı
  • Pull-down direncinin neden gerekli olduğunu
  • if / else ile karar veren kod yazmayı
  • millis() ile bekletmeden zaman ölçmeyi ve debounce yapmayı

Malzeme listesi

Projeyi tamamlamak için aşağıdaki 8 çeşit malzemeye ihtiyacınız var. Parçaların çoğu Arduino başlangıç setlerinde hazır olarak bulunur.

Arduino Uno R3 1 adet

Projenin beyni. Nano veya Mega ile de aynı kod çalışır.

Breadboard 1 adet

Lehimsiz devre kurmak için yarım boy (400 delik) yeterlidir.

5 mm LED 1 adet

Herhangi bir renk olabilir. Uzun bacak (+) anot, kısa bacak (−) katottur.

220 Ω direnç 1 adet

LED'i aşırı akımdan korur. Renk kodu: kırmızı-kırmızı-kahverengi.

10 kΩ direnç 1 adet

Pull-down direnci olarak kullanılır. Renk kodu: kahverengi-siyah-turuncu.

Push buton (4 bacaklı) 1 adet

6×6 mm veya 12×12 mm tactile buton.

Jumper kablo (erkek-erkek) 6–8 adet

Farklı renkler bağlantıları takip etmeyi kolaylaştırır.

USB A-B kablosu 1 adet

Kodu yüklemek ve kartı bilgisayardan beslemek için.

Devre bağlantıları

Bağlantıları USB kablosu takılı değilken yapın. Her satır, bileşenin hangi bacağının Arduino'nun hangi pinine gideceğini gösterir; çizgi rengi önerilen kablo rengidir.

LED anot (+, uzun bacak)D8220 Ω direnç üzerinden bağlanır
LED katot (−, kısa bacak)GNDDoğrudan breadboard'un − hattına
Buton 1. bacak5VBasılınca 5V pine iletilir
Buton 2. bacakD2Dijital giriş pini
Buton 2. bacakGND10 kΩ pull-down direnç üzerinden
4 bacaklı butonlarda karşı karşıya bakan bacak çiftleri içeride zaten birbirine bağlıdır. Butonu breadboard'un ortasındaki kanalın üzerine oturtun ve çapraz iki bacağı kullanın; böylece yanlış bacak seçme ihtimali ortadan kalkar.

Adım adım kurulum

  1. Güç hatlarını hazırlayın

    Arduino'nun 5V pinini breadboard'un kırmızı (+) hattına, GND pinini mavi (−) hattına bağlayın. Bundan sonra bütün 5V ve GND ihtiyaçlarını bu hatlardan alacağız.

  2. LED'i yerleştirin

    LED'in uzun bacağını bir sütuna, kısa bacağını yan sütuna takın. Kısa bacağı doğrudan − hattına bağlayın. Uzun bacağın olduğu sütuna 220 Ω direncin bir ucunu takın, diğer ucunu D8 pinine giden kabloyla birleştirin.

  3. Butonu orta kanala oturtun

    Butonu breadboard'un ortasındaki boşluğun üzerine, bacakları iki yarıya gelecek şekilde bastırın. Sol üst bacağı + hattına bağlayın.

  4. Pull-down direncini ekleyin

    Butonun sağ alt bacağının (çapraz bacak) bulunduğu sütundan 10 kΩ direnci − hattına bağlayın. Bu direnç, buton basılı değilken pini güvenli şekilde 0V'ta tutar.

  5. Giriş pinini bağlayın

    Aynı sütundan (sağ alt bacak) bir kabloyu Arduino'nun D2 pinine götürün. Artık butona basıldığında D2 pini 5V, bırakıldığında 0V görecek.

  6. Kodu yükleyin

    Arduino IDE'yi açın, Araçlar › Kart menüsünden Arduino Uno'yu, Araçlar › Port menüsünden kartınızın bağlı olduğu portu seçin. Aşağıdaki ilk kodu yapıştırıp Yükle (→) düğmesine basın.

  7. Test edin

    Butona basılı tuttuğunuzda LED yanmalı, bıraktığınızda sönmelidir. Seri Port Ekranını (9600 baud) açarak butonun anlık durumunu da izleyebilirsiniz.

Arduino kodu

Kodları Arduino IDE'ye yapıştırıp yükleyebilirsiniz. Türkçe karakterler yalnızca yorum satırlarında kullanıldı; Seri Port Ekranına yazdırılan metinlerde bilerek kullanılmadı.

Basılı tutunca yanan LED. Projenin temel sürümü.

buton_led.ino
// Buton ile LED Kontrolü - Temel sürüm
// RobotikHocasi.com

const int butonPin = 2;   // Butonun bağlı olduğu pin
const int ledPin = 8;     // LED'in bağlı olduğu pin

int butonDurumu = 0;      // Butondan okunan değer

void setup() {
  pinMode(ledPin, OUTPUT);    // LED pini çıkış
  pinMode(butonPin, INPUT);   // Buton pini giriş
  Serial.begin(9600);         // Seri haberleşmeyi başlat
}

void loop() {
  butonDurumu = digitalRead(butonPin);   // Butonu oku

  if (butonDurumu == HIGH) {             // Butona basıldı mı?
    digitalWrite(ledPin, HIGH);          // LED'i yak
    Serial.println("Butona basildi");
  } else {
    digitalWrite(ledPin, LOW);           // LED'i söndür
  }

  delay(10);   // Okumalar arasında kısa bir ara
}

Her basışta LED'in durumunu değiştiren, debounce korumalı gelişmiş sürüm.

buton_toggle.ino
// Buton ile LED Kontrolü - Aç/Kapa (toggle) sürümü
// RobotikHocasi.com

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

bool ledDurumu = false;              // LED şu an yanıyor mu?
int sonOkuma = LOW;                  // Bir önceki ham okuma
int kararliDurum = LOW;              // Debounce sonrası güvenilir durum
unsigned long sonDegisim = 0;        // Son değişimin zamanı
const unsigned long bekleme = 50;    // Debounce süresi (ms)

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

void loop() {
  int okuma = digitalRead(butonPin);

  // Okuma değiştiyse zamanlayıcıyı sıfırla
  if (okuma != sonOkuma) {
    sonDegisim = millis();
  }

  // Okuma 50 ms boyunca sabit kaldıysa gerçek bir değişimdir
  if ((millis() - sonDegisim) > bekleme) {
    if (okuma != kararliDurum) {
      kararliDurum = okuma;

      // Sadece basılma anında (LOW -> HIGH) LED'i ters çevir
      if (kararliDurum == HIGH) {
        ledDurumu = !ledDurumu;
        digitalWrite(ledPin, ledDurumu);
      }
    }
  }

  sonOkuma = okuma;
}

Kod açıklaması

pinMode(butonPin, INPUT);

D2 pinini giriş olarak ayarlar. Artık bu pin voltaj üretmez, üzerindeki voltajı ölçer.

digitalRead(butonPin)

Pindeki voltaj yaklaşık 3V'un üzerindeyse HIGH, 1.5V'un altındaysa LOW döndürür. Buton basılıyken HIGH okuruz.

if (butonDurumu == HIGH)

Karşılaştırma için çift eşittir (==) kullanılır. Tek eşittir (=) atama yapar ve en sık yapılan yazım hatasıdır.

millis()

Kart açıldığından beri geçen süreyi milisaniye cinsinden verir. delay()'in aksine programı durdurmaz, bu yüzden debounce için idealdir.

ledDurumu = !ledDurumu;

Ünlem (!) işareti mantıksal tersini alır: true ise false, false ise true yapar. Toggle davranışının kalbi bu satırdır.

Nasıl çalışır?

Bir dijital pin hiçbir yere bağlı değilse "havada" (floating) kalır. Bu durumda çevredeki elektriksel gürültüyü anten gibi toplar ve rastgele HIGH-LOW değerleri okursunuz. 10 kΩ pull-down direnci pini zayıf bir şekilde GND'ye çeker: buton basılı değilken pin kesin olarak LOW olur. Butona basıldığında 5V doğrudan pine ulaşır ve direncin zayıf çekişini yener, pin HIGH olur.

Mekanik butonların içindeki metal kontaklar basıldığı anda birkaç milisaniye boyunca titreşir. Arduino saniyede binlerce okuma yaptığı için tek bir basışı 5–10 basış gibi görebilir. Buna buton sıçraması (bounce) denir. Toggle kodundaki debounce mantığı, okumanın 50 ms boyunca değişmeden kalmasını bekleyerek bu titreşimleri filtreler.

Sorun giderme

LED hiç yanmıyor
LED'in yönünü kontrol edin: uzun bacak dirence (D8 tarafına), kısa bacak GND'ye gitmeli. Kodda ledPin değerinin 8 olduğundan ve kablonun gerçekten D8'e takıldığından emin olun.
LED butona basmadan kendi kendine yanıp sönüyor
Pull-down direnci eksik ya da yanlış sütuna takılmış. 10 kΩ direncin bir ucu D2'ye giden sütunda, diğer ucu GND hattında olmalı.
LED sürekli yanıyor, buton etkisiz
Buton büyük ihtimalle yanlış yönde takılmış ve bacaklar sürekli kısa devre durumunda. Butonu 90° döndürün ya da çapraz bacakları kullanın.
Toggle sürümünde bazen iki kez değişiyor
Debounce süresini 50'den 80 ms'ye çıkarın. Ucuz butonlarda titreşim daha uzun sürebilir.

Geliştirme fikirleri

Projeyi tamamladıysanız, aşağıdaki fikirlerle bir adım öteye taşıyabilirsiniz.

Dirençsiz bağlantı

pinMode(butonPin, INPUT_PULLUP) kullanarak Arduino'nun dahili direncini açın. Butonu D2 ile GND arasına bağlayın; bu sefer basılınca LOW okunur.

Basış sayacı

Her basışta bir sayacı artırıp Seri Port Ekranına yazdırın. 5. basışta LED'i yanıp söndürün.

İki buton, iki LED

İkinci bir buton ve LED ekleyip ikisini birbirinden bağımsız kontrol edin.

Uzun basma algılama

Buton 2 saniyeden uzun basılı tutulursa LED'i yanıp sönme moduna geçirin.

Sık sorulan sorular

Neden 220 Ω direnç kullanıyoruz?
Arduino pini 5V verir; standart bir LED yaklaşık 2V'ta çalışır ve 20 mA'den fazla akım istemez. (5 − 2) / 220 ≈ 14 mA eder; LED için güvenli ve yeterince parlak bir değerdir.
INPUT ile INPUT_PULLUP arasındaki fark nedir?
INPUT dış bir direnç ister. INPUT_PULLUP ise çip içindeki yaklaşık 20–50 kΩ'luk direnci açar ve pini 5V'a çeker. Bu durumda mantık ters döner: basılı buton LOW okunur.
Butonu D0 veya D1'e bağlayabilir miyim?
Önerilmez. D0 ve D1 seri haberleşme (RX/TX) pinleridir; kod yüklerken ve Seri Port Ekranı açıkken çakışma yaşarsınız.

Bir sonraki projeye hazır mısınız?

Başlangıç serisindeki 10 projeyi sırayla tamamladığınızda sensör, motor ve ekran kullanımının temellerini öğrenmiş olursunuz.

Başlangıç projelerine dön