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.


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


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.


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.


1
To ciekawa metoda. Łatwo dostosowywany (przez maskowanie najbardziej znaczących fragmentów button_checker), aby wymagał zmiennej liczby kolejnych odczytów.
joan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.