- Разновидности кнопок
- Подключение кнопки в режиме INPUT_PULLUP
- Мигание светодиода после нажатия на кнопку
- Подключение кнопки по схеме с подтягивающим резистором
- Переключение режимов с помощью кнопки
- Как переключать режимы работы после нажатия кнопки?
- Сборка устройства
- Некорректное подключение кнопки
- Дребезг контактов
- Инструкция по подключению кнопки
- Без резистора
- С использованием подтягивающего резистора
- В режиме input-pullup
- Аналоговые клавиатуры
- Видео
- Включение-выключение с помощью кнопки
- Дребезг кнопки ардуино
- Как переключать режимы кнопкой
- Алгоритмы
- Отработка нажатия
- Дребезг контактов
- “Импульсное” удержание
- Простейший класс кнопки
- Другие возможности кнопки
- Материалы
- Обработка короткого нажатия на кнопку
Разновидности кнопок
Кнопка Arduino действует как тип датчика, который отправляет сигнал контроллеру, так что устройство выполняет серию зашифрованных действий в команде.
Есть 2 типа кнопок:
- переключатели;
- часы.
Первый тип возвращается в исходное положение после прекращения воздействия.
Второй тип, называемый мгновенными кнопками, после прекращения приложения сил фиксируется в том положении, которое было ему придано.
Подключение кнопки в режиме INPUT_PULLUP
В приведенной выше схеме мы использовали подтягивающий резистор для генерации определенного уровня сигнала на цифровом порте. Но есть еще один способ подключить кнопку без резистора, используя внутреннее сопротивление платы ардуино. В блоке настройки нам просто нужно определить тип вывода, к которому мы будем подключать кнопку, как INPUT_PULLUP.
Альтернативный вариант — выбрать режим вывода как ВЫХОД и установить для этого порта высокий уровень сигнала. Встроенный подтягивающий резистор подключается автоматически.
И это все. Вы можете собрать такую сложную схему и работать с кнопкой в эскизе.
Мигание светодиода после нажатия на кнопку
В предыдущем примере со светодиодами мы подключили кнопку к плате Arduino и разобрались, как она работает. Светодиод то загорался, то гас, но делал это в полностью пассивном режиме — сам контроллер тут совершенно лишний, его можно было заменить батарейками. Поэтому давайте сделаем наш новый проект «умнее»: при нажатии на кнопку светодиод постоянно мигает. Обычной схемой с лампочкой и переключателем этого не сделать — мы воспользуемся мощностью нашего микроконтроллера для решения этой пусть пусть простой, но нетривиальной задачи.
Полная схема проекта представлена на рисунке:
Нам уже известен фрагмент схемы со светодиодом. Собрали нормальную фару со светодиодом и ограничивающим резистором. Но во второй части мы видим знакомую кнопку и еще один резистор. Пока мы не углубимся в детали, мы просто соберем схему и загрузим простой скетч в Arduino. Все элементы схемы находятся в простейших стартовых наборах ардуино.
Нажмите и удерживайте: светодиод мигает. Отпускаю — выключается. Именно то, что они хотели. Мы хлопаем в ладоши от радости и приступаем к анализу того, что мы сделали.
Посмотрим на эскиз. В нем мы видим довольно простую логику.
- Определяет, была ли нажата кнопка.
- Если кнопка не нажата, мы просто выходим из метода цикла, ничего не добавляя и не изменяя.
- При нажатии на кнопку мигает фрагмент стандартного скетча:
- Включите светодиод, подав напряжение на нужный порт
- Делаем необходимый перерыв с включенным светодиодом
- Выключите светодиод
- Делаем необходимый перерыв с выключенным светодиодом
Поведение кнопки на скетче может зависеть от способа подключения подтягивающего резистора. Об этом мы поговорим в следующей статье.
Подключение кнопки по схеме с подтягивающим резистором
Сначала мы подключаем кнопку к Arduino, используя схему подтягивающего резистора. Для этого подключите один контакт кнопки к массе, а другой к цифровому выходу «2». Также подключаем цифровой выход «2» через резистор 10 кОм к источнику питания +5 В.
Подключение кнопки к Arduino с помощью подтягивающего резистора
Пишем такой скетч для управления нажатиями кнопок и загружаем в Arduino.
Встроенный светодиод на контакте «13» горит постоянно, пока не будет нажата кнопка. Те. Порт Arduino «2» всегда ВЫСОКИЙ. Когда мы нажимаем кнопку, напряжение на порте «2» становится НИЗКИМ, и светодиод гаснет.
Переключение режимов с помощью кнопки
Чтобы определить, была ли нажата кнопка, достаточно исправить факт нажатия и сохранить знак в специальной переменной.
Определяем, нажимать ли с помощью функции digitalRead (). В результате получаем HIGH (1, TRUE) или LOW (0, FALSE) в зависимости от того, как была подключена кнопка. Если мы подключим кнопку с помощью внутреннего подтягивающего резистора, при нажатии кнопки будет получен уровень 0 (ЛОЖЬ) на входе).
Дело в том, что digitalRead () может возвращать HIGH, но это не означает, что была нажата кнопка. В случае использования схемы с подтягивающим резистором ВЫСОКИЙ будет означать, что кнопка, наоборот, не нажата. В первом варианте (digitalRead (PIN_BUTTON) == LOW) мы сразу сравнили ввод с нужным нам значением и определили, что кнопка была нажата, хотя на входе сейчас низкий уровень сигнала. И он сохранил состояние кнопки в переменной. Постарайтесь явно указать все выполняемые логические операции, чтобы сделать код более прозрачным и избежать ненужных глупых ошибок.
Как переключать режимы работы после нажатия кнопки?
Часто возникает ситуация при использовании кнопок, необходимо учитывать не только нажатие, но и отпускание кнопки. Например, нажав и отпустив кнопку, мы можем включить свет или изменить режим работы схемы. Другими словами, нам нужно как-то исправить в коде тот факт, что мы нажимаем кнопку и используем информацию в будущем, даже если кнопка еще не была нажата. Посмотрим, как ты сможешь это сделать.
Логика программы очень проста:
- Вспомните нажатие служебной переменной.
- Ждем, пока исчезнут явления отскока.
- Ждем отпускания кнопки.
- Запоминаем отпускание и выставляем в отдельной переменной признак того, что кнопка была полностью нажата.
- Удаляем служебную переменную.
Сборка устройства
В первую очередь нужно изготовить печатную плату. Выполняется методом LUT, файл прилагается к статье. Перед печатью зеркальное отображение не требуется. Метод LUT неоднократно описывался в Интернете, и освоить его не так уж и сложно. Несколько фото процесса:
Если у вас нет под рукой принтера, вы можете нарисовать печатную плату маркером или краской, потому что она довольно маленькая. После просверливания отверстий доску необходимо залудить, чтобы предотвратить окисление медных дорожек.
После изготовления платы можно приступать к пайке деталей внутри нее. Сначала припаиваются мелкие компоненты — резисторы, диоды. Дальше конденсаторы, микросхемы и все, что между ними. Провода могут быть впаяны непосредственно в плату или подключены к плате через клеммные колодки. Я вывел силовые контакты и контакты OUT для подключения реле через клеммные колодки и припаял кнопку прямо к плате на паре проводов.
Таким образом, эта плата может быть интегрирована в любое устройство, будь то усилитель, самодельная лампа или что-либо еще, для чего требуется только одна кнопка для включения и выключения без блокировки. В сети много других подобных схем, построенных на советских микросхемах, транзисторах, но именно в этой схеме используется микросхема NE555, которая зарекомендовала себя как наиболее простая и в то же время надежная.
Некорректное подключение кнопки
Чтобы подключить нормально открытую кнопку часов к Arduino, вы можете сделать самый простой способ: подключить один свободный провод кнопки к источнику питания или заземлению, а другой — к цифровому выводу Arduino. Но в целом это неверно. Дело в том, что в моменты, когда кнопка не закрыта, на цифровом выходе Arduino появятся электромагнитные помехи и по этой причине возможны ложные срабатывания.
Неправильное подключение кнопки к Arduino
Чтобы избежать наводки, цифровой вывод обычно подключается через достаточно большой резистор (10 кОм) к земле или источнику питания. В первом случае это называется «цепью подтягивающего резистора», во втором — «цепью подтягивающего резистора». Давайте разберемся с каждым из них.
Дребезг контактов
Кнопка — это очень простое и полезное изобретение, которое служит для лучшего взаимодействия человека с технологиями. Но, как и все в природе, не идеально. Это проявляется в том, что при нажатии на кнопку и при отпускании происходит т.н. «Отскок» («отскок» на английском языке). Это многократное переключение состояния кнопки за короткий период времени (порядка нескольких миллисекунд), прежде чем она перейдет в устойчивое состояние. Это нежелательное явление возникает в момент переключения кнопки из-за эластичности материалов кнопки или из-за микроискр, возникающих при электрическом контакте.
Отскок контакта при нажатии и отпускании кнопки
В следующей статье подробно описаны основные способы борьбы с «дребезгом» при закрытии и открытии контактов. А пока давайте рассмотрим варианты подключения кнопки к Arduino.
Инструкция по подключению кнопки
Платформы включают тактильные кнопки Arduino, состоящие из переключателя с 2 парами соединенных между собой контактов. Эта система не позволяет создавать более 1 коммутатора, но позволяет управлять 2 параллельными сегментами одновременно.
Без резистора
Перед подключением обратите внимание на размыкающие контакты. По бокам квадратного датчика расположены 2 ножки, а в центре ножек создан переключатель. Для включения датчика нужно соединить 2 контактами как можно ближе друг к другу. Остальные 2 будут повторять первую пару.
С использованием подтягивающего резистора
В этой схеме датчик поднимается резистором на «плюс» и замыкает вход на «землю». Чтобы сопротивление работало правильно, добавьте сопротивление 10 кОм, при таком значении оно сможет притягивать контакт к «земле».
Есть 3 провода для подключения к платформе. Присоедините первую к одной из ножек, проложите резистор и заземлите. Следующий подключите ко второй ноге, к выводу Arduino с напряжением 5 вольт. Подключите последний к третьему, который не имеет контакта ни с одним из двух предыдущих, и подключите его ко второму цифровому устройству, которое будет считывать состояние кнопки.
На эскизе этой схемы нажатая кнопка обозначена как LOW, а кнопка, которая вернулась в исходное (отпущенное) положение, обозначена как HIGH.
В режиме input-pullup
Это позволяет обойтись без резистора при подключении и работе. В этом случае используется внутреннее сопротивление самой платы. Чтобы написать алгоритм, вам нужно определить контакт, к которому вы собираетесь подключить кнопку, как INPUT_PULLUP.
Существует альтернативная версия, в которой вывод OUTPUT может использоваться вместо указанной команды.
Аналоговые клавиатуры
Аналоговые клавиатуры — довольно глубокая тема, достойная отдельного урока (у меня его пока нет). Более подробный урок доступен на сайте Codius.
Видео
Включение-выключение с помощью кнопки
Есть несколько вариантов включения и выключения:
- светодиод загорается при нажатии кнопки, гаснет при отпускании;
- светодиод загорается при нажатии, гаснет при повторном нажатии;
- светодиод загорается при длительном нажатии;
Для этих диаграмм вы можете использовать один и тот же скетч, внося только изменения в код.
Дребезг кнопки ардуино
В процессе работы с кнопками мы можем столкнуться с очень неприятным явлением, которое называется подпрыгиванием кнопок. Как следует из названия, это явление вызвано дребезгом контактов внутри кнопочного переключателя. Металлические пластины соприкасаются не мгновенно (хотя и очень быстро для нашего глаза), поэтому на короткое время в зоне контакта появляются скачки и провалы напряжения. Если мы не ожидаем появления таких «мусорных» сигналов, то мы будем реагировать на них каждый раз и сможем забрать свой проект домой.
Для устранения дребезга используются программные и аппаратные решения. Вкратце упомянем только основные методы подавления отскока:
- Добавьте в скетч паузу в 10-50 миллисекунд между получением значений от вывода Arduino.
- Если мы используем прерывания, то программное обеспечение metd не может быть использовано, и мы формируем аппаратную защиту. Самый простой из них — RC-фильтр с конденсатором и резистором.
- Для более точного подавления дребезга используется аппаратный фильтр, использующий триггер Шмидта. Такой вариант позволит получить на входе ардуино сигнал практически идеальной формы.
Дополнительные сведения о том, как обрабатывать отказы, см. В этой статье о том, как обрабатывать отказы кнопок.
Как переключать режимы кнопкой
Переключение между несколькими режимами осуществляется путем установки другого переменного режима. Его значение изменится при следующем нажатии на сенсор управления.
В некоторых ситуациях придется менять саму проводку.
Алгоритмы
Отработка нажатия
В большинстве реальных приложений работа с текущим состоянием кнопки очень неудобна, например, когда действие необходимо выполнить один раз при нажатии кнопки, например, при нажатии. Немного усложним конструкцию, добавив флаг, который будет запоминать состояние кнопки. Этот дизайн позволяет отслеживать нажатие и отпускание кнопки и реагировать на них один раз:
Дребезг контактов
Кнопка не идеальна и контакт не замыкается сразу, какое-то время «гремит». Запустив этот алгоритм, система запрашивает кнопку и условия примерно за 6 мкс, то есть кнопка запрашивается 166666 раз в секунду! Этого достаточно, чтобы сгенерировать несколько тысяч ложных срабатываний.
Устранить дребезг контактов можно как аппаратно, так и программно: аппаратно проблема решается за счет использования RC-цепи, то есть резистора (~ 1-10k) и конденсатора (~ 100nF). Похоже на то:
Программно вы можете ввести простейший таймер для нажатия, основанный на миллис (), время дребезга будет принято за 100 миллисекунд. Вот как будет выглядеть код:
Мы, конечно, рекомендуем использовать аппаратный метод, так как он не нагружает ядро лишними вычислениями. В 99,99% проектов программной защиты от отказов будет достаточно, поэтому смело используйте конструкцию millis().
“Импульсное” удержание
В устройствах с кнопочным управлением очень часто необходимо иметь возможность изменять значение либо одним щелчком по кнопке, либо «автоматически» с тем же шагом, удерживая его. Этот вариант реализован очень просто путем добавления еще одного условия к нашему предыдущему алгоритму, а именно: если кнопка была нажата, но еще не отпущена, и прошло больше времени, чем указано, условие вернет истину. В следующем примере частота «щелчков» при удерживании установлена на 500 миллисекунд (2 раза в секунду):
Непосредственно использовать этот код будет неудобно, чтобы можно было «обернуть» его в класс.
Простейший класс кнопки
Вот как предыдущий пример можно превратить в класс (мы сделали это в этом уроке), поместить его в отдельный файл (button.h) и использовать:
Другие возможности кнопки
Кнопка выглядит как простое устройство, дающее 0 и 1, но, соединив воображение и время, вы можете найти гораздо больше применений для обычной кнопки. В моей библиотеке GyverButton реализовано много интересных возможностей для работы с кнопкой, вот список:
- Работа с нормально закрытыми и нормально открытыми кнопками
- Работа с подключением PULL_UP и PULL_DOWN Опрос кнопки с программным обеспечением противодействия (настраиваемое время)
- Тренируйтесь нажимать, удерживать, отпускать, нажимать кнопку (+ настройка тайм-аута)
- Практикуйте одиночные, двойные и тройные жимы (выполняются отдельно)
- Обработка любого количества мер (функция возвращает количество мер)
- Функция изменения значения переменной с заданным шагом и заданным временным интервалом
- Возможность работы с «виртуальными» кнопками (все функции библиотеки используются для матричных и резистивных клавиатур)
Подробное описание библиотеки можно прочитать в заголовочном файле на странице библиотеки, там тоже много примеров.
Материалы
Для сборки схемы вам потребуются:
- Микросхема NE555 — 1 шт.
- Транзистор BC547 — 1 шт.
- Конденсатор 1 мкФ -1 шт.
- Сопротивление 10 кОм — 2 шт.
- Сопротивление 100 кОм — 1 шт.
- Сопротивление 1 кОм — 2 шт.
- Кнопка мгновенного действия — 1 шт.
- Диод КД521 — 1 шт.
- Светодиод 3В — 1 шт.
- Реле — 1 шт.
Кроме того, потребуется паяльник, флюс, пайка и умение собирать электронные схемы. Электронные компоненты стоят почти копейки и продаются в любом магазине радиодеталей.
Обработка короткого нажатия на кнопку
Прежде всего мы назовем контакты, к которым подключены элементы схемы, и создадим различные переменные, которыми можно будет управлять, нажимая кнопку и сохраняя состояние светодиодов. Затем в функции void Setup () мы настраиваем выводы светодиода как выходы, а кнопки как входы.
Первая строка включает и выключает зеленый светодиод, руководствуясь логической переменной Green_LED, в которой хранится его статус. Затем микроконтроллер считывает состояние кнопки: нажата или отпущена.
Далее у нас есть два условия. В первом условии код выполняется, если кнопка нажата, но не была нажата ранее. Второе условие будет выполнено, если кнопку отпустить.
Следовательно, при нажатии кнопки код первого условия будет выполнен один раз, так как переменная press_flag изменит свое значение на false только после того, как кнопка будет отпущена.
После загрузки скетча на Arduino светодиод будет включаться и выключаться при кратковременном нажатии кнопки.
Читайте также: Схема умного дома своими руками: бюджетное проектирование и описание идеи