Резистивная клавиатура для Arduino: пять кнопок на одном аналоговом входе
Пять кнопок, четыре резистора и один вход A0: каждая кнопка даёт своё напряжение, а скетч по числу с АЦП узнаёт, какая нажата.
Содержание
Пять кнопок можно подключить к одному аналоговому входу Arduino через цепочку резисторов: каждая кнопка даёт на входе своё напряжение, а скетч по значению АЦП узнаёт, какая нажата. Нужны подтягивающий резистор 10 кОм, четыре резистора цепочки (1, 2, 4,3 и 10 кОм) и пять кнопок.
Напряжения на входе получаются такими: 0, 0,45, 1,15, 2,11 и 3,17 В, а без нажатия — 5 В. Главное ограничение: нажатой может быть только одна кнопка.
Выводов у Arduino всегда не хватает: пять кнопок отнимут пять входов. Между тем у платы есть аналоговый вход, который различает сотни уровней напряжения.
Ниже — как устроена схема, расчёт напряжений и порогов, скетч, ограничения и ошибки.
Идея

Резистор R0 подтягивает вход A0 к 5 В. От входа вниз идёт цепочка резисторов, а кнопки подключают к её узлам.
Пока кнопки отпущены, на входе почти 5 В (значение АЦП 1023). Нажали кнопку — вход подключился к земле через часть цепочки, получился делитель напряжения, и напряжение зависит от того, какая кнопка нажата.
Расчёт
Сопротивление до земли для кнопок: 0, 1, 3, 7,3 и 17,3 кОм (это суммы R1, R1 + R2, R1 + R2 + R3 и R1 + R2 + R3 + R4). Напряжение на входе: U = 5 В · Rк / (Rк + R0), где R0 = 10 кОм.
Значение 10-разрядного АЦП: N = 1023 · Rк / (Rк + R0).
| Кнопка | Rк, кОм | U, В | N (АЦП) | Порог (N меньше) |
|---|---|---|---|---|
| SB1 | 0 | 0 | 0 | 45 |
| SB2 | 1 | 0,45 | 93 | 165 |
| SB3 | 3 | 1,15 | 236 | 335 |
| SB4 | 7,3 | 2,11 | 432 | 540 |
| SB5 | 17,3 | 3,17 | 648 | 835 |
| нет нажатия | — | 5 | 1023 | — |
Пример: для SB4 U = 5 · 7,3 / 17,3 ≈ 2,11 В, а N = 1023 · 7,3 / 17,3 ≈ 432. Между значениями хорошие промежутки, поэтому пороги ставим по серединам: 45, 165, 335, 540, 835.
Считать делитель проще калькулятором делителя напряжения, а связь тока и сопротивления — калькулятором закона Ома.
Что известно из даташита АЦП
Данные — из даташита Microchip на ATmega328P.
- Разрядность.10-разрядный АЦП, шаг 5 В / 1024 ≈ 4,9 мВ.
- Погрешность.±2 LSB абсолютная, то есть около ±10 мВ.
- Источник сигнала.АЦП рассчитан на сигналы с выходным сопротивлением примерно 10 кОм или меньше.
- Тактовая частота АЦП.От 50 до 200 кГц для максимального разрешения; обычное преобразование занимает 13 тактов АЦП.
В нашей схеме максимальное сопротивление источника — у нажатой SB5: R0, включённый параллельно 17,3 кОм, даёт около 6,3 кОм, то есть меньше 10 кОм. Без нажатия оно равно R0, 10 кОм.
Допуск резисторов

С резисторами 5 % значения укладываются в пороги. Расчёт для худших случаев: у SB4 при допуске 5 % получается примерно от 407 до 457, а пороги 335…540; у SB5 — от 624 до 672 при порогах 540…835.
Для узких порогов берите резисторы 1 %.
Скетч
Код рассчитан на Arduino IDE 2 и штатные функции, библиотеки не нужны.
const uint8_t PIN_KEYS = A0;
// возвращает номер нажатой кнопки 1–5, 0 — ничего не нажато
uint8_t readKey() {
int val = analogRead(PIN_KEYS);
if (val < 45) return 1;
if (val < 165) return 2;
if (val < 335) return 3;
if (val < 540) return 4;
if (val < 835) return 5;
return 0;
}
void setup() {
Serial.begin(9600);
}
void loop() {
int raw = analogRead(PIN_KEYS); // сырое значение — пригодится для настройки порогов
Serial.print(readKey());
Serial.print(' ');
Serial.println(raw);
delay(50);
}
Как проверить и настроить

Проверка занимает несколько минут.
- Загрузите скетч.Откройте монитор порта на 9600 бод.
- Проверьте покой.Без нажатий будет
0 1023. - Нажмите каждую кнопку.Должны появляться номер и значение АЦП, близкие к таблице.
- Подправьте пороги.Если ваши резисторы отличаются, поставьте пороги по серединам между вашими значениями.
Сырое значение выводится специально: по нему настраивают пороги под реальные резисторы.
Ограничения
У схемы есть четыре ограничения.
- Одна кнопка.Нажатой может быть только одна. Две сразу дадут напряжение, по которому скетч решит, что нажата совсем другая.
- Допуск резисторов.При узких порогах берите резисторы 1 %.
- Дребезг контактов.На аналоговом входе он выглядит как скачки значения: игнорируйте чтения, которые повторились меньше нескольких раз подряд.
- Игровые пульты.Там, где кнопки жмут вместе, схема не годится.
Если нужны комбинации кнопок, возьмите другую схему.
Типовые ошибки
- Не подтянут вход резистором R0.Без нажатия значение «плавает».
- Слишком близкие номиналы.Пороги перекрываются.
- Пороги взяты с чужого модуля.У вас другие резисторы.
- Ждали, что несколько кнопок работают вместе.Схема различает только одну.
- Большое сопротивление источника.При R0 заметно выше 10 кОм точность АЦП падает.
- Не учтён дребезг.Вместо одного нажатия приходит несколько.
Где пригодится сегодня
Меню на LCD-шилде, пульт управления для самодельных приборов, панель из нескольких кнопок на контроллере с малым числом выводов. Готовые шилды с LCD и пятью кнопками работают именно так.
Что в итоге
Подходит: меню и выбор режима, где кнопки жмут по одной. Не подходит: клавиатуры и игровые пульты с одновременным нажатием — тогда используйте матрицу кнопок или расширитель на PCF8574.
Выбор платформы — в статье «ESP32 или Arduino Uno». Ещё проекты на Arduino: часы на DS3231 и обороты кулера.
Частые вопросы
Сколько кнопок можно подключить к одному входу?
Столько, сколько различимо по напряжению. В этой схеме пять, со значениями АЦП 0, 93, 236, 432 и 648.
Каждая дополнительная кнопка уменьшает промежутки. Учтите погрешность АЦП ±2 LSB и допуск резисторов.
Можно ли нажимать две кнопки одновременно?
Нет. Две сразу дают напряжение, по которому скетч решит, что нажата совсем другая кнопка.
Для комбинаций используйте матрицу кнопок или расширитель на PCF8574.
Как рассчитать свои номиналы?
Выберите R0 около 10 кОм. Для каждой кнопки задайте сопротивление до земли Rк так, чтобы значения N = 1023 · Rк / (Rк + R0) различались как можно больше.
Пороги поставьте по серединам между соседними значениями. Расчёт делителя — в калькуляторе.
Работают ли готовые шилды с LCD и кнопками так же?
Да: пять кнопок на одном аналоговом входе. Такие шилды продаются в российских магазинах радиодеталей.
Номиналы резисторов на шилде могут отличаться, поэтому пороги настраивайте по значениям из монитора порта.
Как использовать схему с ESP32?
Пересчитайте значения: у ESP32 12-разрядный АЦП и питание 3,3 В, поэтому N = 4095 · Rк / (Rк + R0), а R0 подтяните к 3,3 В.
Выводы ESP32 нельзя подключать к 5 В. Подробнее — в статье «ESP32 или Arduino Uno».
Полезно при расчёте
Что понадобится
| Обозначение | Номинал | Тип | Кол-во |
|---|---|---|---|
| — | Arduino Uno | или любая плата с АЦП | 1 |
| R0 | 10 кОм | подтяжка к +5 В | 1 |
| R1 | 1 кОм | 1 | |
| R2 | 2 кОм | 1 | |
| R3 | 4,3 кОм | 1 | |
| R4 | 10 кОм | 1 | |
| SB1–SB5 | кнопки | без фиксации | 5 |

























