Подключение кнопок к ардуино.

Подключение кнопок к ардуино.

 

Сегодня я покажу как подключить кнопки к Ардуино. В качестве примера я буду использовать 3 кнопки и 3-цветный RGB светодиод. Это видео будет практическое. Здесь я постараюсь выложить как можно больше примеров. Если вас интересует теория, то советую посмотреть вот это видео, а так же на канале есть видео про подключение сенсорной кнопки и самодельной резистивной клавиатуры.

Рассмотрим примеры.
1.    Простое включение каждого цвета светодиода своей кнопкой.
2.    Кнопка с фиксатором состояние (delay)
3.    Кнопка с фиксатором состояние(millis)
4.    Используя Флаг. Включаем/Выключаем
5.    При долгом нажатии включаем Красный, при коротком Синий.

У меня есть ещё много примеров, но они в основном относятся 
к миганию светодиодов. Поэтому это следующая тема. 


Что такое кнопки и какие они бывают
Как управляя 1 кнопкой включать или выключать светодиод
Напишем скетч плавного управления яркостью светодиода
Работа с библиотекой кнопок
Управление разными устройствами всего 1 кнопкой.

подключение кнопки к Ардуино

Сначала определение кнопки.
Так что же такое кнопка?
Кнопка – это простейшее электромеханическое устройство, замыкающее и размыкающее электрическую цепь.

В своих примерах и проектах мы будем часто использовать кнопки. Поэтому лучше 1 раз рассказать сейчас, чем постоянно объяснять как подключать кнопки, что такое внутренняя подтяжка и для чего нужны подтягивающие резисторы.

Рассмотрим 3 схемы подключения кнопок.
Верхняя подтяжка или pull-up. 
Один вывод кнопки подключается к минусу, а другой через резистор 10кОм подключается к плюсу питания.
Если кнопка не нажата, то на цифровом входе высокий уровень. 
Нижняя подтяжка или pull-down. Один вывод кнопки подключается к плюсу питания. а другой через резистор 10кОм подключается к земле. Получается, что если кнопка не нажата, то на цифровом входе низкий уровень.
   
Есть ещё внутренняя подтяжка - Internal PULL-UP. Подтягивающий резистор подключается программно и имеет 20 кОм.
Сопротивление резистора может быть от 5 до 20 кОм. При этом надо знать, что чем меньше сопротивление, тем больший ток протекает через него и тем сильнее он будет нагреваться. Чем выше сопротивление, тем меньше напряжение. В Ардуино низкий уровень - это напряжение меньше 2 вольт. Высокий уровень - это напряжение выше 3 вольт.
Поэтому в основном применяют резисторы номиналом 10кОм.
Подключать кнопку без резистора, внутреннего или внешнего не правильно. Если кнопка не нажата, у вас может быть ложные срабатывания, так как на входе Ардуино будет случайное состояние.

Я в своих примерах буду использовать внутреннюю подтяжку. Это облегчает работу, уменьшает размер и мы немного сэкономим на деталях.
Теперь буквально 2 слова об основной проблеме кнопок. Это дребезг контактов. 
И чем старея кнопка, тем хуже контакт.
Механические контакты в кнопках никогда не замыкаются и не размыкаются мгновенно. 
В течении нескольких миллисекунд происходит многократное замыкание и размыкание контактов — в итоге на микроконтроллер поступает не один сигнал, а серия импульсов. Самый простой способ избавиться от этого применить задержку в несколько миллисекунд используя, на пример функцию delay.
Можно также использовать конденсатор небольшой ёмкостью, параллельно контактам кнопки.

Ну а теперь переходим к примерам. Я буду использовать 3 кнопки, а смотреть результат будем с помощью RGB светодиода. Это светодиод который может светиться как по отдельности красным, зелёным и голубым, так и смешанным из этих трёх цветов оттенком.

Теперь посмотрим примеры работы с кнопкой.
1.    Простое включение каждого цвета светодиода своей кнопкой.
Это самый простой пример. Я привёл его для того, чтобы показать и рассказать про переменные которые будут использованы во всех последующих примерах.
На камеру не очень хорошо видны цвета. При нажатии на первую кнопку загорается Красный цвет, вторую Зелёный, третью Голубой.

Рассмотрим скетч.
Хотя я не знаю, есть ли смысл рассказывать. Я постарался и прокомментировал каждую строку кода.
В начале указано к каким пинам Ардуино подключены кнопки и светодиод. Вот схема подключения. Если что не понятно, спрашивайте в комментариях.
Дальше идут переменные для хранения текущего состояния кнопки. Они могут иметь только 2 значения Ноль или Единица. По другому можно сказать LOW или HIGH, а ещё это false или true.
Это всё одно и тоже. 
Для экономии памяти я указал тип переменной Boolean. Это однобайтовый тип. Соответственно занимает всего 1 байт памяти.
Здесь указываем, что светодиоды работают на Выход, поэтому указаны как Output, а кнопки принимают внешнее нажатие, поэтому работают на Вход. И так как я не использовал внешний подтягивающий резистор, то подключил внутренний. Про это я рассказывал. 
Считываем значения с кнопок и присваиваем его переменным, для удобства работы. Можно было бы этого и не делать, но так правильнее.
Теперь проверяем нажата ли кнопка. Так как кнопка у нас подключена к земле, то и при нажатии она будет иметь значение LOW. Так вот при нажатии включаем светодиод определённого цвета, при отпускании светодиод погаснет.
Дальше я не буду рассказывать так подробно. Расскажу только то , что в коде будет нового.

2.    Кнопка с фиксатором состояние (delay)
В первом примере чтобы светодиод светился мне надо было держать кнопку нажатой, что согласитесь, довольно неудобно. Давайте немного изменим скетч и сделаем так, чтобы при нажатии кнопки светодиод загорался, а при повторном нажатии гас. А ещё мы добавим в код инверсию. Это позволит уменьшить количество строчек кода. 
Давайте посмотрим сам скетч. В первой части кода, я ничего не менял, так. Что пропускаем и идём дальше.
Здесь я изменил способ зажигания светодиода. Теперь светодиод проверяет своё состояние и если он сейчас горит, то при нажатии на кнопку он выключится . И наоборот.
И для устранения дребезга кнопки, я добавил delay. Это конечно не очень хорошо, но для простых проектов иногда это бывает очень даже не плохо. Главное, просто и быстро. В следующем примере избавимся от delay.
Вы можете сравнить, что было и что стало.

3.    Кнопка с фиксатором состояние(millis)
В работе вы отличий от предыдущего примера не увидите, но отличия есть и очень большие. В прошлом примере для паузы я использовал функцию delay. Она плоха тем, что при её использовании мы полностью тормозим микроконтроллер и не даём дальше выполняться программе, пока не закончится время установленное в delay. Если в программе много пауз и они большие, то можно полностью привести свой код в не рабочий. Поэтому я в этом примере применил функцию millis.
millis - Возвращает количество миллисекунд с момента начала выполнения программы.  

Здесь нас интересует только вот этот блок. Я создал переменные для хранения прошедшего времени. Так как значения могут быть очень большими, то и переменные тоже должны быть способны сохранить такие значения.
А здесь устанавливаем задержку от дребезга. Я установил в 300 миллисекунд, но теперь это не важно, так как программа тормозить не будет. Хотя с таким значением, вы не сможете включить светодиод чаще чем 0.3 секунды.

При нажатии кнопки, происходит проверка текущего времени минус сохранённое время. Если разность больше чем время паузы, то Зажигаем или Гасим светодиод.
И изменяем переменную времени на текущее состояние.

4.    Используя Флаг. Включаем/ВыключаемПри работе с кнопками часто используют переменные, которые можно назвать флаг. Это как наверное видели в западных фильмах, когда приходит почтальон и поднимает или опускает флажок в почтовом ящике.
Вот это типа такого же.
Если вы нажали кнопку, то у вас сработает переменная флаг и изменит своё значение, и пока вы не отпустите кнопку значение останется неизменным. Дальше в скетче я покажу как это работает.
Создаём ещё 3 переменные, по количеству кнопок. Тип переменных тоже будет Boolean, то есть однобайтовые, так как переменная будет хранить значение 0 или 1.
Теперь если кнопка нажата и флаг равен 0, то условие верно, светодиод загорится или погаснет, а флаг изменит своё состояние на 1.
При отпускании кнопки, флаг снова станет равен 0 и будет ждать новое нажатие кнопки.

5.    При долгом нажатии включаем Красный, при коротком Синий.
Давайте сделаем что-нибудь посложнее. Например, управление одной кнопкой двумя светодиодами.
При коротком нажатии должен загораться синий светодиод, а при длительном нажатии красный. Светодиоды могут гореть одновременно, и управляться каждый по отдельности. При работе красного светодиода можно управлять работой синим. Нажимая коротко на кнопку. А при горящем синим светодиоде если нажать и удерживать кнопку, то загорится ещё и красный.

Я специально вывел результат ещё и в монитор порта, чтобы видеть как изменяются значения счётчика. 
В скетче я оставил всего 1 кнопку и два цвета светодиода. Красный и синий. 

Установить длительность нажатия можно изменив значение в переменной Time Push.
При нажатой кнопке начинает считать счётчик. До значения из переменной. Если отпустить кнопку, то счётчик сбросится. Если значение дошло до нужного, то выполнится условие и загорится красный светодиод.

Если вам нравятся мои видеоуроки, то вы можете подписаться на них, и незаб+удьте нажать на колокольчик, так вы непроп+устите следующее видео. В комментариях вы можете написать какие темы вы бы ещё хотели увидеть. Если желающих будет достаточно много, то я могу снять видео на эту тему.
Вы видите ссылки на видео, которые, я думаю будут вам интересны. Перейдя на любое из этих видео вы узнаете что-то новое, а ещё поможете мне. Ведь любой ваш просмотр - это знак YOUTUBE, что это кому-то интересно и что его надо показывать чаще.
Спасибо.
А пока на этом всё.