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ısaltma | Açılımı | Anlamı |
|---|---|---|
| NO | Normally Open | Normalde açık; basılınca kapanır |
| NC | Normally Closed | Normalde kapalı; basılınca açılır |
| SPST | Single Pole Single Throw | Tek devre, aç/kapa |
| SPDT | Single Pole Double Throw | Tek devre, iki konumdan birine yönlendirme |
| DPDT | Double Pole Double Throw | İki bağımsız devreyi aynı anda yönlendirir |
Anahtar Türleri
| Tür | Kullanım |
|---|---|
| Tact switch (4 bacaklı buton) | Breadboard projelerinin standardı |
| Anlık buton (push button) | Panel montajı, başlat/durdur |
| Yaylı/kalıcı anahtar | Cihaz güç düğmesi |
| Toggle (çevirmeli) anahtar | Kalıcı aç/kapa |
| DIP switch | Küçük ayar anahtarları, adres seçimi |
| Reed switch | Mıknatısla tetiklenen, temassız anahtar |
| Limit switch | Mekanik son konum algılama, 3D yazıcı ve CNC’de |
| Mikro switch | Küçü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 250VACgibi 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_PULLUPile dirençten kurtulmayı- Buton zıplamasını ve
millis()ile bloke etmeyen debounce çözümünü