Przyciski uzyskują zbyt wiele zdarzeń

12

Piszę odtwarzacz mp3, który zapisuje informacje na wyświetlaczu LCD, chciałbym przekonwertować je z klawiatury na przyciski, ale ciągle otrzymuję zbyt wiele naciśnięć klawiszy. Próbowałem podciągać i opadać / rosnąć, ale wciąż otrzymuję ten sam wynik. Czy ktoś wie od razu, czy jest to znany problem, czy po prostu robię coś złego? Och, robię to również całkowicie w C przy użyciu wiringPi.

linuxgnuru
źródło
1
Aby dodać do puli rozwiązań programowych, sprawdź naszego przyjaciela w mikrokontrolerach. arduino.cc/en/Tutorial/Debounce
Cammy_the_block
Oto fragment fragmentu, który napisałem jakiś czas temu. if(digitalRead(data) && millis()-startTime > 10){i ustaw startTime za każdym razem, gdy wejdzie w pętlę.
Cammy_the_block
tylko się zastanawiam; na co dokładnie miałbym ustawić startTime?
linuxgnuru
Jakiś licznik czasu. Arduino ma funkcję millis, która daje czas od początku.
Cammy_the_block
Ach, ok, tak samo jest z okablowaniem Pi wiringpi.com/reference/timing
linuxgnuru

Odpowiedzi:

12

Mechaniczne przyciski i przełączniki mogą podlegać odbiciu od przełącznika, w którym szybko przełączają się między otwarciem a zamknięciem przez kilka milisekund.

Możesz spróbować ogłosić przycisk / przełącznik w oprogramowaniu lub sprzęcie.

Prawdopodobnie najprostsze w oprogramowaniu.

Jeśli poziom się zmienia (z włączonego na wyłączony lub z wyłączonego na włączony), poczekaj x milisekund i ponownie przeczytaj gpio. Jeśli nadal jest w nowym stanie, załóż, że jest to prawdziwe przejście. Wartość x może wynosić około 20.

Rozwiązania sprzętowe szukaj tego rodzaju postów

joan
źródło
8

Poświęć trochę czasu na przeczytanie przewodnika po ogłoszeniach Jacka Ganssle'a . Pierwsza strona bardzo szczegółowo ilustruje problem, a druga, jak sobie z nim poradzić w sprzęcie lub oprogramowaniu. Nie ma „idealnej” metody usuwania, ale jest wiele złych!

Jest to problem, na który często będziesz się natrafiał, jeśli łączysz oprogramowanie z przełącznikami, więc warto poświęcić czas na jego zrozumienie, a artykuł Jacka jest najbardziej zwięzłym sposobem, w jaki to zrobiłem.

rolinger
źródło
2

W aplikacjach, które mają systemowy pasek, zwykle wdrażam rejestr zmian.

unsigned char button_checker;

// inside the system ticker

button_checker <<= 1; 
button_checker += INPUT;

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

Oczywiście, powinieneś wykonać zdarzenie naciśnięcia przycisku tylko na zboczu narastającym.

vsz
źródło
1
To ciekawa metoda. Łatwo dostosowywany (przez maskowanie najbardziej znaczących fragmentów button_checker), aby wymagał zmiennej liczby kolejnych odczytów.
joan