Следующая функция опрашивает кнопку с номинальным интервалом в 1 миллисекунду и требует, чтобы состояние оставалось «отпускающим» до 20 последовательных опросов. Как правило, этого достаточно, чтобы устранить дребезг большинства коммутаторов, сохраняя при этом отзывчивость.
Замените свой цикл while(bcm2835_gpio_lev(PIN)){}
вызовом waitButtonRelease()
.
#include <unistd.h>
#define DEBOUNCE_MILLISEC 20
void waitButtonRelease()
{
int debounce = 0 ;
while( debounce < DEBOUNCE_MILLISEC )
{
usleep(1000) ;
if( bcm2835_gpio_lev(PIN) )
{
debounce = 0 ;
}
else
{
debounce++ ;
}
}
}
Вы можете также счесть необходимым устранить дребезг нажатий кнопок и их отпусканий. Это делается так же, но с учетом противоположного состояния:
void waitButtonPress()
{
int debounce = 0 ;
while( debounce < DEBOUNCE_MILLISEC )
{
usleep(1000) ;
if( !bcm2835_gpio_lev(PIN) )
{
debounce = 0 ;
}
else
{
debounce++ ;
}
}
}
Или, возможно, одна функция для устранения дребезга любого состояния:
#include <stdbool.h>
void waitButton( bool state )
{
int debounce = 0 ;
while( debounce < DEBOUNCE_MILLISEC )
{
usleep(1000) ;
if( bcm2835_gpio_lev(PIN) == state )
{
debounce++ ;
}
else
{
debounce = 0 ;
}
}
}
Учитывая эту последнюю функцию, ваш основной цикл while может выглядеть так:
while(1)
{
waitButton( true )
printf("The button has been pressed\n");
waitButton( false ) ;
}
Если у вас есть доступ к цифровому запоминающему осциллографу, вы можете проверить сигнал переключателя напрямую, чтобы точно увидеть, как выглядит дребезг переключателя. Это может помочь вам понять проблему, а также адаптировать подавление дребезга к характеристикам вашего конкретного коммутатора.
person
Clifford
schedule
30.04.2013