🇷🇺 Русская версия · 🇬🇧 English
Пошаговая инструкция: от пустой платы до работающего спектра в браузере.
| Компонент | Зачем |
|---|---|
| ESP32-S3-DevKitC-1 N16R8 | Плата-шлюз. Именно S3 — нужен USB OTG Host (GPIO19/20). Обычный ESP32 / C3 не подойдут — у них нет USB Host. 16 MB Flash + 8 MB PSRAM. Купить на Ozon |
| USB-C OTG кабель | Соединяет USB-порт ESP32-S3 (host) с USB-портом спектрометра (device). На ESP32-S3-DevKitC-1 два USB-C разъёма — нужен тот, что подписан «USB» (не «UART»). |
| USB-кабель для прошивки | Подключает UART-порт ESP32-S3 (тот, что подписан «UART») к ПК для первой прошивки. |
| KB Radar «Atom Spectra» | Гамма-спектрометр с USB-портом. Внутри — FTDI FT232R (VID 0403, PID 6001), 600000 бод. |
| Блок питания 5V USB | Для постоянной работы (после прошивки USB-UART кабель можно убрать). |

Вариант A — локальный ESP-IDF (рекомендуется для разработки):
Вариант B — Docker (проще, ничего не ставить):

USB-C «UART» USB-C «USB» (OTG)
(для прошивки) (для спектрометра)
│ │
┌─────────┐ ┌────┴─────────────────────────┴────┐ ┌──────────────┐
│ ПК │◄──────►│ ESP32-S3-DevKitC-1 │◄──────►│ Atom Spectra │
│ (COM14) │ USB │ N16R8 │ USB │ (FTDI FT232R │
└─────────┘ └───────────────────────────────────┘ OTG │ 600 kBd) │
│ └──────────────┘
│ WiFi 2.4 GHz
▼
┌───────────┐
│ Браузер │
│ BecqMoni │
└───────────┘
Важно: на ESP32-S3-DevKitC-1 два USB-C разъёма. Для прошивки используется UART-порт. Для подключения спектрометра — USB (OTG) порт. Не перепутайте!

# Клонировать репозиторий
git clone https://github.com/VibeEngineering-LLC/atomspectra-waterfall-esp32.git
cd atomspectra-waterfall-esp32
# Задать целевой чип
idf.py set-target esp32s3
# Собрать
idf.py build
Зависимости (usb_host_cdc_acm, littlefs) скачаются автоматически при первой сборке
через ESP-IDF Component Manager (main/idf_component.yml).
git clone https://github.com/VibeEngineering-LLC/atomspectra-waterfall-esp32.git
cd atomspectra-waterfall-esp32
# Собрать в Docker-контейнере
docker run --rm -v "$(pwd):/project" -w /project espressif/idf:v5.4 \
bash -c ". /opt/esp/idf/export.sh && idf.py build"
На Windows (PowerShell):
docker run --rm -v "${PWD}:/project" -w /project espressif/idf:v5.4 `
bash -c ". /opt/esp/idf/export.sh && idf.py build"
Результат сборки: build/atomspectra.bin (+ bootloader + partition table).
# Подключить ESP32-S3 UART-портом к ПК
# Определить COM-порт (Device Manager → CH340/CH343/CP2102/FTDI)
idf.py -p COM14 flash
pip install esptool
# Прошить все три образа
esptool.py -p COM14 -b 460800 \
--before default_reset --after hard_reset \
write_flash --flash_mode dio --flash_size 16MB \
0x0 build/bootloader/bootloader.bin \
0x8000 build/partition_table/partition-table.bin \
0x10000 build/atomspectra.bin
http://192.168.4.1/)idf.py -p COM14 monitor
http://<IP-платы>/ в браузере| Кнопка | Что делает |
|---|---|
| ▶ Старт | Запуск набора спектра на приборе (команда -sta) |
| ■ Стоп | Остановка набора (команда -sto) |
| ↻ Сброс | Сброс накопленного спектра (команда -rst) |
| Log / Lin | Переключение логарифмической / линейной шкалы Y |
| CPS / Counts | Переключение единиц Y: скорость счёта / накопленные импульсы |
| Ch / keV | Переключение шкалы X: каналы / энергия в кэВ |
| Сохранить | Сохранить текущий спектр на flash ESP |
| Загрузить | Загрузить сохранённый спектр (overlay поверх живого) |
| XML | Скачать BecqMoni-совместимый файл |
| CSV | Скачать InterSpec-совместимый файл |
Наведите мышь на график — под ним появится информация:
Калибровка автоматически считывается с прибора при подключении (команда -inf).
Если калибровка получена — кнопка keV активирует энергетическую шкалу.
Полином: E(ch) = c₀ + c₁·ch + c₂·ch² + c₃·ch³ + c₄·ch⁴.
Два способа:
idf.py -p COM14 erase-otadata + перепрошитьЕсли хотите использовать настольное ПО BecqMoni или AtomSpectra через WiFi:
<IP-платы> порт 8234TCP-мост и Web UI работают одновременно — данные дублируются.
nvs, data, nvs, 0x9000, 0x6000 (24 KB — WiFi настройки)
phy_init, data, phy, 0xf000, 0x1000 (4 KB)
factory, app, factory, 0x10000, 3M (3 MB — прошивка)
storage, data, littlefs, , 12944K (12.9 MB — сохранённые спектры)
Пароль вашей WiFi-сети сохраняется в разделе nvs открытым текстом. Любой, у кого
есть физический доступ к плате, может считать содержимое flash стандартным инструментом
и извлечь пароль:
esptool.py -p COM14 read_flash 0x9000 0x6000 nvs.bin
strings nvs.bin # среди строк будут SSID и пароль
Так же (без шифрования) хранятся пароль Web UI (basic auth) и OTA. Это осознанный компромисс для типового сценария — плата стоит в доверенном домашнем LAN, а физический доступ к ней есть только у владельца.
Включайте шифрование, если:
Единственная корректная защита пароля в NVS — шифрование flash (NVS encryption
работает поверх него). Заготовка в sdkconfig.defaults лежит
закомментированной:
#CONFIG_SECURE_FLASH_ENC_ENABLED=y
#CONFIG_NVS_ENCRYPTION=y
⚠ НЕОБРАТИМО. Flash encryption прожигает eFuse на чипе ESP32-S3. Процесс нельзя откатить, чип нельзя вернуть в исходное состояние, а в Release-режиме перепрошивка по UART блокируется навсегда. Ошибка в конфигурации может окирпичить плату.
Порядок действий (только осознанно, после чтения документации Espressif):
sdkconfig.defaults.idf.py fullclean && idf.py build.Прошивка по умолчанию поставляется с выключенным шифрованием — решение оставлено за вами именно из-за необратимости.
USB device enumerated: VID=0403 PID=6001-inf через поле ввода в Web UIshproto и Text(...) — признак обмена даннымиidf.py set-target esp32s3build/ и managed_components/, пересоберите