Резистивные кнопки Arduino: подключение 10+ кнопок к одному аналоговому пину
В проектах Arduino часто не хватает цифровых пинов для подключения множества кнопок. Обычный способ требует по пину на кнопку плюс подтягивающие резисторы. Для 10 кнопок — 10 пинов, что критично, если нужно подключить дисплей, датчики или реле. Резистивный (аналоговый) метод решает проблему: все кнопки на один аналоговый вход (A0). Каждая кнопка создаёт уникальное напряжение через делитель. Arduino читает analogRead() и определяет нажатие. Метод экономит пины, подходит для пультов, кодовых замков, меню. Но имеет минусы: погрешность резисторов ±5–10%, плавающие значения из-за шума АЦП, зависимость от стабильности питания. Разберём схемы, расчёты, калибровку, код, плюсы и минусы.
Последовательная схема подключения
В последовательной схеме кнопки и резисторы соединены цепочкой. Верхний резистор (10–47 кОм) подтягивает к +5 В. Каждая кнопка замыкает цепь после определённого количества резисторов (по 1 кОм). При нажатии меняется общее сопротивление нижнего плеча делителя. Преимущество — простота. Минус — одновременное нажатие не обрабатывается, только одна кнопка. Идеально для меню или последовательного ввода.
Параллельная схема подключения
В параллельной схеме каждая кнопка с собственным резистором (разные номиналы) подключена параллельно к A0. Подтягивающий резистор общий. При нажатии резистор кнопки подключается параллельно подтягивающему. Позволяет обрабатывать комбинации нажатий — каждое сочетание даёт уникальное значение. Минус — сложнее расчёт, больше резисторов с точными номиналами. Кнопка без резистора всегда доминирует (коротит на GND).
Сравнение с матричной клавиатурой
Матричная клавиатура использует сетку строк и столбцов (4×4 = 16 кнопок на 8 пинах). Требует сканирования, обработки отскоков, но надёжнее резистивного — нет аналоговых погрешностей. Резистивный выигрывает в экономии пинов (1 vs 8), но проигрывает в стабильности. Для больших клавиатур матрица лучше, для простых — резистивный эксперимент.
Одновременное нажатие в параллельной схеме
Параллельная схема позволяет нажимать 2+ кнопки — общее сопротивление меняется, давая новое значение. Например, две кнопки с 1 кОм и 2 кОм — эквивалент 667 Ом. Обработайте в коде как комбинацию. Исключение — кнопка без резистора: она коротит всё на 0, игнорируя другие.
Формула расчёта и точность АЦП
АЦП Arduino 10-битный (0–1023, шаг 4,88 мВ при 5 В). Формула: Uвых = 5 * Rниж / (Rверх + Rниж). analogRead = Uвых / 0,00488. Используйте прецизионные резисторы 1% для стабильности. Погрешность ±5% даёт разброс ±20–50 единиц.
Калибровка: сбор значений
Запустите Serial.print(analogRead(A0)); delay(500);. Нажимайте каждую кнопку, записывайте диапазоны (плавают ±10–30). Без нажатий — 1023. Добавьте усреднение (читайте 10 раз, берите среднее) для снижения шума.
Запись диапазонов и код
Выпишите минимальные/максимальные значения для каждой кнопки. В коде используйте if (val > min && val < max) { // действие }. Добавьте антидребезг delay(50).
Готовая клавиатура на плате
Собрана плата на 10 кнопок с двухцветным LED для индикации. Подходит для замков, но из-за плавающих значений ненадёжно. Добавьте стабилизатор питания для улучшения.
Заключение
Резистивный метод — хитрый способ экономии пинов, но для экспериментов. Разброс резисторов, шум, просадки — делают его ненадёжным для >5 кнопок. Альтернативы: 74HC165 (8 кнопок на 3 пина), PCF8574 (I2C, 8–16 пинов), матрица (16 кнопок на 8 пинах). Выбирайте по задаче.