Несколько раз я начинал и бросал эту статью, так как тема подключения кнопки очень простая, не хотелось о ней даже писать. Но каждый раз, сталкиваясь с дребезгом контактов кнопок, идея дописать статью возвращалась. И вот в очередной раз, вернувшись к тексту и до конца оформив публикацию, статья появилась на свет.
Подключение кнопки к 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 можно, не прибегая к остановкам скетча, реализовать туже самую проверку.