Basma düğmeleri çok fazla etkinlik alıyor


12

Bir LCD ekrana bilgi yazan bir mp3 çalar yazıyorum, klavyeyi kullanarak butonları kullanmaya dönüştürmek istiyorum ama sürekli çok fazla tuşa basıyorum. Yukarı çekmeyi ve düşmeyi / yükselmeyi denedim ama yine de aynı sonucu alıyorum. Herkes bilinen bir sorun olup olmadığını elden biliyor ya da ben sadece yanlış bir şey mi yapıyorum? Oh, bunu tamamen C olarak wiringPi kullanarak yapıyorum.


1
Sadece yazılım çözümlerine eklemek için mikro kontrol cihazlarındaki arkadaşımıza göz atın. arduino.cc/en/Tutorial/Debounce
Cammy_the_block

İşte bir süre önce yazdığım bir şeyden bir pasaj. if(digitalRead(data) && millis()-startTime > 10){ve loop için girdiğinde startTime değerini ayarlayın.
Cammy_the_block

sadece merak ediyorum; startTime'ı tam olarak ne olarak ayarlayabilirim?
linuxgnuru

Bazı sorta zaman sayacı. Arduino, başlangıçtan beri zaman veren milis fonksiyonuna sahiptir.
Cammy_the_block

Yanıtlar:


12

Mekanik düğmeler ve anahtarlar, birkaç milisaniye boyunca açık ve kapalı arasında hızla geçiş yaptıkları anahtar sıçramalarından muzdarip olabilir.

Yazılım veya donanımda düğmeyi / anahtarı kaldırmayı deneyebilirsiniz.

Muhtemelen en basit yazılım.

Seviye değişirse (açık - kapalı veya kapalı - açık) x milisaniye bekleyin ve gpio'yu tekrar okuyun. Hala yeni durumdaysa, gerçek bir geçiş olduğunu varsayın. X'in değeri 20 gibi bir şey olabilir.

Donanım çözümleri için bu tür bir yazı arayın


8

Jack Ganssle'ın zıplatma kılavuzunu okumak için zaman ayırın . İlk sayfa sorunu ayrıntılı olarak, ikincisi ise donanım veya yazılımda nasıl ele alınacağını gösterir. 'Mükemmel' bir geri alma yöntemi yoktur, ancak birçok kötü yöntem vardır!

Yazılım, anahtarlarla arayüz oluştururken tekrar tekrar karşılaşacağınız bir problemdir, bu yüzden bunu anlamak için zaman ayırmaya değer ve Jack'in makalesi bunu gördüğüm en özlü yoldur.


2

Sistem senedi olan uygulamalarda genellikle bir kaydırma yazmacı uygularım.

unsigned char button_checker;

// inside the system ticker

button_checker <<= 1; 
button_checker += INPUT;

if (button_checker == 0xFF) 
{ 
    // button was pressed 
}

Tabii ki, düğme basma etkinliğini sadece yükselen bir kenarda gerçekleştirmelisiniz.


1
Bu ilginç bir yöntem. Değişen sayıda ardışık okuma gerektirecek şekilde kolayca özelleştirilebilir (button_checker'ın en önemli bitlerini maskeleyerek).
joan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.