Панель телеметрии для электросамокатов Ninebot G30 / ES4 на CYD (Cheap Yellow Display).
OpenDash подключается к самокату по Bluetooth Low Energy, проходит защищённую авторизацию и показывает данные поездки на встроенном дисплее ESP32. Проект предназначен для CYD с экраном 2,8″ и работает в портретной ориентации.
Проект находится в разработке. Совместимость проверяйте на своей модели и версии прошивки самоката.
Актуальный выпуск: OpenDash v2.2.0. В релизе доступны готовые прошивки для CYD со ST7789 и ILI9341.
Установить OpenDash можно прямо из браузера без PlatformIO:
https://nope0183.github.io/OpenDash/
Выберите ревизию дисплея (ST7789 / CYD 2USB или ILI9341) и нажмите «Установить». Установщик записывает загрузчик, таблицу разделов с OTA-слотами и приложение. Нужен Chrome или Edge с поддержкой Web Serial и USB-кабель с передачей данных. Установка стирает flash и настройки.
- Скорость, заряд батареи, напряжение и ток.
- Текущий режим движения самоката: Eco, Drive или Sport.
- Пробег поездки и общий пробег.
- Температура контроллера и батареи, версия прошивки и серийный номер.
- Отдельные страницы панели, подробной информации и отладки.
- Сенсорное управление и настройка интерфейса на экране: темы, цвета, яркость, виджеты, единицы.
- Интерфейс в стиле Material You: динамическая тональная палитра из выбранного акцента, скруглённые карточки и кнопки-пилюли, крупная типографика, круглая кнопка «назад», ползунки с бегунком и чипы.
- Управление WS2812B-лентой: яркость ленты, полноценный выбор цвета, три настраиваемых сегмента, 12 плавных эффектов для каждого сегмента и красная индикация торможения.
- Защищённое OTA-обновление прошивки через встроенную Wi-Fi точку доступа и веб-интерфейс.
- Защищённое BLE-рукопожатие Ninebot с подтверждением кнопкой питания самоката.
- По умолчанию только чтение: OpenDash ничего не пишет в самокат. Единственное исключение — редактор настроек SHFW, который выключен, пока вы сами не разрешите правку на экране (см. ниже).
- Просмотр и редактирование настроек кастомной прошивки SHFW прямо на экране (83 параметра из таблицы регистров).
- ESP32-2432S028 (CYD, экран 2,8″) — конфигурация
cyd_2usbрассчитана на ревизию с драйвером ST7789. - Ninebot G30 или ES4 с доступным BLE-интерфейсом Ninebot.
- USB-кабель с передачей данных для сборки и прошивки платы.
В platformio.ini также есть конфигурация cyd_ili9341 для CYD с драйвером ILI9341. Выберите окружение, соответствующее именно вашей ревизии дисплея.
Установите:
- Visual Studio Code
- расширение PlatformIO IDE
- USB-драйвер платы, если Windows не определяет её автоматически
Клонируйте репозиторий и откройте папку проекта в VS Code:
git clone https://github.com/nope0183/OpenDash.git
cd OpenDashPlatformIO автоматически установит платформу и библиотеки, перечисленные в platformio.ini.
В терминале PlatformIO выполните команду для вашей ревизии:
# CYD с ST7789, ревизия 2 USB
pio run -e cyd_2usb
# CYD с ILI9341
pio run -e cyd_ili9341Бинарный файл появится в .pio/build/<имя_окружения>/firmware.bin.
Готовые бинарные прошивки будут публиковаться в разделе Releases.
Подключите CYD и выполните:
pio run -e cyd_2usb -t uploadДля варианта с ILI9341 замените cyd_2usb на cyd_ili9341. Если PlatformIO не определил COM-порт автоматически, укажите его в настройках проекта или выберите порт в интерфейсе PlatformIO.
Если нужно прошить уже собранный .bin вручную, используйте esptool (замените COM5 на COM-порт платы и выберите бинарный файл нужного окружения):
esptool.py --chip esp32 --port COM5 --baud 460800 write_flash -z 0x10000 .pio/build/cyd_2usb/firmware.binПри первом переходе на версию с OTA прошейте её по USB командой pio run -e cyd_2usb -t upload (или cyd_ili9341 для своей платы): нужно обновить таблицу разделов, одной записи firmware.bin недостаточно. После этого обновление доступно без кабеля в Настройки → Обновление OTA: включите доступ, подключитесь к показанной защищённой сети Wi-Fi, откройте указанный адрес и загрузите файл .bin для своей ревизии дисплея. Пароль генерируется заново при каждом включении доступа и отображается на экране. Отключите OTA-доступ после обновления.
Чтобы открыть последовательный монитор и увидеть сообщения подключения и авторизации:
pio device monitor -b 115200Рендерер src/led_effects.h не зависит от Arduino, поэтому его можно
проверить на компьютере (нужен любой C-компилятор; ниже — TinyCC, он же
tcc):
# из корня репозитория
tcc -run tools/test_led.c
tcc -run tools/test_ui_theme.c
# или
cc -O2 tools/test_led.c -o test_led -lm && ./test_led
cc -O2 tools/test_ui_theme.c -o test_ui_theme -lm && ./test_ui_themeТест ленты проверяет HSV-палитру, границы сегментов, яркость, плавность смены
цвета и торможения, все 12 эффектов и скорость рендера. Тест темы проверяет
контраст всех токенов Material You (surface/onSurface, primary/onPrimary,
контейнеры) для 4 тем и 8 акцентов. Успешные результаты — LED_TESTS_OK и
UI_THEME_CONTRAST_OK.
- Включите самокат и расположите CYD рядом.
- Запустите прошитую плату. OpenDash начнёт поиск Ninebot по BLE.
- Когда на экране появится PRESS POWER, коротко нажмите кнопку питания самоката для подтверждения защищённого подключения.
- После авторизации появится панель телеметрии.
По умолчанию OpenDash ищет устройство с именем, похожим на NB, Ninebot, Segway или ES4, и выбирает устройство с наиболее сильным сигналом. Если нужно указать имя точно, задайте TARGET_NAME в src/main.cpp.
| Жест | Действие |
|---|---|
| Свайп влево / вправо | Следующая / предыдущая страница |
| Касание шестерёнки (справа в шапке) | Открыть настройки |
| Касание точек страниц в шапке | Следующая страница |
| Касание карточки на панели | Следующие данные в этой карточке |
| Удержание карточки (~0,65 с) | Выбрать данные из списка |
| Касание спидометра | Переключить км/ч ↔ mph |
Блокировка в движении. Пока скорость выше 3 км/ч, все касания, кроме свайпа страниц, игнорируются (можно отключить в Настройки → Экран).
- короткое нажатие — следующая страница (в настройках — «назад»);
- удерживание более 1,5 секунды — переподключение к самокату.
При первом включении откроется калибровка: коснитесь трёх меток по очереди (лучше стилусом). Оси и инверсия определяются автоматически, поэтому работает с любой ревизией CYD. Перекалибровать можно в Настройки → Калибровка тача.
Страницы: панель со спидометром, информация об устройстве и отладочные данные BLE.
Все параметры меняются прямо на дисплее и сохраняются в памяти ESP32 (NVS), поэтому остаются после перезагрузки.
- Внешний вид: 4 темы Material You (TONAL, BLACK, SLATE, LIGHT для солнца), 8 цветов акцента и произвольный оттенок ползунком. Палитра surface/container/primary/outline пересчитывается из акцента, поэтому кнопки, карточки и текст остаются контрастными в любой теме.
- Экран: яркость (плавно, ШИМ подсветки), автозатемнение при бездействии (не срабатывает в движении), поворот на 180°, блокировка в движении.
- Спидометр и единицы: км/ч или mph, максимум шкалы отдельно для каждой единицы, стиль цвета шкалы (плавный градиент, один цвет, зоны); индикатор фактического режима Eco / Drive / Sport.
- Виджеты и страницы: четыре карточки на панели, каждая показывает любое из: заряд, мощность, поездка, температуры, общий пробег, напряжение, ток, максимальная скорость за поездку; страницы «Информация» и «Отладка» можно скрыть.
- ARGB-лента: в Настройки → ARGB-лента задаются GPIO (из списка поддерживаемых выводов), общее число светодиодов, включение ленты и общая яркость (ползунок 1–100 %, применяется ко всей ленте). Светодиоды делятся на три последовательных сегмента; размер каждого меняется кнопками
−/+, а диапазон номеров пересчитывается автоматически. Для каждого сегмента отдельно выбирается эффект — коснитесь кнопки с названием эффекта, чтобы открыть список: «выкл.», постоянный цвет, пульсация, радуга, мигание, дыхание, бегущая точка, комета, искры, градиент, отскок, заливка. Анимация сегментов сдвинута по фазе, поэтому куски ленты не идут в ногу. Касание цветного квадрата открывает палитру цвета: квадрат насыщенности/яркости, шкала оттенка, восемь готовых цветов и живой предпросмотр с HEX-кодом; кнопки Готово и Отмена (отмена возвращает исходный цвет). Смена цвета и включение торможения плавно перетекают (около 0,2 с), оттенок радуги тоже сдвигается выбранным цветом. Настройки сохраняются в NVS. - Индикация торможения: в Настройки → ARGB-лента кнопка «Торможение» переключает режим: выкл., вся лента или задний сегмент. В выбранном режиме при скорости выше 3 км/ч и отрицательном токе батареи не менее 1 А лента (или только задний сегмент) становится красной. Условие обновляется примерно каждые 400 мс; после последнего подходящего измерения красный сохраняется 700 мс.
- Язык: English / Русский, переключается одним касанием в Настройки → Язык. Переводится весь интерфейс, кроме страницы отладки BLE.
- Сброс: удерживайте строку Reset to defaults (калибровка тача сохраняется).
- Настройки SHFW: в Настройки → Настройки SHFW — просмотр и правка параметров прошивки SHFW самоката (см. раздел ниже).
- Обновление OTA: в Настройки → Обновление OTA временно включите защищённую точку доступа, затем загрузите подходящий
.binна показанной веб-странице. Для первого обновления на версию с OTA требуется USB-прошивка.
Работает только на самокате с установленной прошивкой SHFW и только по BLE-соединению OpenDash.
Как пользоваться
- Дождитесь состояния
LIVE, затем откройте Настройки → Настройки SHFW. OpenDash проверяет, что это SHFW: самокат должен ответить на запрос версии (0x39) или регистр0xB2(«активный профиль») должен читаться как 1–3. Если не отвечает ни то, ни другое, запись блокируется. Внизу экрана показывается диагностика (ver:… B2:…), а удержание строки статуса включает принудительный режим, который отключает эту проверку (только если вы точно знаете, что на самокате SHFW). - Просматривать значения можно сразу. Чтобы менять, удерживайте плашку «Правка: ВЫКЛ» до смены на «ВКЛ». Разрешение не сохраняется: после перезапуска правка снова выключена (то же происходит при сбросе настроек).
- Выберите группу → параметр. Числа меняются кнопками
−/+(малый и крупный шаг), списки — стрелками<>, флаги —ВКЛ/ВЫКЛ.Отменавозвращает считанное значение. - Запись выполняется удержанием кнопки
ЗАПИСЬ. Одиночное касание ничего не пишет.
Что делает запись
- Работает только на стоянке (скорость не выше 1 км/ч, телеметрия скорости должна быть получена).
- Читает регистр, меняет только биты выбранного параметра (остальные параметры в том же регистре не затрагиваются), записывает командой
0x32, читает обратно и сверяет. Результат («Записано и проверено» или «Не принято, читается: …») показан под кнопками. - Значения ограничены диапазонами из таблицы; границы берутся из подписей в
tools/shfw_registers.csv.
Группы: «Мощность и лимиты», «Режимы и профили», «Свет», «Приборная панель», «Система» и «Эксперт». В «Эксперт» вынесено то, что может повредить самокат: field weakening, ПИД-коэффициенты, калибровка ручек, частота ШИМ, ёмкость батареи, отключение защит («Suppress … errors»). Кнопка записи там красная.
Копии и восстановление (Настройки SHFW → Копии / восстановление)
- Копия хранится в NVS самой ESP32: 4 ручных слота и слот «Отмена», который заполняется автоматически перед каждым восстановлением.
- В каждую копию записывается версия SHFW, полученная запросом
5A A5 00 3E 20 39 00 68 FF(ESC, команда0x39). Если версия не получена, копия не создаётся. - Восстановление разрешено, только если версия в копии точно совпадает с текущей версией самоката; иначе показываются обе версии и ничего не пишется. В списке слотов видно, совпадает ли версия слота с текущей.
- Копируются только регистры из таблицы (
SHFW_RUNS, 134 байта), включая кривые DPC и триггеры профилей, которые в редакторе недоступны. Слова вне таблицы не читаются и не пишутся. - Как и у регистров Ninebot: адрес в словах, длина в байтах; за один запрос читается или пишется не больше
0x50байт, длинные диапазоны режутся на блоки. - Копию можно делать всегда (это только чтение). Восстановление требует включённой правки, стоянки и удержания кнопки; каждый блок проверяется обратным чтением, итог показывается на экране.
- Слот хранит CRC и идентификатор таблицы регистров: после изменения CSV старые копии помечаются как несовместимые.
- Формат ответа на запрос версии сохраняется «как есть» (до 32 байт). Если в ответе есть изменяющиеся поля (например, время работы), версии не совпадут. В этом случае пришлите строки
SHFW VERиз Serial-монитора.
Не редактируются: кривые DPC/торможения, триггеры пользовательских профилей, подмена версий BLE/ESC/BMS, напряжения ячеек и делитель АЦП — у них нет понятной шкалы в таблице.
Таблица параметров генерируется из CSV (имена в интерфейсе остаются английскими, как в SHFW):
python tools/gen_shfw_table.py # tools/shfw_registers.csv -> src/shfw_table.h
g++ -std=c++17 -Isrc tools/test_shfw.cpp -o test_shfw && ./test_shfw # проверка разбора полей/масок без железаКонфиг SHFW читается командой
0x31и пишется командой0x32(адрес в словах, длина в байтах, не больше0x50байт); ответ на чтение приходит сcmd=0x34; обычные регистры Ninebot (0x01/0x04) этим не затрагиваются. Если параметр должен пережить выключение самоката, проверьте это на своей версии SHFW: после записи выключите и включите самокат и перечитайте значение.
Дополнительные параметры находятся в начале src/main.cpp:
| Параметр | Назначение |
|---|---|
TARGET_NAME |
Имя самоката для точного выбора; пустая строка включает автоматический поиск |
GAUGE_MAX |
Шкала спидометра по умолчанию, км/ч (дальше меняется в настройках на экране) |
POLL_INTERVAL |
Интервал между запросами телеметрии |
LINK_TIMEOUT |
Тайм-аут потери связи |
SPEED_SCALE, TRIP_SCALE, TOTAL_SCALE |
Масштабы скорости и пробега |
ETEMP_SCALE, BMS_CUR_SCALE, BMS_VOLT_SCALE |
Масштабы температуры, тока и напряжения |
Если значения на экране отличаются от показаний самоката, проверьте коэффициенты и регистры для своей модели и версии прошивки.
Режим читается из регистра ESC 0x75; пока ответ не получен, панель показывает --. Неизвестные значения отображаются числом и не преобразуются в один из стандартных режимов.
Выберите один из предлагаемых в меню выводов GPIO 4, 16, 17, 22, 26 или 27 и подключите к нему DIN ленты. Питание ленты подавайте от отдельного источника 5 В, рассчитанного на её максимальный ток; объедините GND источника, ленты и CYD. Для надёжной передачи данных рекомендуется преобразователь уровня 3,3→5 В, последовательный резистор на линии DIN и конденсатор на питании ленты. Не питайте ленту от GPIO или стабилизатора CYD. Красный режим определяется по отрицательному току батареи из телеметрии BMS, а не по отдельному статусу тормозной ручки или входу контроллера. Рекуперация может включаться без нажатия ручки, а механическое торможение может не давать подходящего тока; задержка опроса также возможна. Это не сертифицированный стоп-сигнал — не используйте его как единственное средство торможения/оповещения.
- Самокат не находится: включите его, поднесите CYD ближе и проверьте, что BLE доступен. При нескольких самокатах задайте
TARGET_NAME. - Авторизация ждёт подтверждения: при сообщении PRESS POWER нажмите физическую кнопку питания самоката.
- Нет загрузки на ESP32: проверьте USB-кабель, драйвер и выбранный COM-порт. Некоторые платы требуют удерживать BOOT во время начала прошивки.
- Неверный цвет или изображение дисплея: проверьте, что выбрано окружение PlatformIO для правильного драйвера экрана.
- Ошибки компиляции mbedTLS: используйте закреплённую в проекте платформу Espressif32; переход на Arduino core 3.x не настроен.
OpenDash/
├── platformio.ini # платформы, библиотеки и конфигурации дисплея
├── src/
│ ├── main.cpp # прошивка OpenDash
│ ├── led_effects.h # рендерер 12 эффектов ленты (без Arduino, тестируется на ПК)
│ ├── ui_theme.h # палитра Material You из акцента (без Arduino, тестируется на ПК)
│ ├── shfw.h # разбор полей/масок регистров SHFW (без зависимостей от Arduino)
│ ├── shfw_table.h # таблица параметров SHFW (генерируется)
│ ├── ru_fonts.h # растровые шрифты с кириллицей (генерируется)
│ └── probe_auth.cpp # отдельный экспериментальный BLE-инструмент
├── tools/
│ ├── gen_ru_font.py # генератор ru_fonts.h; автоопределяет шрифт с кириллицей (нужен Pillow)
│ ├── gen_shfw_table.py # генератор shfw_table.h из shfw_registers.csv
│ ├── shfw_registers.csv # таблица регистров SHFW (адрес, длина, значение, маска, описание)
│ ├── test_led.c # хост-тест эффектов ARGB-ленты
│ ├── test_ui_theme.c # хост-тест контраста палитры Material You
│ └── test_shfw.cpp # хост-тест логики SHFW
└── .vscode/
└── extensions.json # рекомендация расширения PlatformIO IDE
Обычные окружения cyd_2usb и cyd_ili9341 собирают только src/main.cpp. Файл probe_auth.cpp не входит в основную прошивку.
Готовый src/ru_fonts.h уже включён в проект, поэтому Pillow для обычной сборки и прошивки не нужен. Если требуется пересоздать шрифт, установите Pillow и запустите из любой папки:
python -m pip install Pillow
python C:/путь/к/OpenDash/tools/gen_ru_font.pyГенератор автоматически ищет установленный шрифт с кириллицей. Если нужно указать его вручную, задайте переменную окружения OPENDASH_FONT_FILE с путём к TTF/OTF-файлу.
OpenDash предназначен для отображения телеметрии; запись настроек SHFW — осознанная опция, выключенная по умолчанию. Неверные значения (особенно в группе «Эксперт») могут повредить мотор, контроллер или батарею, а отключение защит и повышение лимитов может нарушать местные правила. Пользуйтесь самокатом безопасно и не взаимодействуйте с дисплеем во время движения. BLE-протокол и расположение регистров могут различаться между моделями и версиями прошивки; проект предоставляется «как есть».
- Интерфейс переведён на Material You: тональная палитра surface/container/primary/outline строится из выбранного акцента, темы TONAL / BLACK / SLATE / LIGHT пересчитываются целиком.
- Скруглённые карточки, кнопки-пилюли, чипы, круглая кнопка «назад», крупный заголовок, ползунки с бегунком, круглая шкала с тональным диском и индикатор страниц-пилюль.
- Экран настроек стал списком Material-элементов с ведущим тональным индикатором и шевроном; палитра ARGB — с круглыми пресетами и аккуратной шкалой оттенка.
- Убраны артефакты при перетаскивании маркеров HSV-квадрата и шкалы оттенка (старый маркер стирается точечно, а не перерисовкой всего экрана).
- Убраны аллокации String из горячего пути дашборда: поля и значения форматируются в стековые буферы, кэш полей хранит
char[]. drawS/fieldполучили перегрузкиconst char*; экран настроек при изменении значения больше не вызываетfillScreen, а SPI-транзакция удерживается на весь кадр.- Добавлен
ui_theme.hи хост-тест контраста палитрыtools/test_ui_theme.c;fitTextне рвёт UTF-8 посередине кириллической буквы.
- Рендерер ARGB-ленты переписан: анимации считаются по времени, а не по номеру кадра, поэтому не дёргаются при задержках BLE.
- Бегущая точка, комета, отскок и заливка двигаются с субпиксельной точностью (16.16), а не прыгают по одному светодиоду.
- Смена цвета и включение торможения плавно перетекают; оттенок радуги сдвигается выбранным цветом; палитра и лента используют одну и ту же HSV-таблицу.
- Рендер идёт на 50 кадрах/с, статичные эффекты перестают перерисовываться; из горячего цикла убраны
sinfи деления с плавающей точкой. - Перетаскивание оттенка больше не перерисовывает весь HSV-квадрат и шкалу на каждом касании — интерфейс палитры стал заметно отзывчивее.
- Добавлен хост-тест
tools/test_led.cдля всех эффектов, границ сегментов, яркости, торможения и плавности.
- Расширен набор эффектов ARGB-ленты: вместо четырёх доступны двенадцать — добавлены мигание, дыхание, бегущая точка, комета, искры, градиент, отскок и заливка.
- Каждый из трёх сегментов ленты получает свой эффект; у сегментов разный сдвиг фазы, поэтому куски не движутся синхронно.
- Эффект сегмента выбирается из отдельного экрана со списком, а не перебором одной кнопкой.
- Сохранённые настройки читаются без миграции: номера и порядок прежних четырёх эффектов не изменились.
- Добавлена регулировка общей яркости ARGB-ленты (ползунок 1–100 %) в Настройки → ARGB-лента.
- Добавлена полноценная палитра цвета: квадрат насыщенности/яркости, шкала оттенка, восемь готовых цветов, предпросмотр с HEX-кодом и кнопки Готово/Отмена.
- Добавлена кнопка «Торможение»: индикация рекуперации теперь выключается, работает на всей ленте или только на заднем сегменте.
- Настройки ленты сохранены в новом формате; при первом запуске после обновления старые значения переносятся автоматически.
- Добавлен редактор настроек SHFW: просмотр и изменение параметров, резервное копирование и восстановление с проверкой версии прошивки.
- Запись SHFW по умолчанию заблокирована и включается отдельно на экране.
- Сохранены OTA-обновления.
- Добавлено OTA-обновление прошивки через веб-интерфейс в защищённой Wi-Fi точке доступа.
- Доступ к обновлению отдельно включается в настройках и отключён по умолчанию.
- Добавлена таблица разделов с двумя OTA-слотами; первая установка этой версии требует прошивки по USB.
- Заменено срабатывание красной ARGB-индикации по резкому падению скорости на оценку рекуперативного торможения по отрицательному току батареи BMS.
- Красный режим включается при скорости выше 3 км/ч и токе не менее 1 А в сторону заряда; добавлен опрос тока вместе с ускоренной телеметрией.
- Это не отдельный сигнал тормозной ручки/контроллера и не сертифицированный стоп-сигнал.
- Добавлены чтение и индикация режима движения Eco / Drive / Sport.
- Добавлено управление лентой WS2812B: выбор GPIO, количества светодиодов и настройка трёх сегментов с эффектами и цветами.
- Добавлена красная индикация резкого замедления; в v1.0.6 она заменена на оценку по току рекуперации.
- Выпускаются готовые прошивки для дисплеев ST7789 (
cyd_2usb) и ILI9341 (cyd_ili9341).