Skip to contentSkip to main navigation Skip to footer

Arduino и кнопка

Описание


Кнопка – самый базовый элемент ввода данных в микроконтроллер. Функционально кнопка замыкает контакт при нажатии, что может быть использовано для передачи через неё электрического сигнала на пин МК. МК читает значение пина и таким образом понимает, нажата кнопка или нет.

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

Работа с пинами и ручной опрос кнопки относятся к базовым понятиям и очень подробно разобраны в уроках:

Подключение к МК


Кнопка может быть подключена на любой цифровой пин (в случае Arduino NANO – D0-D13, A0-A5) и опрашиваться как цифровое значение при помощи digitalRead(pin). Также можно работать на аналоговых пинах с аналоговой величиной, но это не рационально. Так как напряжение на цифровом пине должно быть точно определено, при подключении кнопки обязательно осуществляется “подтяжка” пина к противоположному от кнопки значению, подробнее об этом см. в уроке. Мы всегда будем подключать кнопку на GND, а пин подтягивать встроенной подтяжкой при помощи pinMode(pin, INPUT_PULLUP). Пример подключения двух кнопок на макетке:

Кнопки из набора не очень приспособлены для подключения на макетной плате: у них очень широкие изогнутые ножки, которые туго входят в отверстия. Можно выпрямить их, а затем скрутить на 90 градусов при помощи пинцета. Так они не будут излишне растягивать контакты платы. Вторую пару ножек можно отогнуть или откусить кусачками.


Подключение к модулям


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

Библиотеки


С кнопкой можно работать без библиотек, просто опрашивая пин, основные алгоритмы подробно разобраны в уроках по ссылкам выше. Но для удобства можно использовать библиотеки, предоставляющие удобные функции для расширенного опроса кнопки (клик, несколько кликов, удержание и так далее):

В примерах на этом сайте мы будем использовать EncButton как самую лёгкую и универсальную, также она позволяет работать с энкодером и энкодером с кнопкой. Библиотека идёт в архиве к набору GyverKIT, а свежую версию всегда можно установить/обновить из встроенного менеджера библиотек Arduino по названию EncButton. Краткая документация находится по ссылке выше, базовые примеры есть в самой библиотеке.

Примеры


Кнопка управляет светодиодом
/*
  Кнопка на D3. Переключаем светодиод по клику
*/
#include <EncButton.h>

// подключаем кнопку на D3
EncButton<EB_TICK, 3> btn1(INPUT_PULLUP);

void setup() {
  // пин 13 как выход (для мигания светодиодом)
  pinMode(13, OUTPUT);
}

void loop() {
  // опрос кнопки происходит здесь
  btn1.tick();

  // клик по кнопке - переключить светодиод на 13 пине
  if (btn1.click()) digitalWrite(13, !digitalRead(13));
}
Две кнопки, разные действия
/*
  Кнопки на D2 и D3. Выполняем всякие действия
  по нажатию и удержанию
*/
#include <EncButton.h>

// подключаем кнопки на пины D2 и D3
EncButton<EB_TICK, 2> btn1(INPUT_PULLUP);
EncButton<EB_TICK, 3> btn2(INPUT_PULLUP);

void setup() {
  // открываем порт для связи
  Serial.begin(9600);

  // пин 13 как выход (для мигания светодиодом)
  pinMode(13, OUTPUT);
}

void loop() {
  // опрос кнопок происходит здесь
  btn1.tick();
  btn2.tick();

  // клик по первой кнопке - вывод текста
  if (btn1.click()) Serial.println("btn 1 click!");

  // удержание первой кнопки - вывод текста
  if (btn1.held()) Serial.println("btn 1 holded!");

  // клик по второй кнопке - переключить светодиод на 13 пине
  if (btn2.click()) digitalWrite(13, !digitalRead(13));
}
Две кнопки меняют значение переменной
/*
  Кнопки на D2 и D3. Меняем значение переменной
*/
#include <EncButton.h>

// подключаем кнопки на пины D2 и D3
EncButton<EB_TICK, 2> btn1(INPUT_PULLUP);
EncButton<EB_TICK, 3> btn2(INPUT_PULLUP);

// эту переменную будем менять
int value = 0;

void setup() {
  // открываем порт для связи
  Serial.begin(9600);
}

void loop() {
  // опрос кнопок происходит здесь
  btn1.tick();
  btn2.tick();

  // клик по кнопке - меняем значение и выводим в порт
  if (btn1.click()) {
    value += 10;
    Serial.println(value);
  }
  if (btn2.click()) {
    value -= 10;
    Serial.println(value);
  }
}
Кнопка управляет яркостью светодиода
Войди или зарегистрируйся, чтобы видеть пример полностью!

Домашнее задание


  • Изучить остальные функции для работы с кнопкой
  • Добавить и опросить третью кнопку, задачу придумать самому
  • Изучить примеры к библиотеке EncButton

 

Полезный пример?

Подписаться
Уведомить о
3 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии