Arduino'da Debounce (Buton Arkı) Sorunu ve Çözümü

👤 Yazar: ozcan 📅 Tarih: 14.05.2026 04:21 👁️ Görüntüleme: 2

Arduino'da Debounce (Buton Arkı) Nedir? Yazılımsal Çözüm Rehberi

Elektronik projelerinde en basit giriş birimi butondur. Ancak fiziksel bir butona bastığınızda, içerideki metal plakalar birbirine değerken mikrosaniye mertebesinde binlerce kez "sıçrama" yapar. Biz butona bir kez bastığımızı sansak da, Arduino bu sıçramaları binlerce farklı basış gibi algılayabilir. Bu fenomene "Bouncing" (Sıçrama), bunu engelleme işlemine ise "Debouncing" denir.

Sorun: Neden Yanlış Sayıyor?

Eğer bir butona basıldığında sayı artıran bir kod yazdıysanız, butona bir kez bastığınızda sayacın 1, 2, 5, 12 gibi düzensiz arttığını görebilirsiniz. Bunun sebebi işlemcinin, butonun mekanik gürültüsünü (arkını) gerçek sinyal sanmasıdır.

Çözüm: Yazılımsal Debounce

Bu sorunu çözmenin en sağlıklı yolu, ilk sinyal geldikten sonra belirli bir süre (örneğin 50 milisaniye) boyunca gelen diğer sinyalleri görmezden gelmektir.


Örnek Kod (Kütüphanesiz En Sağlıklı Yöntem)

Aşağıdaki yöntem delay() kullanmadığı için kodunuzun ana akışını (loop) durdurmaz:

const int butonPin = 2;    // Butonun bağlı olduğu pin
const int ledPin = 13;      // Durumu değişecek LED

int ledDurumu = HIGH;         // Mevcut LED durumu
int butonDurumu;             // Butondan okunan mevcut değer
int sonButonDurumu = LOW;   // Butonun bir önceki okunan değeri

unsigned long sonDebounceZamani = 0;  // Son sinyal değişimi ne zamandı?
unsigned long debounceGecikmesi = 50; // 50 milisaniyelik bekleme süresi

void setup() {
  pinMode(butonPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, ledDurumu);
}

void loop() {
  // Butonun değerini oku
  int okuma = digitalRead(butonPin);

  // Eğer buton durumu değiştiyse (gürültü veya gerçek basış)
  if (okuma != sonButonDurumu) {
    sonDebounceZamani = millis(); // Zamanlayıcıyı sıfırla
  }

  // Geçen süre belirlediğimiz 50ms'den büyükse, bu gerçek bir basıştır
  if ((millis() - sonDebounceZamani) > debounceGecikmesi) {
    // Eğer okunan değer önceki durumdan farklıysa güncelle
    if (okuma != butonDurumu) {
      butonDurumu = okuma;

      // Sadece buton LOW (basılı) olduğunda aksiyon al
      if (butonDurumu == LOW) {
        ledDurumu = !ledDurumu;
      }
    }
  }

  digitalWrite(ledPin, ledDurumu);
  sonButonDurumu = okuma;
}

Neden Bu Yöntemi Kullanmalısınız?


    Hassasiyet: Sayaçlarda ve menü geçişlerinde %100 doğruluk sağlar.

      Multitasking: millis() fonksiyonu kullanıldığı için arka planda başka işlemler (sensör okuma, motor kontrolü vb.) devam edebilir.

        Donanım Tasarrufu: Dışarıdan kondansatör veya direnç eklemeden sorunu yazılımla çözer.

        İpucu: Eğer çok fazla butonunuz varsa "Bounce2" gibi hazır kütüphaneler de kullanılabilir, ancak mantığı anlamak için yukarıdaki kod bloklarını manuel olarak yazmak gömülü sistemler eğitiminde çok daha öğreticidir.

        💬 Yorumlar

        Henüz yorum yapılmamış. İlk yorumu siz yapın!

        Bir Yorum Bırakın

        Güvenlik Kontrolü:

        Yenidir.com
        Sayfa Başı
        Yenidir CMS V0.1