Несколько раз я начинал и бросал эту статью, так как тема подключения кнопки очень простая, не хотелось о ней даже писать. Но каждый раз, сталкиваясь с дребезгом контактов кнопок, идея дописать статью возвращалась. И вот в очередной раз, вернувшись к тексту и до конца оформив публикацию, статья появилась на свет.
Подключение кнопки к arduino
Подключение кнопки к arduino – это один из первых шагов, которые совершаются при знакомстве с ардуино. Описывать тут особо нечего, поэтому перейду сразу к сути. Для подключения достаточно всего трех ножек кнопки. Одна соединяется с пином ардуино, на котором и будет считываться положение кнопки, вторая нога соединяется с плюсом, а третья, через резистор подтянута к земле. Сопротивление резистора должно быть от 10 до 100 кОм.
Схема подключения:
Как исключить дребезг контактов кнопки
Чтобы избежать дребезга контактов есть несколько способов: воспользоваться готовой библиотекой Bounce.h, гасить дребезги аппаратно или самостоятельно описать в коде проверку.
Аппаратно – это слишком усложнит схему. Использовать библиотеку – слишком просто, не интересно и придется потратить какое-то место в памяти микроконтроллера под библиотеку. А вот реализовать самостоятельную проверку, это, на мой взгляд, идеальное решение.
Для отсекания дребезг контактов кнопки достаточно небольшой задержки в 5-7 миллисекунд, поскольку дребезг происходит на очень коротком промежутке времени. Алгоритм следующий: запоминаем старое состояние кнопки, и при каждом опросе состояния кнопки, сверяем текущее и новое значения. Если они отличаются, то ждем 5 миллисекунд и проверяем положение кнопки еще раз.
Ниже приведен код с подробными комментариями:
// пин светодиода
int ledPin = 4;
boolean ledOn = false; // состояние светодиода
// пин кнопки
int btn_1 = 2;
boolean lastBtn_1 = false; // предыдущее состояние кнопки
boolean currentBtn_1 = false; // текущее состояние кнопки
void setup() {
// режимы работы пинов
pinMode (btn_1, INPUT);
pinMode (ledPin, OUTPUT);
}
void loop() {
// получение состояния кнопки
currentBtn_1 = isBtnStatus(lastBtn_1);
// если кнопка была нажата 5 миллисекунд и более
if (lastBtn_1 == false && currentBtn_1 == true) {
// меняем состояние светодиода
ledOn = !ledOn;
}
// сохраняем состояние кнопки
lastBtn_1 = currentBtn_1;
// включаем или выключаем светодиод
digitalWrite (ledPin, ledOn);
}
// функция для определения состояния кнопки
boolean isBtnStatus(boolean last) {
// считываем состояние кнопки
boolean current = digitalRead(btn_1);
// сравниваем текущее состояние кнопки со старым
if (last != current) {
// ждем 5 миллисекунд
delay(5);
// считываем состояние кнопки еще раз
current = digitalRead(btn_1);
}
// возвращаем состояние кнопки
return current;
}
Послесловие
Метод, использованный в статье, действенный – дребезг кнопки исчезает, только он останавливает выполнение скетча на 5 миллисекунд. Если в устройстве не больше 10-20 кнопок, то все будет работать идеально. А если их количество возрастет до 100, то общее время задержки, необходимое на экранирование дребезга, будет составлять уже пол секунды и это очень много. В таком случае вместо delay, можно использовать функцию millis, которая позволяет замерять время в миллисекундах от старта программы. С помощью millis можно, не прибегая к остановкам скетча, реализовать туже самую проверку.


(3 оценок, среднее: 3,67 из 5)