Menekan tombol terlalu banyak acara

12

Saya menulis pemutar mp3 yang menulis info ke layar LCD, saya ingin mengonversinya dari menggunakan keyboard menjadi menggunakan tombol, tetapi saya terus-menerus mendapatkan terlalu banyak penekanan tombol. Saya sudah mencoba menarik ke atas dan jatuh / naik ujung tetapi saya masih mendapatkan hasil yang sama. Adakah yang tahu jika ini adalah masalah yang diketahui atau apakah saya hanya melakukan sesuatu yang salah? Oh, saya juga melakukan ini sepenuhnya dalam C menggunakan wiringPi.

linuxgnuru
sumber
1
Hanya untuk menambah solusi perangkat lunak, periksa teman kami di pengontrol mikro. arduino.cc/en/Tutorial/Debounce
Cammy_the_block
Ini cuplikan dari sesuatu yang saya tulis beberapa waktu lalu. if(digitalRead(data) && millis()-startTime > 10){dan atur startTime kapan saja ia masuk untuk loop.
Cammy_the_block
hanya ingin tahu; apa tepatnya yang akan saya atur startTime?
linuxgnuru
Beberapa penghitung waktu. Arduino memiliki fungsi milis yang memberi waktu sejak awal.
Cammy_the_block
Ah ok, begitu juga wiringPi wiringpi.com/reference/timing
linuxgnuru

Jawaban:

12

Tombol dan sakelar mekanis dapat mengalami bouncing sakelar di mana sakelar berganti dengan cepat antara buka dan tutup selama beberapa milidetik.

Anda dapat mencoba melepaskan tombol / sakelar dalam perangkat lunak atau perangkat keras.

Mungkin paling sederhana dalam perangkat lunak.

Jika level berubah (hidup ke mati, atau mati ke hidup) tunggu x milidetik dan baca lagi gpio. Jika masih dalam keadaan baru maka anggap itu adalah transisi yang nyata. Nilai x bisa sekitar 20.

Untuk solusi perangkat keras lihat pos semacam ini

joan
sumber
8

Luangkan waktu untuk membaca panduan debouncing Jack Ganssle . Halaman pertama menggambarkan masalah dengan sangat rinci, dan yang kedua bagaimana mengatasinya dalam perangkat keras atau perangkat lunak. Tidak ada metode debounce 'sempurna', tetapi ada banyak yang buruk!

Ini adalah masalah yang akan Anda temui berulang kali jika menghubungkan perangkat lunak dengan sakelar, jadi ada baiknya meluangkan waktu untuk memahaminya, dan artikel Jack adalah cara paling ringkas yang pernah saya lakukan.

rolinger
sumber
2

Dalam aplikasi yang memiliki ticker sistem saya biasanya menerapkan register geser.

unsigned char button_checker;

// inside the system ticker

button_checker <<= 1; 
button_checker += INPUT;

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

Tentu saja, Anda harus menjalankan acara tekan tombol hanya di tepi yang menanjak.

vsz
sumber
1
Itu metode yang menarik. Mudah dikustomisasi (dengan menutupi bit paling signifikan dari button_checker) untuk memerlukan jumlah pembacaan berurutan yang bervariasi.
joan