Istnieje kilka sposobów eliminacji drgań styków (posegregowane według skuteczność)
1. układy specjalizowane
2. metoda programowa
3. przez filtr RC (kondensator)
1. Układy specjalizowane:
zalety:
- jest najbardziej skuteczną metodą
- dodatkowe opcje jak np. wyłączenie wszytkich klawiszy pinem EN
wady:
- najdroższa z metoda
Schemat podłączenia:
Przykładowy układ specjalizowany: MAX6818
Piny EN i CH nie są niezbędne (EN jak nie używamy podciągamy do masy)
Więcej informacji o układzie MAX6818:
- https://datasheets.maximintegrated.com/en/ds/1896.pdf – dokumentacja
- https://ep.com.pl/files/5617.pdf
2. Metoda programowa:
zalety:
- bez ponoszenia dodatkowych koszów, możliwość dodania po wykonaniu urządzenia
wady:
- zajmuje czas procesora, może być kłopotliwa w implementacji
przykładowy program dla adruino:
3. Przez filtr RC (kondensator)
zalety:
- bardzo tania
wady:
- nie gwarantuje 100% skuteczności
- rozładowywanie kondensatora przyciskiem skraca jego żywotność
- im bardzie skuteczna i bezpieczna metoda tym więcej elementów
Przykład implementacji:
Szerzej problem omówili:
- ElektroPrzewodnik – Przyciski | #25 [Arduino]
- RS Elektronika – Debouncing [RS Elektronika] #101
- EMBED WITH ELLIOT: DEBOUNCE YOUR NOISY BUTTONS – hackaday.com
Program w celu sprawdzenia skuteczności sprzętowej eliminacji drgania styków
Program w czasie rzeczywistym wychwytuje wszystkie zmiany stanu i wyrzuca je do serial portu, pomijając powtarzanie stanu po przekroczeniu 25 powtórzeń tego samego stanu:
Ograniczenia programu: program odczytuje tylko stan cyfrowy pinu (co zresztą powinno wystarczyć do obsługi przycisku, w sposób cyfrowy), nie reaguje na zmiany stanu w granicach poziomów logiczny TTL, czyli wtedy kiedy drgania następuje w granicach stanu wysokiego lub niskiego ale jeszcze go nie przekroczyły. Do tego celu należało by wykorzystać wejście analogowe jednak znacznie skomplikowało by to kod programu.
/*
Program do testowania sprzętowej eliminacji drgania stykówW celu wizualizacji wyników skorzystaj z kreślarki
Narzędzia -> KreślarkaDomyślne podłączenie :
| pushButton
\
| GNDPin pushButton jest domyślnie programowo podciągnięty do zasilania
Napisane przez AIIoT
Strona: http://aiiot-technology.eu
*/#define SerialBaud 230400 // Szybkośc portu szeregowego
#define pushButton 4 // Wejście przyciskubyte static licz = 25; // Liczba powtórzeń tego samego stanu
byte i; // Zmienna licznika powtórzeń
bool buttonState, lastButtonState; // Zmienne do blokady powtórzeń#if defined(ESP8266) // Ustawienia tylko dla ESP8266
#if(ARDUINO_ESP8266_NODEMCU||ARDUINO_ESP8266_WEMOS_D1MINI||ARDUINO_ESP8266_ESP01)// Nie wykonuj dla NODEMCU, WEMOS, ESP8266_ESP01
#else
#define LED_BUILTIN 2 // Zmiana pinu diody sygnalizacyjnej na wbudowaną diodę dla ESP-07, ESP-12
#endif
#endif// the setup routine runs once when you press reset:
void setup() {
Serial.begin(SerialBaud); // inicjalizacja portu szeregoweko
// make the pushbutton’s pin an input:
pinMode(pushButton, INPUT_PULLUP); // pushButton jako pin wejściowy, z podciądniętym rezystorem
pinMode(LED_BUILTIN, OUTPUT); // LED_BUILTIN jako pin wyjściowy
Serial.print(„\r\nboot „);
}// the loop routine runs over and over again forever:
void loop() {
// read the input pin:
lastButtonState = buttonState; buttonState = digitalRead(pushButton); // Zapis poprzedniego i odczy aktualnego stanuif(lastButtonState == buttonState && i<licz)i++; // Zliczanie powtórzeń
if(lastButtonState != buttonState)i=0; // Zerowanie stanu licznika
if(lastButtonState != buttonState || i <licz){ // Wysyłanie zmiany wartości portem szeregowym
Serial.print(„\r\nStan: „);
Serial.print(buttonState);
}digitalWrite(LED_BUILTIN,buttonState); // Sygnalizsacja wcisnięcia przycisku wbudowaną diodą
}