Ответ на пост «Ищу энтузиаста помочь собрать устройство для квиза, чтобы играли незрячие»1
С таким ТЗ - результат ХЗ, как говорится.
Для игры в квиз незрячим нужны какие-то кнопки.
Не понятно сколько кнопок, не понятно какие между ними расстояния.
Не понятно допустимы ли провода, требуется ли автономность, нужен ли звук нажатия, какая нужна индикация?
Окей. Давайте фантазировать за заказчика.
Предположим, что кнопки нужны, чтобы определять кто первый готов ответить. Это значит, что, допустим, есть условно 10 кнопок. Допустим они готовы к работе.
При нажатии одной из кнопок должно что-то произойти. Видимо нажатая кнопка должна загореться зеленым, а остальные красным, а... постойте-ка. Незрячие же... Так, значит нужен звук и\или вибрация, которая укажет обладателю кнопки нажатой первым, что он победил по скорости.
Хорошо бы, чтобы это было озвучено. То есть прозвучал номер игрока, нажавшего первым.
После этого нужно как-то сбросить систему в первоначальное положение для следующего раунда.
То есть у всей системы два состояния: 1) ждём нажатий, 2) Показываем кто нажал первый.
Давайте сперва сформулируем Идеальное Решение, чтобы было от чего отталкиваться.
Идеальное решение
- У нас есть несколько кнопок. Может быть с десяток.
- Кнопки без проводов.
- Каждая кнопка "умеет" светиться разными цветами и вибрировать разными паттернами.
- Перед использованием кнопки нужно "спарить" между собой. Например, включать их по очереди с нажатой кнопкой. Первая кнопка при отпускании создаёт новую "Группу" (загорается рандомным цветом новой группы и вибрирует импульсами в быстром ритме). Каждую следующую кнопку при включении с нажатой кнопкой спариваем с первой. Для этого нажимаем на первую и на новую, а потом одновременно отпускаем. Так добавляем все кнопки группы.
- Красиво было бы, если бы спариваясь пара кнопок вибрировала синхронно давая пользователю знать, что он спаривает именно эти две, а никто больше в это время такими же кнопками не мешает ему.
- Спарившись кнопки "запоминают" свою группу, и при последующем включении остаются в ней.
- Можно рассмотреть вариант, когда несколько групп участвуют в одной игре. например две команды и у каждого игрока своя кнопка, но нажимается она за всю группу.
- Кнопки получают номера в порядке активации.
- У первой кнопки есть через вайфай в веб-интерфейсе есть веб-страница, которая на экране любого браузера будет отображать статус игры, номер победившей кнопки, и через колонки устройства где браузер озвучивать номера победивших в раунде кнопок.
В этом виде система реализуется так:
- Внутри кнопок в качестве контроллера недорогой вариант ESP32.
- Цветовая индикация за счет одного адресного RGB-светодиода.
- Звуковая индикация за счет зуммера (пищалки).
- Тактильная индикация - вибромоторчик.
- Контроллер заряда\разряда литиевого аккумулятора 18650 с Type-C и выключатель питания типа тумблер.
- Сама кнопка - нормально разомкнутая тактовая.
- Корпус печатается на 3д-принтере из двух видов пластика: полупрозрачный белый рассеиватель-кнопка и непрозрачный корпус. Подпружинивание реализуется за счет 3д-печати, сборка корпуса из двух частей на защелках.
Дополнительно такие кнопки можно использовать в Умном Доме для произвольных целей. Для этого можно предусмотреть штатный конфиг Home Assistant, а прошивку кнопок попробовать реализовать сразу на ESP-Home.
Связь между кнопками по ESP-Now. Спариваясь кнопки синхронизируют между собой рандомно сгенерированный ключ группы. В ходе ожидания нажатия по сети с интервалом в секунду отправляется короткий синхропакет для синхронизации времени на кнопках. После нажатия кнопка отправляет несколько раз с рандомными небольшими интервалами широковещательный пакет с кодом своей группы, номером кнопки в группе и своим локальным временем (в миллисекундах от включения первой кнопки) на момент нажатия.
Дальше каждая кнопка работает одинаково. Принятые пакеты сортирует по времени, и если первый пакет - это свой пакет, то включаем индикацию победы. Иначе поражения.
Однократное нажатие на победившую кнопку в режиме индикации сбрасывает состояние в ожидание и отправляет синхро-пакет сброса на другие кнопки.
Приняв синхропакет сброса кнопка переходит в режим ожидания.
Режимы индикации:
1) Поиск группы для спаривания
2) Ожидание спаривания, создана группа (первая кнопка)
3) Добавление очередной кнопки в группу (синхронная вибрация)
4) Ожидание нажатия (после спаривания переход долгим нажатием на первую кнопку)
5) Индикация - победа
6) Индикация - поражение
Цвета, звуки и ритмы вибрации, звуки событий для воспроизведения через веб-интерфейс - всё это можно регулировать в настройках в веб-интерфейсе первой кнопки.
Так. Это был более-менее идеальный вариант реализации.
Теперь попробуем сформулировать MVP.
MVP - это минимальное пригодное для использования решение
Достаточно написать простой веб-сервис - Single Page Application.
Всю описанную выше функциональность можно реализовать на JS, связь между клиентами через API сервиса.
Ещё один вариант - это MiniApp в Телеграмме с этой функциональностью. Это избавит от необходимости в домене.
Ну вот. Теперь это хотя бы отдалённо похоже на ТЗ.
Теперь можно искать энтузиастов не для того, чтобы они пошли туда, не знаю куда, а с конкретной понятной и не сложной задачей.
Теперь есть концепция MVP, которую можно реализовать первой и отработать логику.
Теперь есть куда расти проекту.
Эта задача - отличный повод создать, например, свой первый Open Source проект. Задача не такая уж и простая, можно заморочиться с разной степенью дотошности на предмет точности синхронизации времени и всяких пограничных состояний.
Да, этот пост создан естественным интеллектом на базе биологической нейронной сети. Обработка генеративными моделями для улучшения и анализа не производилась, но никто не запрещает это сделать, чтобы закрыть не затронутые пробелы и оформить ТЗ до идеала.
Желающие могут на это проекте попробовать себя в вайбкодинге. Проект настолько небольшой (особенно в части MVP), что это отличный повод поэкспериментировать.
Генерация идей и проработка проектов - это одно из моих хобби. У меня ОЧЕНЬ много идей в загашнике, и если будет интерес публики, я могу вот так вот выносить их на суд общественности.
Никаких авторских прав и ограничений. Берите кто хотите. Одна просьба - приносите свои результаты, будет приятно посмотреть или даже попользоваться. Мне не жалко, потому что идея без реализации яйца выломанного не стоит, а скорее имеет отрицательную стоимость. Если кто-то её "украдёт", то автору идеи может посчастливиться поиспользовать задуманное, а не похоронить под сукном в штабелях других нереализованных идей.
Если же автор идеи захочет её реализовать сам, то у него всегда есть фора, даже если идеей он публично поделился. Никто лучше автора идеи не понимает её сути и всех нюансов. Это значимая форма, а значит нет нужды таить идеи "под сукном".
Так что не стесняйтесь. Эта задача уже прописана очень подробно, а любой ЧатЖПТ вам распишет её ещё подробнее на детальные подзадачи.
Например вы можете уже сейчас:
- создать и оформить проект на https://github.com/ или поискать там похожий проект,
- поискать подходящий корпус на https://www.thingiverse.com/, или смоделировать свой,
- сгенерить в нанобанане КДПВ к этому посту и лого для проекта,
- набросать дизайн для миниаппа в фигме,
- накидать ссылок на маркетплейсы по комплектующим,
- придумать классную интуитивно-понятную свето-вибро-звуковую индикацию,
- записать фразы для озвучивания номеров игроков и игровых событий для веб-интерфейса,
- набросать экономичный дизайн (для ESP) страницы с индикацией победителя в веб-интерфейсе,
- набросать перечень и спецификацию эндпоинтов API для веб-реализации,
- поискать, кстати, готовые реализации. Наверняка миллион разу же такое делали и программно и аппаратно. Для референсов, или может заказчика устроит одно из готовых решений.
Всем спасибо за внимание. У меня для таких постов есть специальная рубрика: Есть идея
Посоветуйте на счет более подходящего сообщества для публикации. Я как-то затрудняюсь решить куда публиковать.



























