İ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.
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.
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.
Ö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.
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.
Önerilen Arduino Kodu
INPUT_PULLUP ile iki butonu güvenli okuyalım.
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.
Kodu Anlayalım
Her bölümün görevi.
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.
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.
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.
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
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.
Resmî Kaynaklar
Arduino'nun ilgili başlangıç örnekleri.