Кнопки получают слишком много событий

12

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

linuxgnuru
источник
1
Просто, чтобы добавить в банк программных решений, проверьте нашего друга в микроконтроллерах. arduino.cc/en/Tutorial/Debounce
Cammy_the_block
Вот фрагмент из того, что я написал некоторое время назад. if(digitalRead(data) && millis()-startTime > 10){и установите startTime каждый раз, когда он входит в цикл.
Cammy_the_block
просто интересуюсь; что именно я бы установил startTime?
linuxgnuru
Какой-то счетчик времени Сорта. Arduino имеет функцию миллис, которая дает время с момента запуска.
Cammy_the_block
Ах, хорошо, как и wiringPi wiringpi.com/reference/timing
linuxgnuru

Ответы:

12

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

Вы можете попробовать отменить кнопку / переключатель в программном или аппаратном обеспечении.

Вероятно, самое простое в программном обеспечении.

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

Для аппаратных решений ищите этот пост

Джоан
источник
8

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

Это проблема, с которой вы будете сталкиваться неоднократно, если взаимодействуете программное обеспечение с коммутаторами, поэтому стоит потратить время на его понимание, и статья Джека - самый лаконичный способ, который я когда-либо видел.

rolinger
источник
2

В приложениях с системным тикером я обычно использую сдвиговый регистр.

unsigned char button_checker;

// inside the system ticker

button_checker <<= 1; 
button_checker += INPUT;

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

Конечно, вы должны проводить событие нажатия кнопки только по переднему фронту.

ВСЗ
источник
1
Это интересный метод. Легко настраивается (маскируя наиболее значимые биты button_checker), чтобы требовать различного количества последовательных чтений.
Джоан