Menu
CoddyTech

Eliminowanie drgań styków przycisku

Część sekcji Wejścia ścieżki Arduino w Coddy. Lekcja 6 z 22.

Przycisk w tej lekcji jest prawdziwy, a program startowy to Twój licznik z poprzedniej lekcji. Uruchom go i naciśnij przycisk raz: licznik zwiększy się o więcej niż jeden.

Wewnątrz przycisku stykają się dwa metalowe styki. Kiedy się zetkną, odbijają się: przez około milisekundę stykają się, odskakują i znów się stykają. Puszczenie przycisku daje ten sam efekt. loop() odczytuje pin wiele razy w ciągu tej milisekundy i zlicza każde odbicie jako naciśnięcie.

Rozwiązanie nazywa się eliminacją drgań styków: gdy odczyt się zmieni, zareaguj na to raz, a następnie odczekaj około 20 ms, aż styki się ustabilizują, zanim odczytasz je ponownie. Człowiek nie zauważy 20 ms.

if (reading != lastReading) {
  if (reading == LOW) {
    presses++;
    Serial.println(presses);
  }
  delay(20);
}
lastReading = reading;

Odczekuj po każdej zmianie, nie tylko po naciśnięciu: puszczenie przycisku również powoduje odbijanie się styków, a każde odbicie podczas zwalniania wygląda jak nowe naciśnięcie.

challenge icon

Wyzwanie

Średni

Napraw licznik, aby każde naciśnięcie było liczone tylko raz:

  • gdy reading różni się od lastReading, zalicz je, jeśli jest naciśnięciem (LOW), a następnie odczekaj 20 ms
  • nadal zapisuj lastReading na końcu loop()

Naciśnij Run, naciśnij przycisk kilka razy i obserwuj licznik, a następnie naciśnij Check.

Spróbuj swoich sił

const int buttonPin = 2;

int presses = 0;
int lastReading = HIGH;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  int reading = digitalRead(buttonPin);
  if (reading == LOW && lastReading == HIGH) {
    presses++;
    Serial.println(presses);
  }
  lastReading = reading;
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Wejścia

Poćwicz samodzielnie: Edytor online Arduino