Menu
CoddyTech

Устранение дребезга кнопки

Часть раздела Входные сигналы путешествия по Arduino на Coddy. Урок 6 из 22.

Кнопка в этом уроке настоящая, а начальный скетч — это ваш счётчик из прошлого урока. Запустите его и нажмите кнопку один раз: счётчик увеличится больше чем на единицу.

Внутри кнопки соприкасаются два металлических контакта. Когда они соприкасаются, они дребезжат: примерно в течение миллисекунды они ударяются, отскакивают и снова ударяются. При отпускании происходит то же самое. loop() считывает состояние вывода много раз за эту миллисекунду и считает каждый отскок нажатием.

Решение называется устранением дребезга: когда показание меняется, обработайте это изменение один раз, затем подождите около 20 мс, пока контакты не успокоятся, прежде чем считывать их снова. Человек не замечает 20 мс.

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

Ждите после каждого изменения, а не только после нажатия: при отпускании тоже возникает дребезг, и каждый отскок при отпускании выглядит как новое нажатие.

challenge icon

Задание

Средне

Исправь счётчик, чтобы каждое нажатие учитывалось один раз:

  • когда reading отличается от lastReading, учитывай его, если это нажатие (LOW), затем подожди 20 мс
  • продолжай сохранять lastReading в конце loop()

Нажми Run, нажми кнопку несколько раз и следи за счётом, затем нажми Check.

Попробуйте сами

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 iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Входные сигналы

Потренируйтесь самостоятельно: Песочница Arduino