Резистивные кнопки

Сегодня мы продолжим рассматривать ситуацию нехватки выводов на плате Ардуино.
Предыдущее видео было про использование сдвигового регистра 74HC165.
Если подключать обычным способом 10 кнопок, то нам понадобятся 10 входов на Ардуино, а ведь ещё надо управлять чем нибудь.
Так что этот вариант нам не подходит. 
Бывает 2 вида подключения. Последовательное и параллельное.

Последовательное подключение.

Последовательное подключение кнопок

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

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

Видите, задействован всего 1 вход Ардуино. 

Можно подключить матричную клавиатуру, но это тоже займёт много контактов.
Матричная клавиатура
Подключая кнопки по резистивной, или по-другому, аналоговой схеме, мы займём всего лишь 1 вход на Ардуино.
И подключать можно огромное количество кнопок. В пределах разумного, конечно.
Для тех, кто досмотрит видео до конца, я расскажу своё личное мнение от использования этого метода.

При параллельном подключение есть возможность обрабатывать нажатие сразу нескольких кнопок.

Параллельное подключение 2-х кнопок
Исключением является только кнопка без резистора. Если вы нажмёте несколько кнопок, но одна из них будет без резистора, то значением всегда будет ЭТА КНОПКА.

Мы сегодня будем использовать последовательное подключение.

Номиналы резисторов могут быть любыми.
Я в этом примере буду использовать 1 резистор на 10 кОм и 9 резисторов по 1 кОм.
Подключать кнопки будем к аналоговому порт А0, но можно к любому аналоговому порту Ардуино.
Arduino на своём аналоговом входе проводит измерение напряжения.
АЦП Arduino имеет разрешение 10 бит, т.е. позволяет выводить значения в десятичном виде от 0 до 1023.
В относительных единицах деление шкалы  5/1024 = 4.9 мВ
Вот с такой точностью можно проводить измерения.

В примере я использовал внешнюю подтяжку к 5 вольтам.
Кто не понимает о чём я, посмотрите видео про кнопки на моём канале, там очень подробно всё объяснено.
Если ни одна кнопка не нажата, то на входе А0 высокий уровень, то есть 5 вольт или максимальное значение - 1023.
Если мы нажимаем 1 кнопку, это та, что без резистора на вход А0 поступает низкий уровень, а значение с 1023 меняется на 0.
Данные могут немного отличаться от идеала. Это зависит от точности резистора, обычно это 5– 10 %, и от напряжения питания.
Вторая кнопка подключена через резистор 1 кОм. При нажатии на неё, у нас срабатывает резистивный делитель, делитель напряжения.
С одной стороны 10 кОм – это верхнее плечо делителя, оно будет постоянное,
 с другой 1 кОм – это нижнее плечо делителя, оно будет меняться в зависимости от нажатой кнопки.
Рассчитать получаемое значение можно по формуле, 

Формула делителя напряжения

а можно просто посмотреть в мониторе порта. Правда там будет не напряжение, а значение от 0 до 1023.
Получившееся значение можно умножить на 0,49 и получить напряжение.
Например.
Если у вас значение 512, то 512 * 0.49/100 = то получится 2,5 вольта.
x=(511*0,49)/100

При нажатии различных кнопок на вход Ардуино будут поступать разные значения.
а значение функции analogRead() будет зависеть от нажатой кнопки.
Так как чем больше номер кнопки, тем больше резисторов будут подключены, и тем больше будет их общее сопротивление.

Возьмём пример из самой программы Ардуино.
analogRead()

Только немного увеличим delay, что бы значения не так часто менялись.
При включении, когда ещё не нажата ни одна кнопка, мы видим максимальное значение 1023.
Это, потому что кнопки у нас притянуты к плюсу питания, а именно к + 5 вольт.
Нажимаем кнопку 1 и не отпускаем. Смотрим массив значений и выбираем максимальное из них.
Так же проделываем для всех кнопок.
В основном максимальное значение появляется при первом срабатывании кнопки.
Как видите значения не всегда одинаковые.
Они постоянно меняются. Один из вариантов почему это происходит это питание.
Если подключить большую нагрузку, то просадка напряжения будет заметнее.
Это один из вариантов почему я бы не советовал использовать резистивный метод подключения кнопок.
Затем выписываем эти значения в блокнот
значения из блокнота

У меня вот такие значения, у вас будут другие.
Теперь у нас всё готово для написания скетча работы с 10 кнопками. 
Давайте посмотрим пример.

Для работы я спаял вот такую плату на 10 кнопок.
плата с резистивными кнопками
Ещё я добавил двухцветный светодиод, так как хотел использовать эту клавиатуру в примере кодового замка, но понял, что мне этот вариант не подходит. Потом объясню почему.

А вот теперь моё личное мнение.
Когда я только начал собирать схему я был доволен.
Ведь на 1 контакт можно подключить кучу кнопок и сделать целую клавиатуру. 
НО.
Я бы не стал применять этот метод не только в серьёзных разработках, но и в самых простых, любительских.
Во-первых, подбор резисторов.
У них очень большой разброс значений. 
Возьмём мой пример с резисторами 1 кОм.
Один резистор был 980 Ом, а другой 1,1 кОм. Вы просто замучаетесь подбирать значения.
На делителе напряжения будут разные границы между соседними кнопками. Где-то значения в 100 единиц, а где-то 20, и вам будет сложно написать условия срабатывания.
Второе это питание.

Так как постоянно идёт сравнение с исходным напряжением, а оно может скакать, то и значения у вас будут постоянно разными – это тоже создаст большие трудности.
При количестве кнопок до 5 штук ещё можно написать нормально работающий код, а вот больше – это очень сложно.
Но повторяю – это лишь моё мнение.
Я бы лучше применил сдвиговый регистр 74HC165 видео работы есть на канале. Он избавлен от всех этих недостатков.

Дополнительные материалы по теме
Подключение кнопки к ардуино
TTP223 сенсорная кнопка
Резистивные кнопки
Управление одной кнопкой на ESP
Первая программа на Arduino. Aрдуино для начинающих
Digital Read Arduino
Управление светодиодами кнопкой на Ардуино
Кнопка, дребезг контактов при нажатии
Analog Read Arduino