fbpx

Co to jest bouncing i jak go zniwelować

Opublikowane przez Jerzy Wickowski w dniu

Poprzednio napisałem krótki wstęp jak podpiąć i oprogramować przycisk. Jednak na końcu umieściłem informację, że kod ten nie jest idealny, bo jest podatny na bouncing. Jeżeli chcesz dowiedzieć się co to jest bouncing i jak go zniwelować. To zapraszam serdecznie :).

Co to jest bouncing?

Jest to zjawisko, które również można znaleźć pod nazwą „drganie styków”. Ta druga nazwa jest zdecydowanie bardziej obrazowa, ponieważ właśnie tak można sobie genezę tego zjawiska. Podczas podpinania pierwszego przycisku myślałem, że sygnał będzie wyglądał tak , a w rzeczywistości wygląda on bardziej tak . W związku z tym pojawia się mały problem, ukryty na pierwszy rzut oka. Mianowice miałem wrażenie, ze mój program czasem reaguje na kliknięcie przycisku, a czasem nie. Teraz już wiem, żę reagował, tylko bardzo szybko. Mianowicie w ułamku sekundy stan potrafi się zmienić kilkukrotnie, a jeżeli tych zmian była parzysta ilość to dioda zdążyła się włączyć i wyłączyć tak szybko, że nie byłem w stanie tego uchywycić gołym okiem.

Rozwiązanie softwarowe

Kiedy już poznałem genezę problemu to jego rozwiązanie okazało się bardzo łatwe, a mianowicie wystarczy zingorować wszystkie zmiany stanu, jeżeli poprzedni stan był utrzymany krócej niż X czasu. A przykładowy kod poniżej:

#include 

#define LED 04
#define BUTTON_TOP 0

unsigned long lastDebounceTime = millis();
unsigned long deboundeDelay = 50;

bool previousButtonState;
bool ledState = LOW;

void setup()
{
  pinMode(LED, OUTPUT);
  pinMode(BUTTON_TOP, INPUT);
  previousButtonState = digitalRead(BUTTON_TOP);
  digitalWrite(LED, ledState);
}

void changeLed(){
  ledState = !ledState;
  digitalWrite(LED, ledState);
}

bool shouldLedBeChanged(bool buttonState)
{
  if(lastDebounceTime - millis() <= deboundeDelay)
  {
    return false;
  }
  
  if(buttonState == HIGH || buttonState == previousButtonState)
  {
    return false;
  }

  return true;
}

void loop(){
  bool buttonState =  digitalRead(BUTTON_TOP);
  if(shouldLedBeChanged(buttonState))
  {
    changeLed();
  }

  if(buttonState != previousButtonState)
  {
    lastDebounceTime = millis();
  }
  previousButtonState = buttonState;
}



Czy to był wartościowy artykuł? Zapisz się, a wyślę Ci dwa ebooki o czystym kodzie oraz będę informował Cię o nowych postach

0 Komentarzy

Dodaj komentarz

Twój adres email nie zostanie opublikowany.

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.


    Zapisz się

    Wyślę Ci dwa dokumenty mówiące o jakości kodu. Dodatkowo będę Cię informował o nowych postach i nowościach.