Arduino'ya Buton Nasıl Bağlanır? Pull-up, Pull-down ve Debounce
Push buton Arduino'ya nasıl bağlanır? 4 bacaklı butonun iç yapısı, pull-up ve pull-down direnci, INPUT_PULLUP, debounce ve butonla LED açıp kapatma örneği.
Buton, Arduino projelerine kullanıcının dokunuşunu taşıyan en basit parçadır. Basıldığında iki kontağı birleştirir, bırakıldığında ayırır. Basit görünse de doğru bağlanmadığında rastgele değerler okunur ya da tek basış birden fazla sayılır. Bu yazıda butonu doğru bağlamanın ve okumanın yollarını anlatıyoruz.

4 bacaklı butonun iç yapısı
Breadboard'da en sık kullanılan 6×6 mm mikro butonun 4 bacağı vardır ama yalnızca 2 bağlantı noktası vardır: karşılıklı bacak çiftleri içeriden zaten birbirine bağlıdır. Butona basınca bu iki çift birleşir. Butonu breadboard'un orta kanalının üzerine oturtursan her çift ayrı sıralara düşer ve doğru yönü bulmak kolaylaşır.
Neden pull-up ya da pull-down direnci gerekir?
Buton basılı değilken Arduino'nun giriş pini hiçbir yere bağlı değildir; buna havada kalan (floating) giriş denir. Böyle bir pin ortamdaki elektriksel gürültüyü toplar ve rastgele HIGH ya da LOW okur. Çözüm, pini bir dirençle sabit bir seviyeye çekmektir:
| Yöntem | Bağlantı | Basılı değilken | Basılıyken |
|---|---|---|---|
| Pull-down | 10 kΩ pin → GND, buton pin → 5V | LOW | HIGH |
| Pull-up (harici) | 10 kΩ pin → 5V, buton pin → GND | HIGH | LOW |
| INPUT_PULLUP (dahili) | Buton pin → GND, direnç gerekmez | HIGH | LOW |
En pratik yol pinMode(pin, INPUT_PULLUP) kullanmaktır: Arduino'nun içindeki yaklaşık 20–50 kΩ'luk direnç devreye girer, sen sadece butonu pin ile GND arasına bağlarsın. Tek fark mantığın tersine dönmesidir: basılınca LOW okunur.
Debounce: tek basış neden birden çok sayılır?
Butonun metal kontakları birbirine değdiği anda birkaç milisaniye boyunca titreşir ve devre defalarca açılıp kapanır. Arduino bu kadar hızlı okuduğu için tek basışı 3–5 basış gibi görebilir. Buna kontak sıçraması (bounce) denir. Yazılımla çözmek için son değişimden sonra yaklaşık 50 ms boyunca yeni değişimler yok sayılır.
const int BUTTON_PIN = 2; // buton pin ile GND arasında / button between pin and GND
const int LED_PIN = 13; // karttaki LED / onboard LED
bool ledOn = false;
int lastReading = HIGH;
int stableState = HIGH;
unsigned long lastChange = 0;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP); // dahili pull-up / internal pull-up
pinMode(LED_PIN, OUTPUT);
}
void loop() {
int reading = digitalRead(BUTTON_PIN);
if (reading != lastReading) lastChange = millis(); // değişti / changed
if (millis() - lastChange > 50 && reading != stableState) {
stableState = reading; // 50 ms kararlı / stable for 50 ms
if (stableState == LOW) { // basıldı / pressed
ledOn = !ledOn; // LED'i değiştir / toggle LED
digitalWrite(LED_PIN, ledOn ? HIGH : LOW);
}
}
lastReading = reading;
}Bu kod butona her basışta LED'i bir kez açar ya da kapatır; basılı tutmak tekrar tekrar değiştirmez. delay() yerine millis() kullandığı için döngü beklemez ve aynı anda başka işler de yapılabilir.
Sık yapılan hatalar
- Butonu yanlış yöne takmak: Zaten bağlı olan bacak çiftini kullanırsan buton hep basılı okunur. Butonu 90° çevir.
- Direnç kullanmamak: Pull-up ya da pull-down olmadan okunan değer rastgele değişir.
- INPUT_PULLUP'ta mantığı ters beklemek: Basılınca HIGH değil LOW okunur; koşulları buna göre yaz.
- Debounce için uzun delay() kullanmak: Program o süre boyunca hiçbir şey yapamaz; millis() ile zamanlama daha iyidir.
- ESP32'de 34–39 numaralı pinleri kullanmak: Bu pinlerde dahili pull-up yoktur; harici direnç ekle ya da başka pin seç.
Butonu ve direnci breadboard'a doğru yerleştirmek için Breadboard Nedir?, pull-up direncinin değerini anlamak için Direnç Nedir? yazılarına göz atabilirsin.
Sıkça sorulan sorular
Butonu bağlamak için kaç ohm direnç gerekir?
Pull-up ya da pull-down için 10 kΩ standarttır. INPUT_PULLUP kullanırsan harici dirence hiç gerek kalmaz.
Butona basınca neden LOW okunuyor?
INPUT_PULLUP ya da harici pull-up kullanıyorsan pin normalde HIGH'tır; buton pini GND'ye bağladığı için basılınca LOW olur. Bu beklenen davranıştır.
Debounce süresi ne kadar olmalı?
Çoğu buton için 20–50 ms yeterlidir. Eski ya da kalitesiz butonlarda 80–100 ms gerekebilir.
Birden fazla butonu nasıl okurum?
Her butonu ayrı bir pine bağlayıp hepsini INPUT_PULLUP yapabilirsin. Çok sayıda buton için keypad (tuş takımı) ya da tek analog pinden farklı dirençlerle okuma yöntemi kullanılır.
Bu yazıdan sonra yapabileceğin projeler
Tüm projeleri gör
Buton İle Led Yakma (Push)
Butona basıldığında LED'i yakan, bırakıldığında söndüren anlık (push) kontrol projesi. digitalRead ile buton okuma ve koşullu ifade kullanımını öğretir.

Buton İle Led Yakma (On Off)
Her buton basışında LED'in durumunu değiştiren (aç/kapa) toggle projesi. Durum değişkeni ve debounce mantığını öğretir.

Buzzer Ve Buton İle Basit Piyano
8 buton ve buzzer ile Do'dan yüksek Do'ya kadar notaları çalabilen basit piyano projesi. Her butona farklı frekans atayarak müzik enstrümanı simülasyonu yapmayı öğretir.

7 Segment Display Ve Buton İle Sayaç
3 buton ile 7 segment display üzerindeki sayıyı artıran, azaltan ve sıfırlayan sayaç projesi. Sınır kontrolü ve kullanıcı etkileşimli sayaç mantığını öğretir.

ESP32 Buton ile LED Kontrol (Push)
Butona basılı tutulduğunda LED yanar, bırakıldığında söner. ESP32'nin dijital input pin'i ve dahili pull-up direncinin nasıl kullanıldığını gösterir. INPUT_PULLUP modu sayesinde harici direnç gerekmez.

ESP32 Buton ile LED Kontrol (Toggle)
Butona her basıldığında LED'in durumu değişir: açıksa kapanır, kapalıysa açılır. Klasik toggle (geçiş) pattern'i. Debounce (sıçrama önleme) ile butonun mekanik gürültüsünü temizleyerek tek basışta tek değişim sağlarız.

Raspberry Pi Pico Buton ile LED Yakma (Toggle, GP14 + GP2)
Buton ile LED — bir üst seviye! 🔁 #155'in aksine burada butonu basılı tutmana gerek yok. Bir kez bas ve bırak → LED açılır. Tekrar bas ve bırak → LED söner (toggle). Devre #155 ile aynı (LED GP14, Buton GP2), ama kod büyük fark içeriyor. Yeni öğrenme: **edge detection** (kenar algılama — pinin 1'den 0'a düştüğü an), **state tracking** (önceki durumu hafızada tut), **debounce** (buton mekanik "bounce" sonrası yanlış tetikleme önleme). MicroPython'ın `led.toggle()` metodu ile tek satırda değişim.

Raspberry Pi Pico Buton Debounce Karsilastirma: IRQ vs Software Polling (GP5 + GP4)
Butona bir kere bastığında kod 3-4 kere saydırdıysa nedeni **contact bounce** — buton metal kontakları temas anında mikrosaniyelerde defalarca aç-kapa yapar! 🔁 Bu projede aynı butonu 2 farklı yöntemle sayıp Serial'da yan yana karşılaştırıyoruz: **RAW polling** (bounce'u yakalar, hatalı sayar) vs **IRQ + software debounce** (doğru sayar). Öğrenme: **contact bounce fiziği** (metal titreşim), **software debounce** (`ticks_diff() > 50ms`), **Pin.irq()** interrupt kaydı, **IRQ_FALLING** trigger tipi,
Diğer yazılar
Butonun neden tek başına kararsız okunduğunu, pull-up direncini, INPUT_PULLUP kullanımını ve basışların doğru sayılması için debounce yöntemini öğren.

