Bounce jako lek na migotanie przycisków
Znacznym problemem podczas tworzenia projektu z wykorzystaniem Arduino, w którym chcemy wykorzystać do sterowania mikroprzełączniki jest możliwość wystąpienia niepożądanego zjawiska tak zwanego „migotania”. Ze względu na budowę przełączników mechanicznych, w których następuje zetknięcie lub rozłączenie styków, jest możliwość pojawienia się dodatkowych impulsów, które mogą zostać źle zinterpretowane przez nasz program jako wielokrotne naciśnięcie i zwolnienie przycisku.
Sytuacja jest bardzo prosta. Chcemy aby nasz program wykonał pojedyncza zmianę statusu podczas wciśnięcia przycisku. Kiedy palec nam zadrży, może wydarzyć się sytuacjam, w której status zmieni się wielokrotnie. Jak temu zapobiec?
Z pomocą przyjdzie nam biblioteka Bounce, która pozwoli nam nie tylko na uniknięcie wspomnianego zjawiska, ale również na reakcję przez nas program na moment wciśnięcia lub zwolnienia przycisku. Dodatkową zaletą tej biblioteki jest możliwość określenia własnego interwału oraz odczytywanie stanu przełącznika, bez względu na występowanie efektu „migotania”.
Instalacja
Instalacja jest bardzo prosta. Pobieramy wspomnianą bibliotekę Bounce i rozpakowywujemy do naszego katalagu bibliotek naszego szkicownika:
- tree -d ~/sketchbook/libraries/
- /home/santyago/sketchbook/libraries/
- `-- Bounce
- `-- examples
- |-- bounce
- |-- change
- |-- duration
- |-- edge
- `-- rebounce
Po ponownym uruchomieniu Arduino IDE, możemy zaimportować naszą bibliotekę Bounce do szkicu:
Program demonstracyjny
- #include <Bounce.h>
- int buttonPin = 2; // Przycisk do pinu 2
- int buttonLedRed = 3; // Czerwona dioda do pinu 3
- int buttonLedYellow = 5; // Żółta dioda do pinu 5
- int buttonLedGreen = 6; // Zielona dioda do pinu 6
- // Ustawiamy nasz "bouncer" z interwałem czasowym 50ms
- Bounce bouncer = Bounce(buttonPin, 50);
- // Konfiguracja pinów
- void setup()
- {
- pinMode(buttonPin, INPUT);
- pinMode(buttonLedRed, OUTPUT);
- pinMode(buttonLedYellow, OUTPUT);
- pinMode(buttonLedGreen, OUTPUT);
- }
- // Główna pętla programu
- void loop()
- {
- // Aktualizujemy status przycisku
- bouncer.update();
- // Pobieramy stan przycisku
- int value = bouncer.read();
- // Jeśli przycisk wciśnięty, zapalamy żółtą diodę
- if (value == HIGH)
- {
- digitalWrite(buttonLedYellow, HIGH);
- } else
- {
- digitalWrite(buttonLedYellow, LOW);
- }
- // Zapalamy czerwoną diodę na zbocze narastające (wciśnięcie)
- if (bouncer.risingEdge())
- {
- digitalWrite(buttonLedRed, HIGH);
- delay(100);
- } else
- {
- digitalWrite(buttonLedRed, LOW);
- }
- // Zapalamy zieloną diodę na zbocze opadające (zwolnienie)
- if (bouncer.fallingEdge())
- {
- digitalWrite(buttonLedGreen, HIGH);
- delay(100);
- } else
- {
- digitalWrite(buttonLedGreen, LOW);
- }
Uruchomienie
Na zakończenie wystarczy zaprogramować nasz mikrokontroler i sprawdzić działanie układu.
Reklama
Komentarze
Witam, wydaje mi się, iż w linii 1 Programu demonstracyjnego instrukcja wywołująca bibliotekę Bounce.h powinna być Bounce2.h ( taka mała literówka..)
P.S. Może dla starych "Arduinowców" to jest jasne jak słońce, że tak powinno być, ale dla początkujących raczkujących (jak ja) taka informacja może uratować życie :)
Pozdrawiam
JarekArduino
to są fwie rone biblioteki.
Robią to samo ale składnia jest inna
https://playground.arduino.cc/Code/Bounce