Arduino Ders 6: İki Buton İle Led Kontrolü

Arduino Etkinliği · Dijital Giriş / Çıkış

İki Buton ile İki LED Kontrolü

İki butondan gelen dijital girişleri okuyarak kırmızı ve yeşil LED'i ayrı ayrı kontrol edeceğiz. Bu etkinlikte digitalRead(), digitalWrite(), INPUT_PULLUP ve güvenilir buton okuma mantığını öğreneceğiz.

Arduino iki buton ile iki LED kontrol devresi
SeviyeBaşlangıç
Öğrenilecek KonuDijital giriş ve INPUT_PULLUP
Devre2 buton + 2 LED
01

Uygulamanın Amacı

Butonlarla iki farklı çıkışı seçmek.

Yeşil butona bastığımızda yeşil LED yanacak, kırmızı LED sönecek. Kırmızı butona bastığımızda ise kırmızı LED yanacak, yeşil LED sönecek.

Buton bırakıldığında son seçilen LED'in yanık kalmasını sağlayacağız. Böylece iki buton, iki farklı durumu seçen basit bir kontrol paneli gibi çalışacak.

Bu etkinlik yalnız LED yakma uygulaması değildir. Asıl amaç bir giriş bilgisini okuyup bu bilgiye göre çıkış durumunu değiştirme mantığını öğrenmektir.

02

Gerekli Malzemeler

Basit bir dijital giriş/çıkış devresi.

  • 1 adet Arduino Uno veya uyumlu kart
  • 1 adet breadboard
  • 1 adet yeşil LED
  • 1 adet kırmızı LED
  • 2 adet 220 Ω veya 330 Ω direnç
  • 2 adet push button
  • Jumper kablolar
  • USB veri kablosu

Her LED için ayrı seri direnç kullanın. Buton tarafında ise bu derste harici direnç yerine Arduino'nun dahili pull-up direncini kullanacağız.

03

Önerilen Bağlantı

INPUT_PULLUP ile daha sade buton bağlantısı.

Yeşil LED: D2 → seri direnç → LED → GND

Kırmızı LED: D3 → seri direnç → LED → GND

Yeşil buton: bir uç D8, diğer uç GND

Kırmızı buton: bir uç D9, diğer uç GND

INPUT_PULLUP mantığı ters görünür: butona basılmadığında giriş HIGH, butona basıldığında ise pin GND'ye bağlandığı için LOW okunur.

Neden pull-up gerekir?Giriş pini boşta kalırsa çevresel gürültü nedeniyle rastgele HIGH/LOW okunabilir. Pull-up direnci pine kararlı bir varsayılan seviye verir.
Neden dahili pull-up?Harici direnç ihtiyacını azaltır ve başlangıç projelerinde devreyi daha sade kurmamızı sağlar.
04

Mevcut Devre Şeması

Harici pull-down kullanılan alternatif bağlantı.

Elinizdeki eski devre şeması harici pull-down direnç mantığıyla kurulmuşsa kullanılabilir. Bu bağlantıda butona basılmadığında pin LOW, basıldığında HIGH okunur.

Aşağıdaki görsel bu eski/alternatif bağlantı yöntemini göstermektedir. Bu sayfadaki önerilen ana kod ise daha az parça gerektiren INPUT_PULLUP bağlantısına göre hazırlanmıştır.

Arduino iki buton iki LED harici pull-down devre şeması
05

Önerilen Arduino Kodu

INPUT_PULLUP ile iki butonu güvenli okuyalım.

İki buton · iki LEDArduino / C++
const byte greenLedPin = 2;
const byte redLedPin = 3;
const byte greenButtonPin = 8;
const byte redButtonPin = 9;

void setup() {
  pinMode(greenLedPin, OUTPUT);
  pinMode(redLedPin, OUTPUT);

  pinMode(greenButtonPin, INPUT_PULLUP);
  pinMode(redButtonPin, INPUT_PULLUP);

  digitalWrite(greenLedPin, LOW);
  digitalWrite(redLedPin, LOW);
}

void loop() {
  bool greenPressed = digitalRead(greenButtonPin) == LOW;
  bool redPressed = digitalRead(redButtonPin) == LOW;

  if (greenPressed && !redPressed) {
    digitalWrite(greenLedPin, HIGH);
    digitalWrite(redLedPin, LOW);
  }
  else if (redPressed && !greenPressed) {
    digitalWrite(greenLedPin, LOW);
    digitalWrite(redLedPin, HIGH);
  }
  else if (greenPressed && redPressed) {
    digitalWrite(greenLedPin, LOW);
    digitalWrite(redLedPin, LOW);
  }
}

Hiçbir butona basılmadığında kod LED durumunu değiştirmez; yani son seçilen LED yanık kalır. İki butona aynı anda basılırsa bu örnekte iki LED de söndürülür. Böylece aynı anda iki komut gelmesi durumunun davranışı belirsiz bırakılmaz.

06

Kodu Anlayalım

Her bölümün görevi.

pinMode(..., OUTPUT)LED pinlerini dijital çıkış olarak ayarlar.
INPUT_PULLUPButon girişinde Arduino'nun dahili pull-up direncini etkinleştirir.
digitalRead()Buton pininin HIGH veya LOW durumunu okur.
digitalWrite()LED pinini HIGH veya LOW yaparak LED'i kontrol eder.
== LOWINPUT_PULLUP bağlantısında LOW, butona basıldığı anlamına gelir.
&&İki koşulun aynı anda doğru olup olmadığını kontrol eden mantıksal VE operatörüdür.
07

Harici Pull-down Kullanırsanız

Eski devre şemasına uygun kod farkı.

Butonları harici pull-down dirençlerle bağladıysanız girişleri INPUT olarak tanımlarsınız. Bu durumda butona basılmadığında LOW, basıldığında HIGH okunur.

Harici pull-downTemel fark
pinMode(greenButtonPin, INPUT);
pinMode(redButtonPin, INPUT);

bool greenPressed = digitalRead(greenButtonPin) == HIGH;
bool redPressed = digitalRead(redButtonPin) == HIGH;

Harici pull-down dirençler çıkarılıp pinler yalnızca INPUT olarak bırakılırsa girişler floating kalabilir ve rastgele değerler okunabilir.

08

Buton Sıçraması (Debounce)

Mekanik butonların önemli bir özelliği.

Mekanik butonlar basıldıkları veya bırakıldıkları anda elektriksel olarak tek ve kusursuz bir geçiş üretmeyebilir. Çok kısa süre içinde birkaç kez açılıp kapanmış gibi görünebilen bu olaya contact bounce denir.

Bu sayfadaki örnekte her basış yalnızca LED durumunu belirlediği için küçük sıçramalar genellikle görünür bir sorun oluşturmaz. Ancak butonla sayaç artırma, aç/kapat değiştirme veya tek basış yakalama gibi uygulamalarda debounce uygulamak gerekir.

Arduino'nun resmî yerleşik örneklerinde Debounce on a Pushbutton ve State Change Detection örnekleri bu konuyu öğrenmek için doğrudan kullanılabilir.

09

Sık Yapılan Hatalar

Devre çalışmıyorsa önce bunları kontrol edin.

  • INPUT_PULLUP kullanırken butonu 5V'a bağlamak
  • Butona basıldığında LOW okunacağını unutmak
  • LED'i seri direnç olmadan bağlamak
  • LED'in anot ve katot yönlerini ters bağlamak
  • Breadboard güç raylarının bazı modellerde ortadan kesik olduğunu fark etmemek
  • Koddaki pin numaralarıyla devredeki bağlantıları eşleştirmemek
10

Mini Görevler

Etkinliği biraz daha geliştirin.

  • Butona basıldığı sürece LED yansın, bırakıldığında sönsün.
  • İki butona aynı anda basıldığında iki LED'i de yakacak şekilde kodu değiştirin.
  • Üçüncü bir LED ve üçüncü buton ekleyin.
  • Bir butonu “aç”, diğerini “kapat” butonu haline getirin.
  • State Change Detection kullanarak her basışı yalnızca bir kez sayın.
  • millis() kullanarak yazılımsal debounce uygulayın.
11

Resmî Kaynaklar

Arduino'nun ilgili başlangıç örnekleri.

Yorum Gönder

Daha yeni Daha eski