Квартира нашпигована умными устройствами, но при этом, как и в самом обычном доме, шесть выключателей только в коридоре. Основной свет, подсветка потолка, подсветка пола, вытяжка, бра у зеркала и общий «выключить всё». Гости нащупывают нужный на третью попытку. Жена — на вторую. Про себя надеюсь, что попаду с первого раза, но только потому что выучил порядок.

Целых шесть штук — а речь только про коридор. Добавьте сценарии «сон», «утро», «кино», «ушёл из дома» — и стена превращается в кабину самолёта. Если же вместо выключателей поставить сенсорную панель с экраном, вместо «вошёл — нажал — свет» получится «вошёл — разбудил экран — нашёл меню — нашёл кнопку — нажал». Справедливости ради, в коридоре постоянно светящийся экран даже полезен — не потеряешь в темноте. Но поставьте такой же в спальню, и ночью он разбудит надёжнее любого будильника.

Всё это подтолкнуло к поиску альтернативы — с гибкостью сенсорного экрана, простотой обычного выключателя и в его же формате. Так появился прототип жестового контроллера: сенсорная матрица 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 код, пригодный для маппинга на сценарии.

Буду рад, если в комментариях поделитесь, как вы решаете ту же задачу — много команд на одной точке без экрана. Наверняка есть подходы, о которых я не подумал.