Устранение дребезга кнопки
Часть раздела Входные сигналы путешествия по Arduino на Coddy. Урок 6 из 22.
Кнопка в этом уроке настоящая, а начальный скетч — это ваш счётчик из прошлого урока. Запустите его и нажмите кнопку один раз: счётчик увеличится больше чем на единицу.
Внутри кнопки соприкасаются два металлических контакта. Когда они соприкасаются, они дребезжат: примерно в течение миллисекунды они ударяются, отскакивают и снова ударяются. При отпускании происходит то же самое. loop() считывает состояние вывода много раз за эту миллисекунду и считает каждый отскок нажатием.
Решение называется устранением дребезга: когда показание меняется, обработайте это изменение один раз, затем подождите около 20 мс, пока контакты не успокоятся, прежде чем считывать их снова. Человек не замечает 20 мс.
if (reading != lastReading) {
if (reading == LOW) {
presses++;
Serial.println(presses);
}
delay(20);
}
lastReading = reading;Ждите после каждого изменения, а не только после нажатия: при отпускании тоже возникает дребезг, и каждый отскок при отпускании выглядит как новое нажатие.
Задание
СреднеИсправь счётчик, чтобы каждое нажатие учитывалось один раз:
- когда
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;
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Входные сигналы
Потренируйтесь самостоятельно: Песочница Arduino