ПроектОпубликовано 7 октября 2025 · обновлено 9 октября 2026

Резистивная клавиатура для Arduino: пять кнопок на одном аналоговом входе

Пять кнопок, четыре резистора и один вход A0: каждая кнопка даёт своё напряжение, а скетч по числу с АЦП узнаёт, какая нажата.

Уровень
Есть опыт
Понадобится
МультиметрПаяльник
Время сборки: вечерСложность: простаяДеталей: 11Питание: 5 В от Arduino
Содержание

Пять кнопок можно подключить к одному аналоговому входу Arduino через цепочку резисторов: каждая кнопка даёт на входе своё напряжение, а скетч по значению АЦП узнаёт, какая нажата. Нужны подтягивающий резистор 10 кОм, четыре резистора цепочки (1, 2, 4,3 и 10 кОм) и пять кнопок.

Напряжения на входе получаются такими: 0, 0,45, 1,15, 2,11 и 3,17 В, а без нажатия — 5 В. Главное ограничение: нажатой может быть только одна кнопка.

Выводов у Arduino всегда не хватает: пять кнопок отнимут пять входов. Между тем у платы есть аналоговый вход, который различает сотни уровней напряжения.

Ниже — как устроена схема, расчёт напряжений и порогов, скетч, ограничения и ошибки.

Идея

Ряд тактовых кнопок с резисторами на макетной плате

Резистор R0 подтягивает вход A0 к 5 В. От входа вниз идёт цепочка резисторов, а кнопки подключают к её узлам.

Пока кнопки отпущены, на входе почти 5 В (значение АЦП 1023). Нажали кнопку — вход подключился к земле через часть цепочки, получился делитель напряжения, и напряжение зависит от того, какая кнопка нажата.

R010 кОмR410 кОмR34,3 кОмR22 кОмR11 кОмSB5SB4SB3SB2SB1A0+5 В
Резистивная клавиатура: пять кнопок подключают вход A0 к узлам цепочки резисторов.

Расчёт

Сопротивление до земли для кнопок: 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);
}

Как проверить и настроить

Щупы мультиметра на выводах резистора при проверке делителя

Проверка занимает несколько минут.

  1. Загрузите скетч.Откройте монитор порта на 9600 бод.
  2. Проверьте покой.Без нажатий будет 0 1023.
  3. Нажмите каждую кнопку.Должны появляться номер и значение АЦП, близкие к таблице.
  4. Подправьте пороги.Если ваши резисторы отличаются, поставьте пороги по серединам между вашими значениями.

Сырое значение выводится специально: по нему настраивают пороги под реальные резисторы.

Ограничения

У схемы есть четыре ограничения.

  • Одна кнопка.Нажатой может быть только одна. Две сразу дадут напряжение, по которому скетч решит, что нажата совсем другая.
  • Допуск резисторов.При узких порогах берите резисторы 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
R010 кОмподтяжка к +5 В1
R11 кОм1
R22 кОм1
R34,3 кОм1
R410 кОм1
SB1–SB5кнопкибез фиксации5
Тегиarduinoklaviatura
Редакция СхемОкАвторМатериалы готовит редакция сайта, формулы и номиналы сверяются с даташитами производителей, расчёты — с калькуляторами сайта.99 материалов

Похожие материалы