СОДЕРЖАНИЕ ►
Как подключить тактовую кнопку к цифровым и аналоговым входам на Arduino Uno правильно. Расскажем, как избежать «дребезг контактов», рассмотрим схему подключения одной и нескольких кнопок к плате Ардуино. Рассмотрим функции digitalRead и analogRead в языке программирования C++, которые часто требуется использовать при создании различных проектов на Ардуино для начинающих.
Работа с тактовыми кнопками на Ардуино
Главная проблема использования кнопок для управления Arduino заключается в «дребезге контактов». Дело в том, что механические контакты в тактовых кнопках никогда не замыкаются и размыкаются мгновенно. В течении нескольких миллисекунд происходит многократное замыкание и размыкание контактов — в итоге на микроконтроллер поступает не единичный сигнал, а серия импульсов.

Для того, чтобы исключить на микроконтроллере Arduino дребезг кнопки используют различные электрические схемы с триггерами и конденсаторами. Но намного удобнее и проще использовать программный способ борьбы с возможным дребезгом тактовой кнопки — для этого применяют задержку на несколько миллисекунд или используют библиотеку Bounce2.h для борьбы с дребезгом контактов для Arduino.
Подключение кнопки к Ардуино с резистором
Для этого занятия потребуется:
- Arduino Uno / Arduino Nano / Arduino Mega;
- макетная плата;
- 1 светодиод;
- резисторы на 220 Ом и 10 кОм;
- 1 тактовая кнопка;
- провода «папа-папа» и «папа-мама».

Используем цифровые порты на плате для подключения тактовой кнопки и команду digitalRead для считывания данных. Соберите схему, как на рисунке выше и загрузите скетч. Обратите внимание, что при отпущенной кнопке на Pin2 поступает логический «0». С помощью кнопки будем выключать и включать встроенный светодиод, подключенный к цифровому 13 порту на плате микроконтроллера Ардуино.
Скетч Ардуино подключение кнопки к цифровому входу
void setup() { pinMode(13, OUTPUT); // объявляем пин 13 как выход pinMode(2, INPUT); // объявляем пин 2 как вход } void loop() { if (digitalRead(2) == HIGH) // когда на пин 2 поступает высокий сигнал { digitalWrite(13, HIGH); // зажигаем светодиод } if (digitalRead(2) == LOW) // когда на пин 2 поступает низкий сигнал { digitalWrite(13, LOW); // выключаем светодиод } }
Пояснения к коду:
- процедура
setupвыполняется один раз, используется процедура для конфигурации портов микроконтроллера (назначение режима работы портов); - процедуры
setupиloopдолжны присутствовать в любой программе (скетче); - использованные константы:
INPUT,OUTPUT,LOW,HIGH, пишутся заглавными буквами, иначе компилятор их не распознает и выдаст ошибку.
Подключение кнопки с подтягивающим резистором

Можно также сделать подключение кнопок к аналоговому входу Ардуино (обозначены, как Analog In на плате). Принципиальное отличие данной схемы — это использование аналогового порта на микроконтроллере. Для включения и выключения светодиода будем также использовать встроенный светодиод на плате. Переключите тактовую кнопку к аналоговому входу A1 и загрузите в плату следующий скетч.
Скетч Ардуино подключение кнопки к аналоговому входу
void setup() { pinMode(13, OUTPUT); // объявляем пин 13 как выход pinMode(A1, INPUT); // объявляем пин A1 как вход } void loop() { if (analogRead(A1) > 300) // когда аналоговая кнопка нажата { digitalWrite(13, HIGH); // зажигаем светодиод } if (analogRead(A1) < 300) // когда аналоговая кнопка отпущена { digitalWrite(13, LOW); // выключаем светодиод } }
Пояснения к коду:
- в данном скетче мы используем функцию
analogReadдля считывания значений с аналогового входаA1, при этом порт можно использовать, как цифровой; - значения на аналоговом входе могут отличаться (все зависит от сопротивления резистора в схеме) и могут принимать значения в диапазоне от 0 до 1023.
Подключение кнопки к Ардуино без резистора

Для конфигурации порта микроконтроллера в команде pinMode() можно использовать режим работы INPUT_PULLUP. В этом случае к пину подключается 5V с подтягивающим резистором, что позволяет подключать кнопки к Ардуино без резистора. В следующей программе реализована возможность считывания нажатий на тактовые кнопки без дребезга, с помощью которых будет увеличиваться или уменьшаться переменная.
Скетч: подключение кнопки к Ардуино input_pullup
int x; boolean button1WasUp = true; // переменные для считывания нажатия на кнопки boolean button2WasUp = true; void setup() { pinMode(2, INPUT_PULLUP); // подключаем тактовые кнопки pinMode(3, INPUT_PULLUP); Serial.begin(9600); } void loop() { boolean button1IsUp = digitalRead(2); // узнаем текущее состояние кнопок boolean button2IsUp = digitalRead(3); // если кнопка 1 была нажата, увеличиваем переменную "x" if (button1WasUp && !button1IsUp) { delay(10); button1IsUp = digitalRead(2); if (!button1IsUp) { x = x + 1; Serial.println(x); } } button1WasUp = button1IsUp; // запоминаем состояние кнопки 1 // если кнопка 2 была нажата, уменьшаем переменную "x" if (button2WasUp && !button2IsUp) { delay(10); button2IsUp = digitalRead(3); if (!button2IsUp) { x = x - 1; Serial.println(x); } } button2WasUp = button2IsUp; // запоминаем состояние кнопки 2 }
Пояснения к коду:
- задержка
delay(10);необходима в программе для исключения влияния дребезга контактов и ложного срабатывания кнопки; - переменная ‘x’ будет выводиться на монитор порта при нажатии на кнопку.
Заключение. В этом обзоре мы рассмотрели подключение кнопки и светодиода к Ардуино (светодиод можно подключить к 13 пину платы). Более интересное подключение, с использованием режима INPUT_PULLUP для порта, рассмотрено при подключении модуля тактовой кнопки без дребезга — здесь. Если у вас остались вопросы по данному обзору — оставляйте их в комментариях к этой записи.










Здравствуйте. А почему не рассмотрели режим INPUT_PULLUP для кнопки?
У вас там в скетче 2 ошибка:
void setup{
}
А должно быть:
void setup( ) {
}
там всё правильно
Спасибо. Исправили опечатку в скетче
А почему у нас идёт проверка данных с пинов 8 и 10, хотя они изначально не обозначены? И для чего мы запоминаем значения кнопок?
Спасибо. Исправили ошибку в скетче