Натискайте на занадто багато подій


12

Я пишу mp3-програвач, який записує інформацію на РК-дисплей, я хотів би перетворити його з клавіатури на використання кнопок, але постійно отримую занадто багато натискань клавіш. Я спробував підтягнутись і впасти / піднятися, але все одно отримую той же результат. Хтось знає, чи це відома проблема, чи я просто щось роблю не так? О, я також роблю це цілком на C, використовуючи wiringPi.


1
Просто, щоб додати до пакета програмних рішень, ознайомтеся з нашим другом у мікроконтролерах. arduino.cc/uk/Tutorial/Debounce
Cammy_the_block

Ось фрагмент із чогось, про який я писав деякий час назад. if(digitalRead(data) && millis()-startTime > 10){і встановіть startTime коли-небудь, коли він вводиться для циклу.
Cammy_the_block

просто цікаво; на що саме я б встановив startTime?
linuxgnuru

Якийсь лічильник часу свого роду. Arduino має функцію millis, яка дає час з початку.
Cammy_the_block

Ну гаразд, так це wiringPi wiringpi.com/reference/timing
linuxgnuru

Відповіді:


12

Механічні кнопки та перемикачі можуть страждати від відмов перемикача, коли вони швидко перемикаються між відкритими та закритими протягом декількох мілісекунд.

Ви можете спробувати скасувати кнопку / перемикач у програмному чи апаратному забезпеченні.

Мабуть, найпростіший у програмному забезпеченні.

Якщо рівень зміни (увімкнено або вимкнено на включений), зачекайте х мілісекунд і прочитайте gpio ще раз. Якщо він все ще знаходиться в новому стані, тоді припустимо, що це реальний перехід. Значення x може бути приблизно як 20.

Для апаратних рішень шукайте такий пост


8

Знайдіть час, щоб прочитати керівництво Джека Гансле, що розгортається . Перша сторінка досить детально ілюструє проблему, а друга, як впоратися з нею в апаратному чи програмному забезпеченні. Не існує «ідеального» методу дебютації, але є багато поганих!

Це проблема, з якою ви стикаєтеся неодноразово, якщо взаємодієте програмне забезпечення з комутаторами, тому варто витратити час, щоб зрозуміти це, і стаття Джека - це самий стислий спосіб, який я бачив.


2

У додатках, які мають системний галочок, я зазвичай впроваджую регістр змін.

unsigned char button_checker;

// inside the system ticker

button_checker <<= 1; 
button_checker += INPUT;

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

Звичайно, вам слід проводити захід натискання кнопок лише на висхідній грані.


1
Це цікавий метод. Легко налаштовується (маскуючи найбільш значущі біти кнопки_контролера), щоб вимагати різної кількості послідовних читань.
Джоан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.