Skip to Content
Elektronik BileşenlerButon ve Anahtarlar

Buton ve Anahtarlar

Buton ve anahtarlar, bir devreye insan girdisini taşıyan en basit elemanlardır. Görevleri sadece iki noktayı birbirine bağlamak veya ayırmaktır — ancak Arduino ile kullanıldıklarında iki klasik sorun ortaya çıkar: boşta kalan giriş (floating) ve zıplama (bounce). Bu yazının asıl konusu bu iki sorundur.

Buton ve Anahtar Farkı

Buton (push button / anlık). Basılı tutulduğu sürece bağlantı kurar, bırakıldığında eski haline döner. Kapı zili gibi.

Anahtar (switch / kalıcı). Konumunu korur. Bir kez çevrildiğinde o durumda kalır. Işık düğmesi gibi.

Kontak Tipleri

KısaltmaAçılımıAnlamı
NONormally OpenNormalde açık; basılınca kapanır
NCNormally ClosedNormalde kapalı; basılınca açılır
SPSTSingle Pole Single ThrowTek devre, aç/kapa
SPDTSingle Pole Double ThrowTek devre, iki konumdan birine yönlendirme
DPDTDouble Pole Double Throwİki bağımsız devreyi aynı anda yönlendirir

Anahtar Türleri

TürKullanım
Tact switch (4 bacaklı buton)Breadboard projelerinin standardı
Anlık buton (push button)Panel montajı, başlat/durdur
Yaylı/kalıcı anahtarCihaz güç düğmesi
Toggle (çevirmeli) anahtarKalıcı aç/kapa
DIP switchKüçük ayar anahtarları, adres seçimi
Reed switchMıknatısla tetiklenen, temassız anahtar
Limit switchMekanik son konum algılama, 3D yazıcı ve CNC’de
Mikro switchKüçük kuvvetle tetiklenen hassas anahtar

4 bacaklı tact switch tuzağı

Breadboard projelerinde kullanılan küçük butonların dört bacağı vardır ama bunlar aslında iki çifttir: karşılıklı iki bacak zaten birbirine bağlıdır.

Butonu breadboard’a takarken, bağlantı kurmak istediğiniz uçların çapraz ya da karşılıklı uzun kenarda olmasına dikkat edin. Yanlış çift seçilirse buton hiç basılmamış gibi davranır — ya da sürekli basılıymış gibi.

Emin değilseniz butonu takmadan önce multimetrenin süreklilik kademesiyle hangi bacakların bağlı olduğunu ölçün.

Floating (Boşta Kalan) Giriş Sorunu

Bu, buton devrelerindeki en temel kavramdır.

Arduino’nun bir dijital girişini yalnızca butona bağlarsanız, buton basılı değilken o pin hiçbir yere bağlı olmaz. Havada kalan bu pin çevredeki elektriksel gürültüyü anten gibi toplar ve digitalRead() rastgele HIGH/LOW döndürür.

Sonuç: buton hiç basılmadığı halde program tetiklenir.

Çözüm, pini basılmadığı durumda bilinen bir seviyeye çekmektir. Bunun iki yolu vardır.

Pull-Down Direnç

  • Butonun bir ucu → 5V
  • Butonun diğer ucu → Arduino pini ve aynı noktadan 10 kΩ dirençGND

Davranış:

  • Buton basılı değil → pin dirençle GND’ye çekilir → LOW
  • Buton basılı → pin doğrudan 5V görür → HIGH

Yani “basılı = HIGH”. Sezgisel olarak en anlaşılır yöntemdir.

Pull-Up Direnç

  • Butonun bir ucu → GND
  • Butonun diğer ucu → Arduino pini ve aynı noktadan 10 kΩ direnç5V

Davranış:

  • Buton basılı değil → pin dirençle 5V’a çekilir → HIGH
  • Buton basılı → pin doğrudan GND görür → LOW

Yani “basılı = LOW”. Ters gibi görünse de endüstride pull-up standarttır, çünkü gürültüye karşı daha dayanıklıdır ve kablo kopması durumunda güvenli tarafta (HIGH) kalır.

INPUT_PULLUP — Dirençsiz Çözüm

Arduino’nun mikrodenetleyicisi dahili pull-up dirençleri içerir. Bunları yazılımla açarsanız harici dirence hiç gerek kalmaz.

Bağlantı ikiye iner:

  • Butonun bir ucu → Arduino pini
  • Butonun diğer ucu → GND
const int BUTON_PIN = 2; const int LED_PIN = 13; void setup() { pinMode(BUTON_PIN, INPUT_PULLUP); // dahili pull-up aktif pinMode(LED_PIN, OUTPUT); Serial.begin(9600); } void loop() { // INPUT_PULLUP ile basili = LOW if (digitalRead(BUTON_PIN) == LOW) { digitalWrite(LED_PIN, HIGH); } else { digitalWrite(LED_PIN, LOW); } }

Dahili pull-up direnci yaklaşık 20–50 kΩ değerindedir. Uzun kablolu veya gürültülü ortamlarda bu değer zayıf kalabilir; o durumda harici 10 kΩ direnç eklemek daha güvenlidir.

Buton Zıplaması (Debounce)

Bir butona bastığınızda metal kontaklar temas anında birkaç milisaniye boyunca defalarca açılıp kapanır. İnsan bunu fark etmez ama saniyede milyonlarca işlem yapan Arduino her sıçramayı ayrı bir basış olarak sayar.

Belirtisi tanıdıktır: bir kez bastığınız sayaç 3 artar, aç/kapa yapan bir buton rastgele davranır.

Çözüm 1 — Yazılımsal gecikme (basit)

if (digitalRead(BUTON_PIN) == LOW) { delay(50); // ziplama suresini bekle if (digitalRead(BUTON_PIN) == LOW) { // hala basili mi? // gercek basis } while (digitalRead(BUTON_PIN) == LOW); // birakilmasini bekle }

Anlaşılırdır ama delay() programı bloke eder. Basit projeler için yeterlidir.

Çözüm 2 — millis() ile bloke etmeyen debounce (önerilen)

const int BUTON_PIN = 2; const int LED_PIN = 13; int ledDurumu = LOW; int sonOkuma = HIGH; int kararliDurum = HIGH; unsigned long sonDegisimZamani = 0; const unsigned long DEBOUNCE_SURESI = 50; void setup() { pinMode(BUTON_PIN, INPUT_PULLUP); pinMode(LED_PIN, OUTPUT); } void loop() { int okuma = digitalRead(BUTON_PIN); if (okuma != sonOkuma) { sonDegisimZamani = millis(); // sinyal degisti, sayaci sifirla } if ((millis() - sonDegisimZamani) > DEBOUNCE_SURESI) { // sinyal 50 ms boyunca sabit kaldi, guvenilir if (okuma != kararliDurum) { kararliDurum = okuma; if (kararliDurum == LOW) { // yeni basis ledDurumu = !ledDurumu; digitalWrite(LED_PIN, ledDurumu); } } } sonOkuma = okuma; }

Bu yapı delay() kullanmaz; programın geri kalanı çalışmaya devam eder. Birden fazla butonu ve sensörü aynı anda takip eden projelerde tek doğru yaklaşım budur.

Çözüm 3 — Donanımsal debounce

Buton ucu ile GND arasına 100 nF kondansatör bağlamak zıplamayı fiziksel olarak yumuşatır. Yazılımsal çözümle birlikte kullanıldığında en dayanıklı sonucu verir.

Anahtar Seçerken Nelere Bakılır?

  • Akım ve gerilim değeri. Gövdede 3A 250VAC gibi yazar. Bu değerin üzerinde kullanmayın; kontaklar kaynar ve anahtar kalıcı olarak kapalı kalabilir.
  • DC/AC farkı. AC için verilen değer DC’de geçerli değildir. DC’de ark sönmediği için anahtarın DC akım kapasitesi çok daha düşüktür.
  • Kontak ömrü. Veri sayfasında çevrim sayısı olarak verilir (örneğin 100.000 çevrim).
  • Montaj deliği çapı. Panel montajlı anahtarlarda 12 mm, 16 mm, 19 mm yaygındır.

Özet

Buton ve anahtarlar iki noktayı bağlar veya ayırır. Arduino ile kullanırken pinin boşta kalmaması için pull-up veya pull-down direnç gerekir; en pratik yöntem INPUT_PULLUP ile dahili direnci kullanmaktır.

Bu derste şunları öğrendik:

  • Buton ile anahtar arasındaki farkı ve NO/NC kavramlarını
  • 4 bacaklı tact switch’in hangi bacaklarının bağlı olduğunu
  • Floating giriş sorununu
  • Pull-up ve pull-down direnç mantığını
  • INPUT_PULLUP ile dirençten kurtulmayı
  • Buton zıplamasını ve millis() ile bloke etmeyen debounce çözümünü