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.
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.
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.

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;
}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.
Henüz yorum yapılmamış. İlk yorumu siz yapın!