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.


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


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.


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.


1
Itu metode yang menarik. Mudah dikustomisasi (dengan menutupi bit paling signifikan dari button_checker) untuk memerlukan jumlah pembacaan berurutan yang bervariasi.
joan
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.