Полная инструкция пользователя для плат Heltec V3, Heltec V4 и Heltec T114. Сборки прошивки: V3 и V4 — 38, T114 — 97.
без интернета радиосвязь LoRa Bluetooth Wi-Fi у V3/V4 почта между рациями
Duga — это рация без интернета. Две платы слышат друг друга напрямую по радио (LoRa, диапазон 868 МГц и близкие к нему по региону), без вышек сотовой связи и без роутера между ними. У платы есть экран, одна кнопка, Bluetooth для телефона, а у Heltec V3 и Heltec V4 — ещё и Wi-Fi.
С телефоном плата говорит через приложение Reticulum: тексты, файлы, всё, что умеет Reticulum, — уходит в эфир кадрами и приходит с другой рации так же. Плата не читает содержимое: шифрование и адресация лежат внутри кадров, до платы им дела нет.
Если платы V3 или V4 подключить к домашнему Wi-Fi с интернетом, они смогут пересылать письма (Reticulum) через сервер в интернете и дальше — в поле, по радио, на вторую плату. Это работает. А вот открыть страницу браузера через рацию — нельзя, и это не недоделка, а голая арифметика радиоканала:
| Величина | Значение | Откуда |
|---|---|---|
| Скорость канала на умолчаниях (SF 8, полоса 125 кГц, код 4/5) | 8 × 125000 / 256 × 4/5 = 3125 бит/с ≈ 391 байт/с | из кода прошивки |
| Законный предел эфира на 868 МГц | не больше 1% времени | регуляторное требование, зашито в прошивку |
| Реальная скорость с учётом предела | 1% от 391 байт/с ≈ 3.9 байта в секунду | расчёт |
| Обычная веб-страница с картинками, ≈100 КБ | 102400 / 3.9 ≈ 26 256 с ≈ 7.3 часа на одну страницу | расчёт |
| Одно письмо в 200 байт (режим «Обычный», SF 8) | ≈51 секунда эфира на письмо, дальше — молчать в сто раз дольше | расчёт из кода |
| То же письмо в режиме «Быстрый» (SF 7, 250 кГц) | ≈15 секунд на письмо | расчёт из кода |
Минута на сообщение — это плохо для чата и отлично для связи там, где нет
никакой другой связи вообще. Плата честно говорит об этом в трёх местах: при включении
(в самопроверке), на экране «шлюз» (строка только письма) и в подсказке
меню под пунктом «Шлюз» (сайтов не будет).
Duga выпускается на трёх платах. У них общая логика меню и радио, но разное железо — и поэтому разные возможности.
| Heltec V3 | Heltec V4 | Heltec T114 | |
|---|---|---|---|
| Кристалл | ESP32-S3 | ESP32-S3 | nRF52840 |
| Экран | OLED 128×64, чёрно-белый | OLED 128×64, чёрно-белый | цветной, 135×240 |
| Имя платы на экране | Heltec V3 | Heltec V4 | — (не печатается) |
| Мощность передатчика | 22 дБм у микросхемы | 22 дБм у микросхемы + усилитель KCT8103L, около 28 дБм на антенне | — |
| Wi-Fi | есть | есть | нет как явления |
| Шлюз в Reticulum | есть | есть | нет |
| Bluetooth | BLE (NimBLE), сопряжение с кодом | то же | BLE (Bluefruit) |
| Разъём GPS | нет вовсе | есть (L76K) | есть (L76K) |
| Свободных контактов | 7 (пять с АЦП) | 3 (один с АЦП) | — (см. раздел 14) |
| Шкала АЦП | 0…4095 | 0…4095 | 0…1023 |
| Порт USB | отдельная микросхема CP2102 — порт всегда на месте | порт создаёт сам кристалл; при сбросе исчезает и возвращается через секунду | — |
Включите плату (кнопка питания на самой плате, если она есть, либо просто подайте питание по USB). Первое, что произойдёт, — заставка на экране, а следом плата сама поднимет радио, Bluetooth и, у V3/V4, Wi-Fi.
Висит две с половиной секунды и убирается любым нажатием кнопки (само нажатие при этом страницу не листает — оно только гасит заставку).
Если прошлый подъём встал на какой-то ступени, вместо имени платы будет написано,
например, стоп: экран — это не поломка новой попытки, а память о прошлой
(подробно — в разделе «Если что-то пошло не так»).
Сразу после включения, ещё до того как поднимется экран, плата печатает в порт USB подробный отчёт о своём здоровье — двадцать с лишним строк: экран, радио, батарея, контакты, книжка ключей, Bluetooth, Wi-Fi. Отчёт нужен не для каждого дня, а для подтверждения, что плата жива, и для разработчика, если что-то работает не так.
| Строка отчёта | «да» означает | «НЕТ» означает |
|---|---|---|
экран SSD1306 | отозвался по адресу 0x3C | молчит: проверьте питание Vext и шину I2C |
свободные контакты | список выводов поднят, ни один не занят ничем другим | — (эта строка всегда «да») |
книжка ключей | поднята, известно сколько знакомых | испорчена / обрублена / не та раскладка — знакомиться заново |
радио SX1262 | поднялось и слушает | не отозвалось, антенный переключатель не настроился, приём не включился |
батарея | напряжение в пределах литиевой банки | ноль (или банки нет — от USB это норма), либо делитель разомкнут/замкнут не так, либо банка ниже нормы |
кнопка PRG | свободна или сейчас нажата | — (всегда «да») |
усилитель V4 (только на V4) | KCT8103L поднят, выводы включены | — (проверить напрямую нечем — сказано честно «включён», а не «работает») |
В конце отчёта — три полезные строки:
надписей не влезло в экран: 0 — счётчик подписей, вылезших за край экрана (ноль здесь — это утверждение, а не умолчание по незнанию);неудач подряд: 0 — сколько подъёмов подряд не дошли до конца (печатается всегда, даже когда ноль);прошлый сброс: подали питание — причина последней перезагрузки словами: подали питание, кнопка сброса, перезагрузка из прошивки, прошивка упала, сторож задач, просело питание и другие — числа берутся из системного регистра, а не придумываются.Тот же отчёт можно затребовать позже командой 0xAB — например, на V4,
где порт при сбросе на секунду исчезает и легко пропустить вывод. Команда не измеряет
заново, а повторяет то, что было измерено при включении, — это сказано в заголовке
самого отчёта.
У платы один экран (128×64 точки, чёрно-белый) и одна кнопка — она же PRG, она же BOOT. Всё управление — короткое и длинное нажатие этой одной кнопки.
Экран построен из трёх полос по высоте, и это не произвольный выбор, а арифметика шрифтов:
| Строки | Что там |
|---|---|
| 0–14 (15 точек) | шапка: имя страницы слева, значки справа |
| 15 | разделительная черта во всю ширину |
| 17–61 (45 точек) | поле страницы — крупная величина и подпись под ней (третьей строки арифметически не помещается; если нужно три строки, все они идут мелким шрифтом на высотах 17, 32, 47) |
| 62–63 | точки текущей страницы |
| Место | Значок | Когда виден | Смысл |
|---|---|---|---|
| x = 2 | имя страницы | всегда | какая страница сейчас открыта |
| x = 84 | W | только когда Wi-Fi включён | обычная буква — своя точка доступа; буква навыворот (белая плашка) — плата ушла в домашнюю сеть. У T114 значка нет — там нет Wi-Fi |
| x = 99 | Э (R) | только когда включена эстафета | плата повторяет чужие кадры в эфир |
| x = 110 | BT | всегда, разными видами | перечёркнут — Bluetooth выключен; обычный — включён; навыворот — идёт сопряжение или телефон подключён |
Bluetooth показывается даже выключенным, а «Э» и «W» — только включёнными, потому что Bluetooth включён у платы из коробки, и его пропажа — это уже беда; эстафета и Wi-Fi выключены из коробки, и их появление означает, что человек сам что-то включил. Показывать стоит то, что отличается от обычного. Заряда батареи в шапке нет — он живёт на своей странице «питание».
Внизу экрана — ряд прямоугольников: широкий (6 точек) — текущая страница, узкие (2 точки) — остальные. Точек ровно столько, сколько страниц в круге сейчас: страницы «Wi-Fi», «шлюз» и «где я» появляются и пропадают из круга сами, когда включена или выключена соответствующая возможность.
Обязательных страниц девять, ещё три — по обстановке. Порядок первых девяти взят у T114 и не переставлен: человек, пришедший с той рации, листает на ощупь.
Крупно — состояние одним словом: ЗАГРУЗКА, В СЕТИ,
ЖДЁТ (нужен телефон), СВЯЗЬ (идёт сопряжение),
НЕТ РАДИО, ОБНОВЛ. (не выключайте), ТИШИНА
(приём был и пропал). Под словом — либо короткое пояснение, либо, если пояснения нет
(обычная работа), — пять полосок сигнала и число дБм справа.
Крупно — число и единица вместе, например -119 дБм. Мелко под ним —
качество N (это SNR, отношение сигнал/шум). Если приёма ещё не было — крупно
НЕТ, мелко приёма не было. Полосок сигнала на этой странице
нет — не помещаются вместе с числом и подписью.
N в шапке — число соседей. Поле — до трёх строк: номер платы (четыре шестнадцатеричные цифры), уровень сигнала в дБм, давность — сколько назад слышали. Свежие соседи идут первыми. Список честен: строится только по собственным маячкам «я здесь» соседних плат, где номер платы идёт открытым текстом — по чужому зашифрованному письму Reticulum плата не может сказать, чьё оно.
Крупно — число пакетов, мелко под ним — байты (после миллиона — в КБ, где килобайт равен 1024 байтам). Порядок именно такой (пакеты крупно, байты подписью) — исправление ошибки старой рации T114: там крупно стояли байты, и человек читал их как число сообщений и ошибался на порядок.
Крупно — заряд в процентах, либо НЕТ, если измерить нечем (ноль здесь
был бы враньём — плата может питаться от USB). Мелко — одна величина, выбранная по
важности: от провода (если питание внешнее), N ч ещё (если
остаток часа и больше), N мин ещё (меньше часа), либо напряжение,
3.9 В (и температура, если есть датчик), либо нет батареи
(если на выводе меньше 2500 мВ). Полосы заряда на этой странице нет — на чёрно-белом
экране она была бы вторым изображением того же самого числа.
Крупно — частота с единицей, мелко под ней — SF N полоса кГц. Мощности
здесь нет намеренно: платы с разной мощностью друг друга слышат, а платы с разным SF —
нет, поэтому именно SF и полоса важны для связи, а мощность — не про совместимость,
её видно в самопроверке при включении.
Крупно — занятость эфира в процентах за последний час, с одним знаком после запятой.
Мелко — режим отношения к закону: по закону: ждёт (заняли уже 1% и ждём),
по закону: 1% (ещё есть запас), предупредили / скажем у 1%
(режим «предупреждать»), без узды (границ нет). «Ждёт» относится только к
своему маячку и эстафете — тревога, маяк спасения, ответ хозяину и то, что человек послал
сам, уходят даже при достигнутом пределе.
Три строки: слева — имя события, справа, прижато к краю, — давность. Свежее сверху.
Записей в памяти ровно три. Дословные имена событий: включена, радио,
телефон +, телефон -, сопряж., моя тревога,
чужая SOS, режим, частота, антенна,
сосед, копилка. Пустой журнал: крупно ПУСТО, мелко
ничего не было.
Три строки: номер платы в эфире (шестнадцатеричный), номер сборки и дата, и какая это плата. Номер платы — единственное число, по которому две рации узнают друг друга: оно же в маячке «я здесь», оно же в списке «рядом» у соседа, оно же в имени Wi-Fi-сети и Bluetooth.
Появляется в круге только пока поднята своя точка доступа. Крупно — пароль точки, восемь цифр (ведущие нули не теряются — пароль хранится строкой). Мелко под ним — имя сети, ещё ниже — адрес панели. Страница исчезает, если плата ушла в домашнюю сеть: показывать ключ от несуществующей двери хуже, чем не показывать ничего.
Появляется, только когда шлюз включён. Строка 1 (прописными) — состояние: ВЫКЛ,
НЕТ СЕТИ, ИЩЕМ, В СЕТИ. Строка 2 — то, что нужно
именно сейчас: подсказка что включить, либо адрес платы в домашней сети (единственное
место, где его вообще можно прочесть через неделю после установки), либо, если очередь
занята, — эфир занят или число писем в очереди. Строка 3 стоит всегда:
только письма — граница-напоминание, что это не браузер.
Появляется, только когда включён модуль GPS и страница не отключена. У платы V3
разъёма GNSS нет вовсе — на ней этот файл даже не собирается в прошивку, и страница
никогда не появится. У V4 разъём есть (модуль L76K). Пока модуля нет — крупно ВЫКЛ;
пока ищет спутники — ИЩУ, мелко число спутников; когда точка есть — широта
крупно, долгота мелко, по пять знаков после точки — «в таком виде число вбивается в карту
как есть».
Показывается пару секунд сразу после принятого пакета и уходит сам, не дожидаясь
нажатия. Верхняя полоса залита белым, на ней чёрными буквами — ПРИЁМ дБм,
ниже, во весь экран — число RSSI самым крупным шрифтом прошивки (45-й кегль — он
используется только тут).
Граница короткого и длинного нажатия — 600 мс. Длинное нажатие срабатывает, не дожидаясь отпускания кнопки — иначе человек держит кнопку и не знает, сработало ли уже. Нажатие короче 30 мс считается дребезгом и не считается вовсе.
| Где | Коротко | Долго |
|---|---|---|
| обычная страница | следующая страница по кругу | открыть меню |
| меню | следующий пункт по кругу | выбрать |
| список / вопрос | следующий вариант | принять |
| экран параметров | изменить значение | следующий параметр |
| экран погашен | только зажигает, ничего не выбирает | тоже только зажигает |
| заставка | убрать заставку (страницу не листает) | убрать заставку |
| экран кода сопряжения | убрать код (сопряжение не отменяется) | тоже убрать код |
| ввод пароля знакомства | +1 к цифре под курсором | следующая цифра, с восьмой — начать знакомство |
| работающая тревога | ничего (нарочно) | отбой тревоги |
| вопрос (тревога, маяк, завод, круг, приглашение) | «нет» / отказ | «да» / согласие |
| чужая тревога на экране | убрать сообщение (вернётся, если маячок придёт снова) | то же |
| проверка дальности | сменить роль (шлём ↔ приём), счёт начинается заново | выйти |
| проверка антенны | закрыть | закрыть |
Отказ должен быть лёгким движением, согласие — трудным. И ещё: первое нажатие в темноте только зажигает свет — и длинное тоже, потому что человек, взявший рацию в руку, не должен случайно оказаться в меню оттого, что задержал палец.
Минута без нажатий — экран гаснет (то же число, 60000 мс, что и у T114: «минута» здесь не число, а обещание пользователю). Экран не гаснет, пока: висит заставка; показан код сопряжения (шесть цифр, которые человек прямо сейчас набирает в телефоне); держится чужая тревога; идёт своя тревога или висит вопрос о ней.
Экран гаснет даже с открытым меню — забытое на минуту меню лучше погасить, чем держать подсвеченным. Проснувшись, человек увидит ту же строку, на которой стоял.
Экран сам зажигается ровно от одного события — чужой тревоги. Обычный принятый пакет экран не зажигает: человек гасил экран, чтобы тот не светил, а не чтобы светил пореже.
Погасить руками — пункт меню «Погасить экран». Разбудить — любое нажатие, либо с телефона настройкой 31 (только на T114 — у ESP-плат такой настройки нет, там дистанционного пробуждения не сделано).
Долгое нажатие на любой обычной странице открывает меню. Список занимает весь экран,
видно три строки сразу. Выбранная строка инвертируется целиком (белая плашка, чёрные
буквы) — стрелки слева нет намеренно, она отняла бы столбец точек у каждой строки.
Справа, если пунктов больше трёх, — узкая полоска прокрутки. Внизу, на высоте 47, —
подсказка мелким шрифтом, по умолчанию долго — выбор.
| # | Имя (RU) | Имя (EN) | Хвост | Что делает долгое нажатие |
|---|---|---|---|---|
| 1 | Яркость | Brightness | 1/4…4/4 | Меняет ступень контраста по кругу (20, 80, 160, 255 — из коробки самая яркая). Меню не закрывается. |
| 2 | Погасить экран | Screen off | — | Закрывает меню и гасит экран. Будится любым нажатием. |
| 3 | Bluetooth | Bluetooth | вкл / выкл | Переключает Bluetooth без вопроса «точно?». Меню не закрывается. |
| 4 | Сопряжение | Pairing | — | Сначала включает Bluetooth, если был выключен, затем забывает все прежние пары. Меню закрывается. Код появится сам, когда его попросит телефон. |
| 5 | Дальность | Range test | — | Открывает проверку дальности с роли передатчика. |
| 6 | Антенна | Antenna | — | Запускает проверку антенны (двенадцать замеров шума). |
| 7 | Маячок | Beacon | вкл / выкл | Включает/выключает маячок «я здесь» (раз в 2 минуты). Из коробки включён. |
| 8 | Эстафета | Relay hop | вкл / выкл | Повтор чужого кадра в эфир. Из коробки выключена. |
| 9 | Тревога | Alarm | — | Открывает вопрос «подать сигнал?». |
| 10 | Регион | Region | имя страны или частота | Открывает список регионов. |
| 11 | Свои каналы | My channels | — | Открывает список из трёх ячеек. |
| 12 | Почта | Courier | выкл / память / флеш | Перебирает три состояния почтальона по кругу. |
| 13 | Знаком. | Introduce | 120с…1с, иначе выкл | Включает/выключает знакомство по радио на две минуты. |
| 14 | Пароль | Password | — | Открывает ввод восьми цифр — знакомство по паролю. Плата сама предлагает случайные восемь цифр. |
| 15 | Знакомые | Known | — | Открывает список знакомых из книжки ключей. |
| 16 | Круг своих | My circle | — | Открывает страницу круга. |
| 17 | Режим радио | Radio mode | — | Открывает вопрос о смене режима. |
| 18 | МАЯК SOS | SOS BEACON | вкл / выкл | Открывает вопрос о маяке спасения. |
| 19 | Ретранс. | Repeater | вкл / выкл | Обряд «плата на столбе»: эстафета и маячок подняты, почта в память, Bluetooth снят, экран погашен. Без подтверждения. |
| 20 | Язык | Language | RU / EN | Открывает список языков. |
| 21 | Параметры | Parameters | — | Открывает редактор шести ручных параметров. |
| 22 | Wi-Fi | Wi-Fi | выкл / вкл / точка / дом / число гостей | Переключает Wi-Fi по кругу. Меню не закрывается. |
| 23 | Шлюз | Gateway | выкл / нет сети / ищем / в сети | Переключает шлюз. Меню не закрывается. |
| 24 | Эфир | Airtime | по закону / предупр. / без узды | Перебирает три режима отношения к закону по кругу. |
| 25 | Поднять всё | Full start | — | Забывает счёт неудачных подъёмов и сразу перезагружает плату. Без подтверждения — действие ничего не теряет. |
| 26 | К заводскому | Factory reset | — | Открывает вопрос «стереть всё?». |
| 27 | Перезагрузка | Restart | — | Гасит экран, закрепляет почту во флеш и перезагружает плату. |
| 28 | Выход | Exit | — | Закрывает меню. |
Хвосты-переключатели нужны потому, что «Эстафета» сама по себе не говорит, включит нажатие или выключит, и человек жмёт наугад. Хвост у пункта «Знаком.» — оставшиеся секунды, а не «вкл»: «вкл» у пункта, который через минуту сам станет «выкл», человек прочтёт как заевшую кнопку.
Обычная подсказка — долго — выбор. На четырёх пунктах она заменяется на
более полезную:
| Пункт | Состояние | Подсказка внизу |
|---|---|---|
| Wi-Fi | режим домашней сети | имя домашней сети, либо «сеть не задана» |
| поднята своя точка | код 12345678 — единственное место в прошивке, кроме страницы «Wi-Fi», где виден пароль точки | |
| Wi-Fi выключен | панель в сети | |
| Шлюз | включён | сайтов не будет |
| выключен | письма серверу | |
| Эфир | всегда | живое измерение, например 0.3% из 1% (в законном режиме) или 0.3% за час (в остальных двух) |
| Почта | несём письма | несу N |
| флеша нет, режим не «флеш» | флеша нет | |
| иначе | цена состояния: «чужое не носим» / «в памяти, спасу» / «во флеш, износ» |
Список тем же видом, что и меню. У текущего региона — галочка «✓». Подсказка внизу —
главное слово экрана: менять у ВСЕХ! — регион уводит рацию на другую
частоту, и пока туда не перейдут остальные, связи не будет.
| Регион | Частота, кГц |
|---|---|
| RU 868 | 868900 |
| EU 868 | 869525 |
| EU 433 | 433875 |
| US 915 | 915000 |
| ANZ 915 | 915000 |
| CN 470 | 470000 |
| JP 923 | 923000 |
| KR 920 | 921900 |
| IN 865 | 866000 |
| TW 923 | 923000 |
Список из шести строк «имя — значение», окно прокрутки на три строки: SF,
Полоса, Кодир., Мощн., МГц, кГц.
Подсказка внизу: коротко менять.
| Параметр | Допустимые значения (по кругу) |
|---|---|
| SF | 5, 6, 7, 8, 9, 10, 11, 12 |
| Полоса, кГц | 62, 125, 250, 500 |
| Кодирование | 5, 6, 7, 8 (то есть 4/5…4/8) |
| Мощность | от 2 дБм шагом 2 до предела платы (22 дБм), затем снова с 2 |
| МГц | по кругу 150…960 (весь диапазон SX1262) |
| кГц | шаг 100, по кругу 0…900 |
Три строки: «Свой 1», «Свой 2», «Свой 3». Занятая ячейка подписана частотой
(Свой 1 868.9), пустая — Свой 1 пусто. Долгое нажатие
открывает экран действия с ячейкой:
Подписи снизу: у «ОТМЕНА» — «как было»; у «ВКЛЮЧИТЬ» — что лежит в ячейке или «ячейка пуста»; у «ЗАПИСАТЬ» — что именно ляжет (нынешние настройки радио).
Список из двух строк, каждая написана на своём языке; у текущего — галочка «✓».
| Режим | SF | Полоса | Код | Примечание |
|---|---|---|---|---|
| Дальний (Far) | 12 | 125 000 | 4/8 | |
| Обычный (Normal) | 8 | 125 000 | 4/5 | умолчание |
| Быстрый (Fast) | 7 | 250 000 | 4/5 | |
| Спасение (Rescue) | 12 | 31 250 | 4/8 | в меню не предлагается — только маяком SOS или по проводу |
Крупно — восьмизначная метка круга (шестнадцатеричная), мелко — сверьте вслух
или был чужой круг. Если круга нет: крупно НЕТ, мелко
заведётся при знакомстве.
Список до восьми строк: номер знакомого, и если помечен «беречь» — приписка « берегу».
Если знакомых нет: крупно НЕТ, мелко меню «Пароль». Долгое
нажатие на знакомом открывает вопрос: отмена / БЕРЕЧЬ / ЗАБЫТЬ — порядок
начинается с отмены нарочно: первое долгое нажатие не должно стирать ключ. «Забыть»
стирает ключ насовсем и сразу кладёт книжку во флеш: «рацию теряют, а не выключают».
СТЕРЕТЬ ВСЁ. Мелко: знакомства, круг, почта.
Заводской сброс необратим — читайте раздел «Если что-то пошло не так» перед тем как соглашаться.Bluetooth у платы — это тот же «провод», что и USB, только по воздуху: телефон говорит с платой теми же кадрами KISS, что и Reticulum по кабелю, без единого нового формата. Bluetooth поднимается сам при включении платы и не спрашивает разрешения.
Плата видна как Duga XXXX, где XXXX — четыре шестнадцатеричные цифры
заводского номера платы (то же самое число, что на странице «о плате», в маячке «я
здесь» и в имени Wi-Fi-сети).
Duga XXXX.BT в шапке страниц станет навыворот (белая плашка) — телефон
подключён.Если сопряжение не идёт — откройте меню и выберите пункт «Сопряжение»: он включит Bluetooth (если был выключен) и сотрёт все прежние пары. Это нужно, в частности, после перепрошивки: плата ключи потеряла, а телефон свою запись помнит и предъявляет старый ключ — Android при этом честно ошибается и говорит «неверный PIN-код» про код, который на самом деле верен.
| Число | Состояние | Как выглядит |
|---|---|---|
| 0 | выключен | BT перечёркнутое |
| 1 | включён | BT обычное |
| 2 | идёт сопряжение | BT навыворот (но на V3/V4 в этот момент виден отдельный экран кода) |
| 3 | телефон подключён | BT навыворот |
Ни один байт KISS не дойдёт до разбора без состоявшейся пары: канал заперт на запись
(WRITE_AUTHEN), а уведомления прошивка запирает сама. Иначе любой прохожий с
телефоном мог бы сменить частоту, режим и мощность чужой рации или вычерпать копилку писем.
Пар NimBLE запоминает до трёх, и они переживают перезагрузку — шесть цифр не пришлось бы набирать при каждом подключении.
ЭКРАНА НЕТ — код сопряжения показывать негде. код на всё время работы платы: 482913.
запишите его: после перезагрузки он будет другим.Отдельной настройки-выключателя для Bluetooth в списке настроек нет — переключить
можно только пунктом меню «Bluetooth». Его же полностью снимает режим ретранслятора.
При бережном подъёме (две неудачи подряд) Bluetooth пропускается, и в порт печатается:
Bluetooth ПРОПУЩЕН: бережный подъём.
У T114 Wi-Fi нет как явления — у кристалла nRF52840 нет такого радио вовсе. Всё, что ниже, касается только V3 и V4.
Третье состояние («домашняя сеть») появляется в круге только тогда, когда домашняя сеть уже задана. Пока не задана — состояний два: выкл/вкл.
Из выключенного состояния всегда поднимается своя точка, а не последний режим: человек, дошедший до этого пункта руками, идёт к панели, а панель достижима наверняка только через свою точку. Дорога назад из домашней сети — жать этот же пункт, пока хвост не станет «точка»: плата, ушедшая в домашнюю сеть с неверным паролем, не подключится туда никогда — и без этой дороги назад унесла бы с собой панель, то есть единственное место, где этот пароль вообще задают.
| Имя сети | Duga XXXX — «Duga», пробел, четыре шестнадцатеричные цифры номера платы |
| Пароль | 8 цифр, рождается сам при первом подъёме точки, потом хранится строкой (ведущие нули не теряются) |
| Адрес панели | 192.168.4.1 |
Где увидеть пароль своей точки — ровно в трёх местах: на странице круга «Wi-Fi»
(крупно, восемью цифрами), в подсказке под пунктом меню «Wi-Fi» (код 12345678)
и в порту при включении. Больше нигде.
http://192.168.4.1/.Имя и пароль домашней сети задаются в панели или командой по проводу 0xAC.
Одной кнопкой на плате их не задать — кнопка одна, а пароль бывает в шесть десятков знаков.
Адрес, который выдал роутер, читается тремя способами: на экране страницы «шлюз» (вторая строка), в панели, и в порту при включении.
| № | Смысл | Значения |
|---|---|---|
| 43 | Wi-Fi включён | 0/1. У T114 этого номера нет и не будет. |
| 44 | пароль точки доступа числом | только чтение (ведущий ноль в числе теряется — читайте лучше страницу «Wi-Fi» на экране) |
| 70 | режим Wi-Fi | 0 своя точка, 1 домашняя сеть |
| 71 | длина пароля домашней сети | чтение; запись разрешена ровно одна — ноль: «забудь сеть» |
Шлюз — это мост между радиоэфиром и сервером Reticulum в интернете. Плата дома подключается к домашнему Wi-Fi, оттуда — к серверу, и всё, что она слышит в эфире, уносит на сервер, а всё, что приходит с сервера, отдаёт в эфир.
Пункт меню «Шлюз» (или настройка 61). Меню при этом не закрывается — хвост
строки меняется на глазах: нет сети → ищем → в сети. Шлюзу нужна домашняя
сеть, поэтому пункт «Wi-Fi» стоит соседней строкой: чаще всего «нет сети» лечится
именно им.
| № | Имя | Значит |
|---|---|---|
| 0 | ВЫКЛ | человек не включал |
| 1 | НЕТ СЕТИ | Wi-Fi выключен или плата не в домашней сети |
| 2 | ИЩЕМ | сеть есть, до сервера не достучались |
| 3 | В СЕТИ | соединение с сервером стоит |
| № | Что | Значения |
|---|---|---|
| 61 | шлюз включён | 0 выкл, 1 вкл |
| 62 | что со шлюзом сейчас | только чтение |
| 63 | обрамление кадров в TCP | 0 HDLC, 1 KISS, 2 «сам» (умолчание) |
| 64 | доля эфира шлюзу | 1..10 тысячных долей часа, умолчание 5 (половина законного процента) |
| 65 | занятость эфира за час | только чтение; 10 = ровно 1% |
| 66 | кадров ушло из эфира на сервер | только чтение |
| 67 | кадров пришло с сервера | только чтение |
| 68 | из них уехало в эфир | только чтение |
| 69 | из них выброшено (эфир занят/тесно) | только чтение |
| 72 | режим отношения к эфиру | 0 по закону, 1 предупреждать, 2 без границ |
| 91 | адрес сервера | 4 байта IPv4, старшим вперёд; 0 — «бери вшитый» |
| 92 | порт сервера | 0 — «бери вшитый» |
Вшитые по умолчанию значения: адрес 83.171.203.245, порт 4965
(умолчание TCPServerInterface у Reticulum). Свой адрес нужен на случай, когда не работает
ничего, включая сеть до общего сервера — с настройками 91/92 шлюз доходит до сервера,
поднятого на ноутбуке в той же комнате, без единого байта из интернета. Имени сервера
(DNS) в прошивке нет намеренно: DNS сам требует работающей сети провайдера.
Обрамление — единственное во всём шлюзе, чего нельзя узнать с самой платы и нельзя проверить по её поведению: при неверном выборе TCP встаёт, счётчики растут, плата пишет «в сети», сервер пишет «клиент подключился» — и ни одного письма не проходит никогда.
Поэтому умолчание — «сам»: оба варианта обрамления начинают кадр своим знаком
границы (0x7E у HDLC, 0xC0 у KISS), и первый пришедший знак
отвечает на вопрос однозначно. Пока сервер молчит, плата пробует HDLC; если за 20 секунд
она отправила кадр и не получила ни одной границы — меняет предположение и переподключается.
Определённое сохраняется во флеш.
| Режим | Что делает |
|---|---|
| по закону | держим 1% и не выпускаем ни миллисекунды сверх |
| предупреждать | считаем и говорим вслух, подходя к пределу (порог 0.7%) |
| без границ | не спрашиваем ничего |
Умолчание при первом включении — «по закону»: плата из коробки должна быть законной у любого, кто включил её не задумываясь. Выйти за предел — осознанное действие в меню. Круг замкнут (по закону → предупреждать → без границ → по закону) — дорога назад к закону обязана быть не длиннее дороги от него.
Даже при достигнутом пределе уходят: тревога, маяк спасения, ответ хозяину и то, что человек послал сам. Придерживаются только свой маячок и эстафета.
В меню рядом стоят два пункта — «Знаком.» и «Пароль», и их легко перепутать. Разница простая:
Способ передать соседу свои настройки радио, чтобы он перешёл на ваш канал. Ключей это не заводит и переписку не закрывает.
120с, 119с…Внутри: плата уходит с рабочего канала на общий «канал знакомства» (частота региона +
300 кГц) и на это время глуха на своём канале — приёмник один. Раз в 6…13 секунд (у каждой
платы период свой, из заводского номера кристалла — чтобы две платы не накладывались
передачами систематически) плата шлёт зов с меткой DUGA+ и своим профилем:
регион, частота, полоса, SF. Через 120 секунд плата возвращается на свой канал сама.
На второй рации, как только зов услышан, поверх любой страницы появляется вопрос:
Чего у V3/V4 нет: ближнего знакомства по Bluetooth. У T114 знакомство умеет ещё и через объявления BLE — здесь этой половины нет вовсе.
Двое заводят общий ключ, которым потом закрывается переписка. Знакомый записывается в книжку ключей — это то, ради чего вообще существует пункт «Знакомые».
| Шаг | Строка хода (RU) |
|---|---|
| 0 — набор | корот +1, долго дальше |
| 1 — зову | зову... |
| 2 — отвечаю | отвечаю... |
| 3 — подтверждаю | подтверждаю... |
| 4 — успех | ПОЗНАКОМИЛИСЬ |
| 6 — нет случайности | нет случайности |
| прочее (5) | не тот пароль |
Короткое нажатие на идущем или закончившемся знакомстве закрывает страницу; само знакомство при этом не отменяется — оно живёт своей минутой и кончится само.
Шаги 1–3 идут открытым текстом (половины X25519 и созданы, чтобы ходить открыто). Единственный закрытый шаг — четвёртый, про общий круг: ключ круга открытым текстом в эфир не выходит ни разу. Если оба нажали одновременно — у кого номер платы меньше, тот продолжает звать, у кого больше — переходит в ответ, без лишних переговоров.
Меню → «Знакомые». Там же их можно беречь (не вытеснять при переполнении книжки) или забыть. Забытый стирается сразу, и книжка тут же кладётся во флеш — рацию теряют, а не выключают.
Плата шлёт в эфир восемь байт DUGA-SOS и свой номер раз в тридцать секунд,
пока человек не отменит. Ни телефон, ни Reticulum для этого не нужны — передатчик тот же,
что у обычного маячка «я здесь».
Как включить: меню → «Тревога» → вопрос → долгое нажатие. Или настройка 13 с телефона.
Короткое нажатие на экране чужой тревоги убирает сообщение, но оно вернётся, если
маячок придёт снова: убрать сообщение можно, отменить чужую беду нельзя. В журнал
пишется событие чужая SOS.
Одно нажатие вместо шести настроек — маяк спасения сразу:
Как включить: меню → «МАЯК SOS» → вопрос → долгое нажатие. Или настройка 32. Экран вопроса — не инвертирован, в отличие от тревоги: белое поле здесь означало бы «беда прямо сейчас», а маяк включают и заранее, уходя в лес.
Выключение возвращает всё как было — до последнего числа: частоту, полосу, SF, код, мощность, режим и состояние маячка. Пока маяк включён, это видно только хвостом пункта меню «МАЯК SOS вкл» — единственное такое место, не заходя в «режим радио».
Вдвоём и никак иначе: одна плата шлёт маячок раз в пять секунд, вторая считает, сколько дошло. Начинается всегда с роли передатчика — если обе платы начнут приёмниками, в эфире не будет ничего, и обе покажут «ЖДЁМ». Роль меняется коротким нажатием и видна в шапке справа.
Честно о том, что это за проверка: измерить КСВ плата не может — у радиочипа SX1262 нет измерителя отражённой мощности. Что она действительно умеет — послушать канал и посмотреть на уровень шума: с антенной эфир шумит (−115…−100 дБм), без неё шуметь нечему. Двенадцать замеров, порог −118 дБм.
Итог висит пять секунд от готовности; закрыть можно любым нажатием.
Эта таблица — не для повседневного чтения глазами, а справочник для того, кто управляет платой с телефона или скриптом по проводу/Bluetooth. Формат команды:
[0xA5][номер] | запрос — сколько сейчас |
[0xA5][номер][4 байта, старший вперёд] | запрос — поставить столько |
[0xA5][номер][4 байта] | ответ — сколько СТАЛО (не то, о чём просили) |
[0xA5][номер][0xFF 0xFF 0xFF 0xFF] | ответ — такой настройки нет |
Отвечать «нет» честнее, чем отвечать нулём: ноль человек и скрипт читают как измерение. Номера обязаны совпадать у V3/V4 и T114 — приложение и скрипты написаны один раз на два изделия, и совпадение проверяется сборкой прошивки, а не честным словом.
| № | Смысл | Значения | ESP (V3/V4) | T114 |
|---|---|---|---|---|
| Радио | ||||
| 1 | частота | Гц, 150 000 000…960 000 000 | да | да |
| 2 | полоса | Гц; 62000, 125000, 250000, 500000 | да | да |
| 3 | SF | 5…12 | да | да |
| 4 | скорость кода | 5…8 (4/5…4/8) | да | да |
| 5 | мощность | дБм, 2…22 (у V4 в эфире на ~6 дБ больше — усилитель) | да | да |
| 6 | регион | 0…9 по таблице регионов | да | да |
| 7 | режим радио | 0 Дальний, 1 Обычный, 2 Быстрый, 3 Спасение | да | да |
| Экран и поведение | ||||
| 8 | яркость | 0..255 | нет (на ESP четыре ступени в меню) | да |
| 9 | экономия | 0/1 | нет | да |
| 10 | эстафета | 0/1, из коробки 0 | да | да |
| 11 | маячок «я здесь» | 0/1, из коробки 1 | да | да |
| 12 | почтальон | 0 выкл, 1 память, 2 флеш; из коробки 1 | да | да |
| 13 | тревога | 0/1 | да | да |
| 14 | радио включено | 0/1 | да | да |
| Знакомство | ||||
| 15 | приглашение | чтение 0/1 «ждёт ответа»; запись 1 принять, 0 отбросить | да | да |
| 16 | знакомство по радио | чтение — сколько секунд осталось; запись 1 начать (120с), 0 прекратить | да | да |
| Счётчики знакомства по Bluetooth (17..30) | ||||
| 17..30 | знакомство по BT и его счётчики | — | отвечают нулями (пути по BLE нет) | да |
| 19 | есть ли соединение по BT | 0/1 | да | да |
| Прочее | ||||
| 31 | разбудить экран | чтение 1 свет/0 темно; запись — разбудить | нет | да |
| 32 | маяк спасения | 0/1 | да | да |
| 33 | ретранслятор | 0/1 | да | да |
| 34 | номер сборки прошивки | только чтение | да | да |
| 35 | язык | 0 русский, 1 английский | да | да |
| 36 | сколько контактов у платы | чтение (V3: 7, V4: 3) | да | да |
| 37 | какой контакт настраиваем (курсор) | 0..N−1 | да | да |
| 38 | номер вывода выбранного | чтение | да | да |
| 39 | роль контакта | 0 не занят, 1 выход, 2 вход, 3 вход с подтяжкой, 4 датчик, 5 плавно | да | да |
| 40 | значение контакта | выход — задать, вход — прочитать | да | да |
| 41 | чем стать при включении | как роль | да | да |
| 42 | есть ли у вывода АЦП | чтение | да | да |
| 43 | Wi-Fi включён | 0/1 | да | нет (Wi-Fi нет как явления) |
| 44 | пароль точки доступа числом | только чтение | да | нет |
| 45 | номер платы в эфире | только чтение | да | нет |
| Хозяева и команды по радио (46..60) | ||||
| 46 | сколько мест в списке хозяев | чтение | да | да |
| 47 | какое место сейчас настраиваем | да | да | |
| 48 | номер платы-хозяина | 0 — вычеркнуть | да | да |
| 49 | рубеж счётчика | запись 0 — сбросить | да | да |
| 50 | слушаться команд из эфира | 0/1 | да | да |
| 51 | длина пароля команд | только чтение | да | да |
| 52..60 | счётчики исполнения и отказов команд | только чтение (кроме 49) | да | да |
| Шлюз и Wi-Fi (61..72) — только V3/V4 | ||||
| 61 | шлюз включён | 0/1 | да | нет |
| 62 | что со шлюзом | 0 выкл, 1 нет сети, 2 ищем, 3 в сети | да | нет |
| 63 | обрамление кадров TCP | 0 HDLC, 1 KISS, 2 «сам» | да | нет |
| 64 | доля эфира шлюзу | 1..10 тысячных, умолчание 5 | да | нет |
| 65..69 | счётчики эфира и кадров шлюза | только чтение | да | нет |
| 70 | режим Wi-Fi | 0 своя точка, 1 домашняя сеть | да | нет |
| 71 | длина пароля домашней сети | чтение; запись только 0 | да | нет |
| 72 | режим эфира | 0 по закону, 1 предупреждать, 2 без границ | да | да |
| Шифрование и книжка ключей (73..77) | ||||
| 73 | как поднялась книжка ключей | 0 цела, 1 первый раз, дальше — беда | да | да |
| 74 | сколько знакомых в книжке | да | да | |
| 75 | закрывать ли маячки и тревогу | 0/1 | да | да |
| 76 | ход знакомства по паролю | 0 не идёт, 1 зову, 2 отвечаю, 3 подтвердил, 4 вышло, 5 не вышло, 7 про круг | да | да |
| 77 | номер следующей посылки | да | да | |
| GPS (78..87) | ||||
| 78 | модуль включён | 0/1 | да (V4) | да |
| 79 | состояние GPS | 0 выключен, 1 ищет, 2 точка есть | да (V4) | да |
| 80 | класть координаты в маячок | 0/1 | да (V4) | да |
| 81 | показывать страницу «где я» | 0/1 | да (V4) | да |
| 82 | отдавать телефону и по проводу | 0/1 | да (V4) | да |
| 83 | широта | стотысячные доли градуса, со знаком | да (V4) | да |
| 84 | долгота | там же | да (V4) | да |
| 85 | спутников | да (V4) | да | |
| 86 | строк NMEA разобрано | чтение | да (V4) | да |
| 87 | отброшено по контрольной сумме | чтение | да (V4) | да |
| Круг своих (88..90) | ||||
| 88 | заведён ли круг | 0/1 | да | да |
| 89 | метка круга | четыре байта одним числом | да | да |
| 90 | встретился чужой круг при знакомстве | да | да | |
| Шлюз: адрес/порт и сторож подъёма (91..95) — только V3/V4 | ||||
| 91 | адрес сервера | 4 байта IPv4 старшим вперёд; 0 — «бери вшитый» | да | нет |
| 92 | порт сервера | 0 — «бери вшитый» (4965) | да | нет |
| 93 | бережный подъём | чтение: 0 прошлый подъём дошёл до конца, 1..250 — столько неудач подряд. Запись: только ноль — «поднять всё» | да | нет |
| 94 | причина прошлого сброса | чтение (1 питание, 3 из прошивки, 4 падение, 6 сторож задач, 9 просело питание) | да | нет |
| 95 | на какой ступени встал прошлый подъём | чтение: 0 дошёл, иначе 1 начало, 2 экран, 3 радио, 4 Bluetooth, 5 Wi-Fi, 6 шлюз, 15 готово | да | нет |
Спросив 61..71 или 91..95 у T114, человек получит честное «такой настройки нет» — это не ошибка связи, а честный ответ прошивки.
| Команда | Что делает |
|---|---|
0xA0 | счётчики Bluetooth |
0xA2 | числа копилки почты: сколько несём, байт, теряли ли, повторов отсеяли, когда трогали кнопку |
0xA5 | настройка по номеру (таблица выше) |
0xA7 | имя контакта текстом |
0xA8 | правило «если — то», восемь байт (раздел 14) |
0xA9 | команда контактам чужой платы по радио |
0xAA | пароль на такие команды |
0xAB | повторить отчёт о подъёме — не измеряет заново, повторяет измеренное при включении |
0xAC | домашняя сеть Wi-Fi (раздел 7) |
0xAD | знакомство по паролю (раздел 9) |
0xAE | уйти в загрузчик; требует слова DFU в теле кадра |
0xAF | вернуть к заводскому |
T114 — младшая по радио (нет Wi-Fi и шлюза), но с более крупным и цветным экраном. Логика меню и радио та же, что у V3/V4, но многое устроено иначе — ниже только отличия.
Цветная панель 135×240 точек (у V3/V4 — чёрно-белый OLED 128×64). Экран физически стоит «набок»: строки текста пишутся вдоль длинной стороны, чтобы получить 240 точек длины вместо 135 — на 78% больше места. Ниже картинки нарисованы для читаемости горизонтально; на самой плате те же надписи идут вдоль длинного бокового края экрана.
| Цвет | Что значит |
|---|---|
| белый (CV_TEKST) | обычный текст |
| коралловый (CV_KORAL) | фирменный акцент |
| серый (CV_SERYY) | приглушённый, второстепенный текст |
| зелёный (CV_ZELENYY) | всё хорошо |
| красный (CV_KRASNYY) | тревога |
| жёлтый (CV_ZHELTYY) | внимание |
В боковой шапке: слово duga, где буква «u» коралловая, остальные белые;
имя страницы серым по центру; значок BT цветом (зелёный — телефон
подключён, жёлтый — сопряжение, серый — включён, красный и перечёркнутый — выключен);
«Э» зелёным — только когда эстафета включена. Значка Wi-Fi нет и быть не может.
Инверсия тревоги здесь — не белый фон, а заливка красным.
Кнопка тоже одна, правило то же, тайминги те же: граница короткого и длинного нажатия — 600 мс, минута без нажатий гасит подсветку. В режиме глубокой экономии подсветка гаснет уже через 20 секунд.
Числа 600 и 60000 мс совпадают с V3/V4 намеренно: палец у человека один и привычка одна, а «минута» здесь — не число, а обещание пользователю, одно на два изделия.
| # | Страница |
|---|---|
| 1 | главная |
| 2 | сигнал |
| 3 | соседи (шесть строк, у V3/V4 — три) |
| 4 | принято |
| 5 | питание |
| 6 | радио |
| 7 | эфир |
| 8 | журнал (полные имена событий, а не сокращённые) |
| 9 | о плате |
| 10 | ПОДЕЛИТЬСЯ — QR-код с настройками канала |
| 11 | где я (только когда модуль GPS есть) |
Страниц «Wi-Fi» и «шлюз» нет — нечему их наполнять. На странице «принято» помещаются ещё две величины: «+N» эстафеты и «ждёт N» почтальона (на 128 точках V3/V4 они не влезли). На странице «эфир» есть вторая строка — наработка «сколько плата не выключалась».
Порядок первых пунктов у обеих плат одинаков намеренно — человек, пришедший с той рации, находит нужное на ощупь. «Wi-Fi», «Шлюз», «Эфир» и «Поднять всё» у V3/V4 приписаны за концом общего порядка, а не вставлены в середину.
| T114 | V3/V4 | Почему отличается |
|---|---|---|
| Экономия (Power save) | — | глубокой экономии на ESP не сделано: экран сам не гаснет иначе, а «реже маячок» стоит сотых долей процента тока — пункт, который ничего не меняет, хуже отсутствующего |
| Нагрев (Heat) | — | тепловая защита nRF52; человек выбирает, жалеть плату или нет |
| Почтальон | Почта | «Почтальон память» — 140 точек при 122 доступных, хвост пропадал бы |
| Знакомство | Знаком. | то же — не помещался хвост с числом секунд |
| Ретранслятор | Ретранс. | «Ретранслятор выкл» — 150 точек при 122 |
| — | Wi-Fi | у nRF52840 Wi-Fi нет как явления |
| — | Шлюз | шлюзу нужен Wi-Fi |
| — | Поднять всё | сторож подъёма написан только для ESP |
Экономия на T114: экран гаснет втрое быстрее, маячок уходит впятеро реже. Маяк спасения на T114 ещё и сам включает глубокую экономию, чтобы экран гас за двадцать секунд — на V3/V4 экономии нет вовсе, включать там нечего.
Модуль L76K, разъём GNSS разведён заводом, скорость 9600 (заводская скорость модуля).
nRF52840 несёт загрузчик Adafruit, и он поднимает плату съёмным диском.
HT-n5262
(встречаются также T114, BOOT), на котором лежат
INFO_UF2.TXT и CURRENT.UF2 — слепок того, что прошито сейчас.DFU
в теле кадра, иначе не исполняется. Плата отвечает до ухода, закрепляет почту во флеш
и уходит в режим UF2 сама..uf2 прямо на появившийся съёмный диск.PID_8071), а не загрузчика (PID_0071); изготовитель в
идентификаторе — VID_239A (Adafruit).Заводской сброс на T114 сносит файловую систему целиком (настройки, контакты, правила, почту, книжку ключей и круг), затем идёт обязательный перезапуск платы.
Как это выглядит:
0xAE со словом DFU).<плата>_DFU..zip..uf2) остаётся основным и проверенным.У V3 и V4 обновления по Bluetooth по-прежнему нет ни в прошивке, ни в загрузчике: у
ESP32-S3 стоит штатный ПЗУ-загрузчик Espressif, и по воздуху он не работает.
Единственная дорога к загрузчику, которую даёт прошивка V3/V4, — команда
0xAE со словом DFU, и она уводит плату в USB-режим, а не в
беспроводное обновление.
Отсюда — сторож подъёма (только у V3/V4, сборки 33 и новее): плата запоминает, докуда дошёл прошлый подъём, и, если он не дошёл до конца, следующий раз поднимается бережно — по нарастающей отключая необязательное.
| № | Ступень |
|---|---|
| 1 | начало — setup начался, экран ещё не трогали |
| 2 | экран — шина I2C и микросхема экрана |
| 3 | радио — SX1262 |
| 4 | Bluetooth — стек NimBLE |
| 5 | Wi-Fi — точка доступа или домашняя сеть |
| 6 | шлюз — сетевая задача моста |
| 15 | готово — подъём дошёл до конца |
Плата, вставшая на Bluetooth, при следующем включении честно скажет на заставке
стоп: Bluetooth — не «что-то не так», а имя ступени.
| Неудач подряд | Что не поднимается |
|---|---|
| 0 | всё поднимается |
| 1 | Wi-Fi и шлюз |
| 2 | плюс Bluetooth |
| 3 | плюс печать в порт (порт замолкает совсем) |
Не всякий оборванный подъём считается неудачей — только те причины, за которыми стоит сама прошивка (паника, сторож прерываний, сторож задач, просадка питания). Обычный сброс кнопкой или новая прошивка счётчик не наращивают. Счётчик привязан к номеру сборки: обновление прошивки списывает старые неудачи.
стоп: <ступень> или бережно;Пункт «Поднять всё» стоит в меню перед «К заводскому» нарочно: он делает ровно то, ради чего иначе полезли бы в заводской сброс, и попадается на дороге к нему раньше.
Заливка прошивки работает всегда, что бы ни делала прошивка на плате: прошивальщик говорит не с ней, а с загрузчиком в ПЗУ кристалла, который поднимается раньше основной программы и от неё не зависит.
Ещё один путь для V3/V4, если плата ещё отвечает на команды: команда 0xAE
со словом DFU в теле кадра взводит бит «поднимайся в режим загрузки» и
сама перезагружает плату в ПЗУ-загрузчик — заливщику не нужно ни дёргать линии, ни
угадывать их порядок (у V4 это особенно кстати: линии автосброса у неё обрабатывает
сам кристалл, и порядок сигналов иной, чем у V3, где автосброс идёт через два
транзистора).
Актуальные сборки заливаются через прошивальщик в браузере:
На плате есть несколько свободных выводов, которые можно превратить в реле, вход кнопки/геркона, датчик или плавную регулировку (ШИМ).
| Плата | Выводов | С АЦП | Список |
|---|---|---|---|
| V3 | 7 | 5 | GPIO 2, 4, 5, 6, 7 (АЦП), 47, 48 (без АЦП) |
| V4 | 3 | 1 | GPIO 6 (АЦП), 47, 48 (без АЦП) |
Все аналоговые выводы — ADC1, и это не совпадение: ADC2 отдан Wi-Fi. V3 — самая щедрая из трёх плат на свободные контакты: усилителя нет, разъёма GNSS нет, и всё это досталось умному дому.
| Роль (настройка 39) | Что это |
|---|---|
| 0 — не занят | вывод отпущен |
| 1 — выход | реле, лампа, клапан |
| 2 — вход | цифровой вход без подтяжки |
| 3 — вход с подтяжкой | кнопка, геркон |
| 4 — датчик | АЦП, шкала 0..4095 (у T114 — 0..1023) |
| 5 — плавно | ШИМ |
Настраиваются контакты не отдельным номером на каждый вывод, а курсором: сначала
«выбери контакт номер N» (настройка 37), затем читай и пиши его поля (38..42). Номеров
ровно семь при любом числе выводов. Имя контакта задаётся отдельной командой
0xA7 текстом в UTF-8.
Плата не знает, из какого письма кусок — содержимое зашифровано целиком, — но ей это и не нужно: она подбирает всё, что слышит, и не хранит одно и то же дважды (повторы отсеиваются по свёрткам последних 128 кадров).
| Значение | Имя на экране | Что значит |
|---|---|---|
| 0 | выкл | чужого не носим вовсе |
| 1 | память | держим в оперативной памяти; во флеш уходит один раз, когда плату просят замолчать. Из коробки — это состояние. |
| 2 | флеш | переживает даже вырванную батарею, но тратит ресурс памяти |
Размер копилки — 48 КБ, кадр до 512 байт (около сотни пакетов — кусок картинки или полминуты голоса). У T114 копилке отдано вдвое больше (96 КБ из 248): на ESP-платах NimBLE забирает свои десятки килобайт из той же кучи именно тогда, когда телефон подключается, — то есть ровно тогда, когда копилка полна и её начинают отдавать.
Почта уходит во флеш при пункте меню «Перезагрузка» (до сброса, а не после — после некому), при «Поднять всё», при уходе в загрузчик и при просьбе замолчать. При заводском сбросе почту не закрепляют — её как раз стирают.
Пункт меню «Ретранс.» / настройка 33 — одним нажатием без подтверждения:
Без подтверждения — потому что, в отличие от маяка спасения, ретранслятор не уводит плату с канала и ничего не ломает для соседей. Худшее, что случится от случайного нажатия, — погаснет экран. Обратная дорога: нажатие зажигает экран, дальше тот же пункт меню. Ретранслятор, поднятый до перезагрузки, продолжается сам — и об этом печатается в порт.
Правил у платы восемь. Каждое — восемь байт: источник (контакт-условие), условие, порог, цель (контакт-действие), действие, значение, пауза в секундах после срабатывания.
| Условия | Действия | ||
|---|---|---|---|
| 0 — никогда | правило выключено | 0 — включить выход | |
| 1 — выше | показание стало больше порога | 1 — выключить | |
| 2 — ниже | показание стало меньше порога | 2 — переключить | на противоположное |
| 3 — стал вкл | вход замкнулся (кнопка, геркон) | 3 — задать число | для роли «плавно» — яркость |
| 4 — стал выкл | вход разомкнулся |
Правило пишется командой 0xA8 (не настройкой — восемь байт не влезают
в четыре). Конструктор в приложении и текстовая запись правила — одно и то же:
текст вида если 0 ниже 300 то 4 вкл разбирается в приложении и превращается
в те же восемь байт.
WiFi и WebServer там нет вообще.
Контактами T114 управляют с экрана, по Bluetooth и, при отдельно включённой настройке,
по радио (раздел 19). Всё, что описано в этом разделе, работает только на Heltec V3 и
Heltec V4.выкл → вкл → выкл; как только задана —
выкл → точка → дом → выкл. Из выключенного состояния плата всегда поднимает
свою точку доступа, а не последний использованный режим.код 12345678. Хвост самой строки меню — состояние:
выкл/вкл/точка/дом или число
подключённых телефонов.Duga XXXX, где XXXX — тот же номер платы, что на экране и в
эфире. Пароль — восемь цифр, рождается один раз случайным образом и больше не меняется,
даже после перезагрузки.http://192.168.4.1/.Плата поднимает DNS-сервер, который на любое имя отвечает своим адресом, и на любой незапрошенный путь отдаёт саму панель вместо ошибки 404. Отсюда — поведение телефонов:
| Телефон | Что происходит |
|---|---|
| iPhone / iPad | сам дёргает /hotspot-detect.html, получает
панель и сам открывает окно «вход в сеть» — набирать адрес не нужно. Если окно закрыть —
оно у Apple урезанное и второй раз само не откроется, тогда панель открывают руками |
| Android | дёргает /generate_204, показывает уведомление «сеть
без доступа в интернет» / «войти в сеть» |
| Ноутбук | портал обычно не всплывает — адрес набирают руками |
Захват DNS работает только в режиме своей точки: в домашней сети его нарочно нет — отвечать своим адресом на любое имя в чужой сети значит сломать интернет всему дому.
Панель — не набор ссылок, а одна страница, которая листается прокруткой. Уходить с неё некуда. Тема тёмная и зашита в код — светлой темы нет.
| Роль | Цвет |
|---|---|
| Фон страницы | #12151a |
| Фон карточки | #1b2028 |
| Рамка | #2c3440 |
| Зелёный («включено») | #4fbf7a |
| Оранжевый (ошибки, ползунок, кнопки с подтверждением) | #ff7a59 |
| Голубой (АЦП, полоска датчика) | #7fd0f5 |
Порядок сверху вниз: заголовок с номером платы → строка «плата, сборка N» → плашки состояния → раздел «Контакты» → раздел «Правила «если — то»» → раздел «Домашняя сеть и шлюз» → раздел «Точка доступа» (последний).
Карточек столько, сколько у платы свободных выводов: семь у V3, три у V4 — разметка
строится из ответа платы, а не написана руками под каждую плату отдельно. У каждой
карточки сверху — поле имени (до 12 байт UTF-8: латиницей 12 знаков, кириллицей 6 букв)
и справа ярлычок с именем вывода (GPIO 6): голубая рамка — у вывода есть
АЦП, серая — нет. Ниже — список ролей: не занят, выход,
вход, вход с подтяжкой, датчик (только если есть
АЦП), плавно. Тело карточки меняется по роли.
Одна широкая карточка, восемь мест под правила. Конструктор — источник, условие
(стало выше/стало ниже/замкнулся/разомкнулся)
и порог сверху, цель, действие (включить/выключить/переключить/задать),
значение и пауза снизу. Кнопка «Записать правило» ищет первое свободное место; если все
восемь заняты, под ней появляется: все восемь мест заняты — уберите лишнее.
Строка состояния сверху сообщает, раздаёт ли плата свою точку или сидит в домашней сети, и предупреждает честно: шлюз передаёт письма, а не интернет — 200-байтное сообщение проходит за минуту, страница в 100 КБ грузилась бы 7 часов. Поле пароля домашней сети никогда не показывает то, что уже сохранено — оставленное пустым значит «не менять», а не «сеть без пароля».
Ниже, на той же карточке, — необязательные поля адреса и порта сервера (для случая,
когда сервер поднят рядом, а не в интернете): адрес принимается только четырьмя числами
через точку, имя вида buhta.example.net не годится — оно требует DNS, а DNS
требует той самой сети, которой нет.
Всё это дёргает сама страница через fetch(); ходить по ним руками не
нужно, таблица — на случай, если панель разбирают:
| Адрес | Что делает |
|---|---|
GET /d | снимок платы целиком: контакты, правила, сеть, состояние (JSON) |
GET /v?k=N&z=V | значение контакта |
GET /r?k=N&r=R | роль контакта |
GET /b?k=N&z=V | безопасное состояние при включении платы |
GET /i?k=N&t=имя | имя контакта |
GET /p?n=N&u=… | правило целиком; u=0 убирает
правило |
GET /w?v=0 | выключить Wi-Fi |
GET /n?s=имя&k=пароль&r=1 | домашняя сеть; r=1
— сразу перейти |
GET /g?a=адрес&p=порт | адрес и порт сервера |
| любой другой путь | отдаёт саму страницу (портал захвата) |
Опрос идёт раз в 3 секунды одним запросом GET /d, а не шестью по
отдельности: соединений у точки доступа всего четыре, и страница, дёргающая несколько
адресов трижды в минуту, устроила бы очередь на ровном месте.
192.168.4.1.| № в панели | Вывод | АЦП | Где искать |
|---|---|---|---|
| 0 | GPIO 2 | да, ADC1 канал 1 | колодка платы |
| 1 | GPIO 4 | да, ADC1 канал 3 | колодка платы |
| 2 | GPIO 5 | да, ADC1 канал 4 | колодка платы |
| 3 | GPIO 6 | да, ADC1 канал 5 | колодка платы |
| 4 | GPIO 7 | да, ADC1 канал 6 | колодка платы |
| 5 | GPIO 47 | нет | колодка платы |
| 6 | GPIO 48 | нет | колодка платы |
Все пять аналоговых выводов — ADC1. Это не совпадение: ADC2 отдан Wi-Fi, и при поднятом Wi-Fi чтение с него не удаётся — не «шумит», а именно не удаётся.
| № в панели | Вывод | АЦП | Где искать |
|---|---|---|---|
| 0 | GPIO 6 | да, ADC1 канал 5 | колодка платы |
| 1 | GPIO 47 | нет | колодка платы |
| 2 | GPIO 48 | нет | колодка платы |
Втрое меньше, чем у V3, потому что лишние 6 дБм у V4 даёт отдельная микросхема усилителя, и управляют ею GPIO 7, 2 и 5 — ровно те выводы, что у V3 свободны и годятся под датчики. Аналоговый вход на V4 один на всю плату — GPIO 6; тратить его на реле, когда рядом есть чисто цифровые 47 и 48, значит израсходовать то, чего больше не будет.
При включении, в отчёте самопроверки в USB-порт, плата печатает список свободных контактов дословно (пример для V4):
Это и есть первая проверка глазами: увидев в отчёте вывод 2 на плате V4, человек сразу поймёт, что залита не та сборка, — раньше, чем обнаружит, что рацию никто не слышит.
| № в панели | Вывод | Порт nRF52 | АЦП | Колодка |
|---|---|---|---|---|
| 0 | GPIO 28 | P0.28 | да, AIN4 | разъём P2 |
| 1 | GPIO 29 | P0.29 | да, AIN5 | разъём P2 |
| 2 | GPIO 30 | P0.30 | да, AIN6 | разъём P2 |
| 3 | GPIO 31 | P0.31 | да, AIN7 | разъём P2 |
| 4 | GPIO 8 | P0.08 | нет | разъём P2 |
| 5 | GPIO 33 | P1.01 | нет | разъём P1 |
| Чем занято (V3/V4, ESP32-S3) | Выводы |
|---|---|
| Радио SX1262 | 8, 9, 10, 11, 12, 13, 14 |
| Экран OLED | 17 (SDA), 18 (SCL), 21 (RST) |
| Питание периферии (Vext) | 36 — включается низким уровнем |
| Светодиод / кнопка PRG | 35 / 0 |
| Батарея | 1 (АЦП), 37 (ключ делителя) |
| Усилитель — только V4 | 7, 2, 5 (у ревизии 4.3; у 4.2 вместо 5 — 46) |
| Разъём GNSS — только V4 | 38, 39, 34, 42, 40, 41 |
| Страппинг / UART прошивки / флеш и PSRAM / USB | 0, 3, 45, 46 · 43, 44 · 26, 33…38 · 19, 20 |
USB не отдан умному дому, хотя выводы физически есть: прошивка выводит отчёт самопроверки через USB, и отдать эти выводы — значит ослепнуть ровно тогда, когда плата окажется в чужих руках.
| Чем занято (T114, nRF52840) | Выводы |
|---|---|
| Радио SX1262 | 24, 20, 17, 25; шина SPI0: 19, 22, 23 |
| Экран ST7789 | 11, 12, 2, 3 (низкий), 15 (низкий), 40, 41 |
| Питание периферии (Vext) | 21 — включается высоким уровнем |
| Светодиод / кнопка | 35 (низкий) / 42 |
| Внешняя флеш (журнал писем), QSPI | 46, 47, 44, 45, 7, 5 |
| I²C (две шины) | 26, 27 · 16, 13 |
| Второй последовательный порт | 9, 10 |
| Батарея | 4 (измерение), 6 (ключ делителя) |
| GPS (L76K) | 39, 37, 34, 36 |
| V3 / V4 | T114 | |
|---|---|---|
| Разрядность | 12 бит, 0…4095 (задано явно в коде) | 10 бит, 0…1023 (задано явно в коде со сборки 96) |
| Полная шкала | ≈3.1 В (ослабление 11 дБ) | 3.6 В |
| Соответствие | 300 отсчётов ≈ 0.23 В, 1000 ≈ 0.76 В, 2000 ≈ 1.51 В | 300 отсчётов ≈ 1.06 В, 600 ≈ 2.11 В, 900 ≈ 3.17 В |
analogReadResolution(12) и analogReference(AR_INTERNAL_3_0)
ставятся глобально на весь АЦП каждые десять секунд, а своей настройки у контактов не
было вовсе. То же напряжение давало число примерно в 4.8 раза больше расчётного, и
порог «ниже 300» молча превращался в «ниже 0.22 В». Со сборки 96 шкала объявляется
заново перед каждым обходом контактов — 10 бит, 3.6 В, — и числа в строке
«Соответствие» стали верны.
Речь не про меню «Пароль» (раздел 9) — там описано, как завести общий ключ. Здесь — чем и насколько этот ключ на самом деле защищает переписку.
Содержимое посылки шифрует ChaCha20 (ключ 32 байта, разовое число 12 байт) и подписывает HMAC-SHA256 — обе вещи написаны в прошивке своими руками, а не взяты из готовых библиотек платформы. Причина простая: у ESP32-S3 и nRF52840 разные аппаратные ускорители шифрования, и брать у каждой платы свой значило бы завести две дороги к одному результату и надеяться, что они не разойдутся. Сперва шифруют, потом подписывают (encrypt-then-MAC) — так подделку можно отбросить, не тратя время на попытку её расшифровать.
| Что | Байт | Значит |
|---|---|---|
метка DUGA-SHF | 8 | «это закрытая посылка Дуги» |
| номер отправителя | 4 | видно, чья посылка |
| счётчик | 4 | видно, сколько посылок эта рация уже отправила |
| вид содержимого | 1 | видно, что это: письмо / тревога / маячок / команда / знакомство / координаты |
| длина сообщения | — | видна всегда: набивки до постоянной длины нет, длина закрытой посылки равна длине письма плюс 25 байт |
Формулировка из самого кода: «закрыто содержимое, а не сам факт разговора». Номер получателя в конверте не пишется, но переписка идёт на парных ключах, и по ответной посылке (номер отправителя которой тоже открыт) пара восстанавливается наблюдением за эфиром.
Подпись доказывает, что посылку сочинил свой, но не доказывает, что её не записали вчера и не проиграли сегодня. От этого — окно повторов: для каждого соседа плата помнит самый большой виденный счётчик и битовую карту 64 номеров ниже него. Окна во флеш не пишутся (флеш выдержит не любое число записей), поэтому после перезагрузки счётчик стартует не с нуля, а с «брони» — забронированного числа плюс запас в тысячу; это стоит одну запись во флеш на тысячу посылок и до тысячи потерянных номеров при каждом включении. Номеров четыре миллиарда, и при десяти включениях в день запас кончится через миллион лет.
| Что случилось | Что с ключами |
|---|---|
| Обычное выключение | ничего — книжка ключей во флеше, окна повторов теряются (так и задумано) |
| Перепрошивка | книжка лежит в NVS/файле, а не в области программы; явного стирания при обновлении в коде нет. Это вывод из кода, не проверка на живой плате. |
| Заводской сброс | стирает всё: настройки, контакты, правила, почту, книжку ключей, круг и пароль домашней сети. Знакомиться заново |
| Потеряли рацию | ключи из неё читает тот, у кого она в руках. Лечится на остальных рациях: меню «Знакомые» → номер → долгое → ЗАБЫТЬ |
Раскладка того, что летит по воздуху, когда содержимое закрыто. Человеку конверт не показывается — он видит письмо, маячок или результат команды.
| Байты | Что там |
|---|---|
| 0…7 | метка DUGA-SHF, открытым текстом |
| 8…11 | номер отправителя |
| 12…15 | счётчик посылки |
| 16 | вид содержимого (письмо, тревога, маячок, команда, знакомство, координаты) |
| 17… | закрытое содержимое, ровно столько байт, сколько было |
| хвост | подпись — 8 байт HMAC-SHA256 |
| Накладные расходы на посылку | 25 байт |
| Содержимого не больше | 200 байт |
| Вся посылка не больше | 225 байт |
Подпись усечена до восьми байт нарочно: это одна подделка из 18 миллиардов на попытку, а полные 32 байта отняли бы у письма ещё 24 байта на каждой посылке. Правило простое: знакомы — закрываем, не знакомы — шлём по-старому, открыто, иначе новая плата перестала бы слушаться старой.
0xA9, 0xAA).«Команда по радио» — когда одна рация щёлкает контактом (реле, выходом) на другой плате: открыть ворота, включить насос. «Хозяин» — это не человек, а рация в его руках: список хранит номера плат, мест четыре. Не шестнадцать — потому что каждая запись это ещё одна рация, которой можно открыть ворота, а список, который не помещается на один экран, вычёркивают только тогда, когда помнят, кто там есть. Не одна — потому что поломка единственной рации хозяина означала бы, что до ворот не достучаться вовсе.
Пароль команд (до 16 байт, общий на все платы дома) в эфир не уходит никогда — уходит только подпись, 8 байт HMAC-SHA256. Номер получателя лежит внутри подписи — иначе команду «открой ворота», подписанную для платы у ворот, можно было бы дословно переслать плате в гараже. Проверки идут по возрастанию цены — дешёвые впереди дорогих:
Отвечает плата не словом «принято», а тем, что реально стоит на контакте сейчас — разница между «я послал единицу» и «на выводе единица» и есть то, ради чего вся эта проверка затевалась.
Бывает после перепрошивки хозяина с полным стиранием, заводского сброса или подмены платы с тем же номером: команды уходят, светодиод мигает, а реле не щёлкает. Чинится на плате-исполнителе, руками, двумя путями:
| Способ | Как |
|---|---|
| Вычеркнуть хозяина и завести заново | настройка 47 — место, настройка 48 — 0, затем снова номер |
| Сбросить счётчик прямо | настройка 47 — место, настройка 49 — записать 0 |
| № | Смысл | Чтение | Запись | Значения |
|---|---|---|---|---|
| 46 | сколько мест в списке хозяев | да | нет | всегда 4 |
| 47 | какое место сейчас настраиваем | да | да | 0…3, во флеш не пишется |
| 48 | номер платы-хозяина на месте | да | да | 0…65535; 0 — вычеркнуть. Отказ, если это свой номер или он уже стоит на другом месте |
| 49 | счётчик выбранного хозяина | да | да | читается последний принятый; запись — только 0 |
| 50 | слушаться ли команд из эфира | да | да | 0/1, по умолчанию 0 |
| 51 | длина пароля команд | да | нет | 0…16; сам пароль не читается никогда |
| 52 | свой счётчик исходящих команд | да | нет | 0…4294967295 |
| 53 | исполнено команд из эфира | да | нет | счётчик |
| 54 | отказов всего | да | нет | счётчик |
| 55 | из них: отправитель не хозяин | да | нет | счётчик |
| 56 | из них: подпись не сошлась | да | нет | счётчик |
| 57 | из них: счётчик не вырос (повтор) | да | нет | счётчик |
| 58 | подписанных ответов принято | да | нет | счётчик |
| 59 | итог последнего ответа | да | нет | 0 исполнено, 1 контакт не выход, 2 нет контакта, 255 ответа ещё не было |
| 60 | значение контакта из того ответа | да | нет | 0…255 |
Записываемых всего четыре — 47, 48, 49, 50. Остальные — только чтение, попытка записи вернёт отказ. Пароля в этом списке нет и не будет.
Всё — по проводу или Bluetooth, из эфира этой двери нет:
0xAA (тот же пароль — на рации
хозяина).Отправка команды — кадр KISS 0xA9, требует только заданного пароля и
номера получателя, не равного своему. Настройка 50 на неё не влияет: та запирает
дверь В плату, а не ИЗ неё — рации, которой запрещено слушаться эфира, всё равно можно
самой командовать другими.
менять у ВСЕХ! на экранах
региона и режима.0xAB.Честно о границах материала, из которого она собрана: