Квартира нашпигована умными устройствами, но при этом, как и в самом обычном доме, шесть выключателей только в коридоре. Основной свет, подсветка потолка, подсветка пола, вытяжка, бра у зеркала и общий «выключить всё». Гости нащупывают нужный на третью попытку. Жена — на вторую. Про себя надеюсь, что попаду с первого раза, но только потому что выучил порядок.
Целых шесть штук — а речь только про коридор. Добавьте сценарии «сон», «утро», «кино», «ушёл из дома» — и стена превращается в кабину самолёта. Если же вместо выключателей поставить сенсорную панель с экраном, вместо «вошёл — нажал — свет» получится «вошёл — разбудил экран — нашёл меню — нашёл кнопку — нажал». Справедливости ради, в коридоре постоянно светящийся экран даже полезен — не потеряешь в темноте. Но поставьте такой же в спальню, и ночью он разбудит надёжнее любого будильника.
Всё это подтолкнуло к поиску альтернативы — с гибкостью сенсорного экрана, простотой обычного выключателя и в его же формате. Так появился прототип жестового контроллера: сенсорная матрица 3x3 в корпусе стандартного выключателя. Девять зон, никакого экрана, десятки различимых команд. Ниже — разбор: почему существующие способы управления не закрывают одну конкретную нишу, и как её закрывает матрица.
Что мы вообще обсуждаем
Чтобы не спорить о терминах: под «умным домом» здесь — управление светом (основной, подсветка, шторы), климатом (обогрев, кондиционер, увлажнение) и безопасностью (замки, датчики). Поведение устройств может быть изолированным (включить бра в спальне) или объединённым в сценарии (режим «сон» — свет выключить, шторы закрыть, температуру снизить).
В этом смысле умный дом — не набор удалённых переключателей, а система с единой логикой. И у этой системы есть конкретная инженерная проблема.
Проблема: гибкость убивает удобство
Привычная модель — выключатель рядом с тем, чем он управляет. Свет в комнате — выключатель у двери. Понятно, надёжно, работает без Wi-Fi. Но ёмкость команд — одна штука на один орган управления.
Когда функций становится больше трёх, начинается выбор из плохих вариантов:
Наращивать механику. Пять клавиш, шесть, восемь. Стена перестаёт быть стеной. Переназначить функцию — вызвать электрика.
Поставить экран. Любое количество кнопок, любой дизайн, подписи, иконки. Но путь от «я хочу свет» до «свет горит» удлиняется. Экран нужно разбудить, найти нужный пункт, нажать. В темноте экран слепит. В пыльном помещении — пачкается. Стоимость точки — кратно выше.
Голосовое управление. Бесконечная ёмкость команд, руки свободны. Но нужен интернет, есть задержка, ложные срабатывания в шумной комнате. Ночью, когда рядом спит ребёнок, говорить «Алиса, выключи всё» — не вариант.
Одиночный сенсор. Дёшево, минимум проводов. Но различимых команд — два-три (короткое, длинное, двойное нажатие). Для одного светильника — нормально. Для сценариев — мало.
Видите паттерн? Либо просто, но мало команд. Либо много команд, но медленно/дорого/зависит от сети. Разрыв — между одиночной кнопкой и полноценным экраном. Именно сюда встаёт матрица.
Идея: кодировать команду траекторией, а не временем
У одиночного сенсора команды различаются по времени: короткое нажатие, длинное, двойное. Вы стоите на одном месте и считаете. Три-четыре команды — потолок одиночного сенсора. Дальше уже приходится стучать морзянку, чтобы добраться до нужной.
Выход — разделить пространство сенсора на зоны. Почему именно 3x3? Рабочая область стандартного выключателя — примерно 6 на 6 сантиметров. При разбивке 4x4 зона получается 15 на 15 мм — попасть вслепую уже сложно. А три позиции по каждой оси — это интуитивное «лево, центр, право». Можно попадать почти не глядя. При этом даже такой грубой сетки хватает для кодирования десятков команд.
Как это работает
Матрица 3x3 добавляет пространство:
0 1 2
3 4 5
6 7 8
Девять зон. Каждая — отдельное нажатие. Проведите пальцем по верхнему ряду (0 → 1 → 2) — это горизонтальный жест. По диагонали (0 → 4 → 8) — диагональный. Справа налево, сверху вниз, L-образный, Z-образный — разных траекторий десятки.
И вот ключевое: траектории мнемоничны. Чем чаще нужна команда, тем короче жест. Нажал верхний сенсор — включил светильник. Нижний — выключил. Ровно как у обычного выключателя — верх/низ. Для частых сценариев простые мнемонические команды. Свайп по верхнему ряду — верхний свет. Свайп по нижнему ряду — подсветка пола. Вправо — включить. Влево — выключить. Для экзотических сценариев можно и более сложные жесты. И это не абстрактные «двойной клик через 200 мс», а жесты, которые привязываются к пространственной модели комнаты.
Три-пять жестов хватает для повседневного управления. Чтобы запомнить и не путаться, хватит одного дня.

Делаем прототип
Любая хорошая идея требует проверки, поэтому я потратил вечер и сделал прототип. Некоторые контроллеры (например ESP32) умеют конфигурировать некоторые свои выводы как емкостные сенсоры, но для прототипа пришлось бы формировать сенсорные площадки и бороться с перекрёстными помехами. Проще оказалось взять готовые TTP223. Их размер 10x15 мм отлично вписался в размер. Получилась матрица с достаточным размером чувствительной зоны и при этом разреженная для того, чтобы четко фиксировать зону без двойных нажатий. Раз сенсорный ввод решён готовыми модулями, для обработки сгодился первый попавшийся под руку контроллер.

Конечный автомат прошивки работает в трёх фазах:
IDLE — матрица пуста, ждём первого касания.
CODING — палец на матрице. При переходе на соседнюю клетку она добавляется в цепочку. Если нажаты несколько зон одновременно — берётся клетка с минимальным индексом (упрощает логику, снижает неоднозначность).
RELEASE — все зоны отпущены. Если пауза превышает 300 мс — жест завершён, цепочка уходит на обработку. Если палец вернулся раньше — обратно в CODING.
На выходе — код жеста: стартовая клетка + последовательность переходов. В реальной системе этот код может маппиться на действие: MQTT-топик, HTTP-запрос, команду локальному реле — зависит от архитектуры дома.
Отладочная прошивка: touch_matrix9_map_cli
Для отладки на железе написана минимальная CLI-прошивка. Подключаешь по USB, открываешь монитор — и получаешь набор команд:
raw — сырые уровни на GPIO. Позволяет увидеть, что физически происходит на линиях, без какой-либо логики. Первое, что делаешь при подключении новой платы.
map / mapping — привязка логических клеток к физическим GPIO. Разводка платы может отличаться от логической сетки 0–8. Команда mapping запускает мастер: нажимаешь девять кнопок по порядку, прошивка запоминает, какой GPIO соответствует какой клетке. Результат сохраняется в NVS — переживает перезагрузку.
path — запись жеста. Проводишь пальцем по матрице, отпускаешь, через 300 мс прошивка печатает цепочку клеток.
demo h1 / demo d1 / ... — сравнение записанного жеста с эталоном. Пишет OK или FAIL с указанием ожидаемой цепочки.
Этого достаточно, чтобы за десять минут проверить разводку, откалибровать маппинг и убедиться, что жесты распознаются корректно — до того, как подключать контроллер к системе дома.

Где это имеет смысл
У входа в комнату. Одна клетка — основной свет. Свайп по ряду — всё выключить. Диагональ — сценарий «ушёл» (свет, шторы, температура). Заменяет блок из трёх-четырёх клавиш одной панелью.
У кровати. Угловые клетки — бра слева и справа. Центр — ночник. Жест вниз — «сон». Никакого светящегося экрана на тумбочке.
Техническое помещение. Руки в перчатках, касание грубое. Крупные зоны, два-три жеста. Одна клетка — свет, жест — вентиляция.
Резерв при отказе сети. Вся логика — на MCU рядом с нагрузкой. Жест → реле. Ни облака, ни роутера.
Чего матрица не умеет
Было бы нечестно не сказать про ограничения.
Обучение. Нужно запомнить жесты. Для повседневных трёх-пяти действий это реалистично. Для словаря из двадцати — нет. Проще ограничиться необходимыми.
Ложные срабатывания. Неточное проведение, влажные руки, случайное задевание. Для некритических мест не страшно. А вот открывать замок одним жестом без подтверждения я бы не стал.
Нет обратной связи. Матрица не показывает текущее состояние. Годится, если можешь увидеть результат. Если повесить рядом с LED-индикатор со статусами, то можно совместить удобство (быстрый жест) и контроль результата.
Место в архитектуре
Жестовый контроллер — не замена ни экрану, ни приложению. Это специализированный локальный пульт для частых действий. Он занимает конкретную нишу между механическим выключателем (простой, но негибкий) и сенсорной панелью (гибкая, но дорогая и медленная).
Девять кнопок не решают всё. Но ту задачу, которую они решают — быстрый локальный ввод без экрана и без сети — решают хорошо.
Если тема интересна, в следующей части могу разобрать кодирование жестов подробнее: как из цепочки клеток получается компактный uint32 код, пригодный для маппинга на сценарии.
Буду рад, если в комментариях поделитесь, как вы решаете ту же задачу — много команд на одной точке без экрана. Наверняка есть подходы, о которых я не подумал.
