Проект VODA · Техническая спецификация
Автономный узел оптического считывания показаний механических водомеров
Оптическое распознавание на оконечном устройстве ESP32-S3-CAM (N16R8) · LoRa 868 МГц · питание CR123A · опционально TPL5110 или глубокий сон
Содержание
- Цель и границы системы
- Архитектура
- Спецификация комплектующих узла учёта
- Оптика, корпус, монтаж
- Питание: три варианта
- Связь LoRa 868
- Оптическое распознавание на оконечном устройстве
- Прошивка: цикл сессии
- Шлюз и серверная подсистема
- Этапы внедрения
- Риски и критерии приёмки
- Контрольный перечень закупки и приёмки аппаратуры
- Опытная эксплуатация: 10 устройств × 1 месяц
- Оптовые цены (ориентир, площадка Alibaba)
1. Цель и границы системы
Автоматически снимать показания со старых механических счётчиков воды (без импульсного выхода / Modbus): фотографировать циферблат, распознавать цифры на устройстве, передавать компактный зашифрованный пакет по LoRa 868 МГц на шлюз, сохранять принятые показания в серверной подсистеме.
В границах проекта
Барабанные циферблаты (целые + доли). Автосъёмка по расписанию. Оптическое распознавание на оконечном устройстве. Восходящая передача LoRa. Оповещения: вне связи / низкий заряд батареи / низкая уверенность.
Вне границ минимального продукта
Замена счётчиков. Импульсные/умные счётчики. Передача полного JPEG по LoRa. Юридическая интеграция с ГИС ЖКХ (отдельный этап).
2. Архитектура
Зафиксированный подход: распознавание на оконечном устройстве. По эфиру — только зашифрованное показание и метаданные. Wi‑Fi — только сервисный режим (пусконаладка на объекте, дистанционное обновление прошивки, выгрузка спорных кадров).
- Счётчик в фиксированном ракурсе с подсветкой снимается камерой OV3660.
- Кадр обрабатывается на ESP32-S3 (N16R8): оптическое распознавание на оконечном устройстве, формируется полезная нагрузка.
- Полезная нагрузка шифруется на устройстве (AES‑128, ключ в прошивке). В открытом виде в эфире остаётся только идентификатор устройства (для маршрутизации).
- Пакет уходит по LoRa SX1276/SX1262 (868 МГц) через ретрансляторы на шлюз; ретрансляторы и шлюз передают шифротекст без расшифровки.
- Сервер расшифровывает тем же ключом, проверяет и сохраняет показание; далее — кабинет оператора (в т.ч. Max).
- После сессии — сигнал DONE и глубокий сон; питание от CR123A (опционально TPL5110).
Почему распознавание на устройстве
- LoRa не предназначен для JPEG (узкий канал, коэффициент заполнения эфира).
- 8 МБ PSRAM позволяют разместить кадр, область интереса (ROI) и квантованную модель.
- Облако получает уже расшифрованное значение + уверенность + флаги.
3. Спецификация комплектующих узла учёта
Критично: маркировка памяти строго N16R8. Без 8 МБ PSRAM локальная нейросеть не разместится нормально. Радио — строго 868 МГц.
| Позиция | Модель / параметр | Назначение | Примечание |
|---|---|---|---|
| МК + камера | ESP32-S3-WROOM CAM, N16R8 | Съёмка, распознавание моделью, управление | 16 МБ Flash / 8 МБ PSRAM. Проверить объём PSRAM функцией esp_psram_get_size() |
| Камера | OV3660 (3 Мп) | Чёткость барабанов для распознавания | Часто кладут OV2640 — сверять описание/комплект |
| Таймер питания (опц.) | TI TPL5110 (или TPL5111) | Полное обесточивание между сессиями | Интервал 100 мс…2 ч. Для недели — RTC (см. §5) |
| Радио | LoRa SX1276 или SX1262 @ 868 МГц | Восходящая передача показаний | Не брать 433/915 под РФ |
| Антенна | Внешняя штыревая 868 МГц, SMA | Дальность «район» | + пигтейл IPEX/U.FL на SMA. «Пружинка» недостаточна |
| Батарея | Li CR123A 3 В, ~1500 мАч | Основное питание | Мороз, низкий саморазряд |
| Холдер | Отсек CR123A | Фиксация + пайка | Пластиковый кейс |
| Корпус | Гермо IP65/IP66 | Влага, пыль, конденсат | Прозрачное окошко под объектив в крышке |
| Подсветка | Белый LED / IR + GPIO | Стабильный свет в шкафу/шахте | Боковой свет против бликов |
| Крепёж | Кронштейн на счётчик/трубу | Фикс ракурса 5–15 см | Сдвиг области интереса = деградация распознавания |
Инфраструктура (не на каждый счётчик)
| Позиция | Назначение |
|---|---|
| LoRa-шлюз 868 МГц + внешняя антенна | Приём пакетов с узлов, мост в Ethernet/Wi‑Fi, далее на сервер |
| Сервер серверная подсистема | Приём данных, валидация, хранение, алерты, кабинет/Max |
4. Оптика, корпус, монтаж
- Циферблат ≥40% кадра; резкость; без сильного блика.
- Фиксированный ракурс; область интереса (ROI) калибруется при установке и пишется в энергонезависимое хранилище (NVS).
- Для вывода модели полный кадр 3 Мп не обязателен: достаточно обрезки области интереса и понижения разрешения.
- Антенна LoRa — снаружи корпуса; пигтейл герметизирован.
- минимальный продукт: барабанные цифры (чёрные целые + красные доли). Стрелочные доли — отдельно или только целая часть.
5. Питание: три варианта
Батарея: CR123A ~1500 мАч. Полный цикл сессии одинаков для всех вариантов:
- пробуждение;
- камера и подсветка;
- захват кадра;
- распознавание;
- передача LoRa (не более одной повторной передачи);
- сон или отключение питания.
Расход одной сессии (ориентир): 0.2–0.8 мАч (100–200 мА × 5–15 с).
Оценка срока — до разряда батареи при штатном режиме. На практике срок режут холод, пики TX, утечки корпуса и саморазряд. Цифры ниже — инженерный ориентир, не гарантия.
Вариант A — глубокий сон ESP32-S3
Питание на плате не снимается. Между сессиями MCU в глубокий сон. Нужен доведённый узел без лишних LED/USB-чипа, ток сна ≤30 мкА.
| Режим | Расход между сессиями | Срок на CR123A (оценка) |
|---|---|---|
| 1 съёмка / сутки, сон 20 мкА | ~0.5 мАч/сутки сон + ~0.5 мАч сессия ≈ ~1 мАч/сутки | ~3–4 года |
| 1 съёмка / неделя, сон 20 мкА | ~3.4 мАч/неделя сон + ~0.5 мАч сессия | ~5–7 лет |
| Отладочная плата без доработки, сон ~100–300 мкА | сон доминирует | ~0.5–1.5 года (1/сутки) |
Вариант B — TPL5110 + MOSFET (полное обесточивание)
Таймер полностью обесточивает узел. Интервал резистором: до 2 часов (для суток — будить чаще и считать в энергонезависимое хранилище (NVS), либо ставить вариант C). После сессии сигнал GPIO DONE отключает питание. Простой ≈ ток TPL5110 (~35–50 нА).
| Режим | Расход | Срок на CR123A (оценка) |
|---|---|---|
| 1 полная сессия / сутки | ~0.2–0.8 мАч/сутки (сон ≈ 0) | ~5–10+ лет (упирается в саморазряд батареи) |
| Интервал таймера 2 ч, полная сессия 1/сутки | 11 «пустых» пробуждение + 1 полная; пустые — миллисекунды DONE | близко к 1/сутки: ~4–8 лет, если пустые запуски короткие |
Вариант C — RTC RV-3028-C7 + MOSFET/ключ нагрузки
RTC всегда под батареей (~45–100 нА). По сигналу будильника включает питание платы; после сессии GPIO гасит MOSFET. Любой интервал: сутки, неделя, месяц.
| Режим | Расход | Срок на CR123A (оценка) |
|---|---|---|
| 1 полная сессия / сутки | ~0.2–0.8 мАч/сутки + ~0.002 мАч/сутки RTC | ~5–10+ лет |
| 1 полная сессия / неделя | ~0.2–0.8 мАч/неделя + ничтожный ток RTC | ~10+ лет (лимит — саморазряд CR123A) |
Сводка
| Вариант | Когда брать | Интервал | Срок при 1/сутки |
|---|---|---|---|
| A. Глубокий сон | Простая схема, узел ≤30 мкА | любой (RTC MCU) | ~3–4 года |
| B. TPL5110 | Нужен «ноль» в простое, интервал ≤2 ч | до 2 часов | ~5–10+ лет |
| C. RV-3028-C7 + MOSFET | Нужны сутки / неделя без лишних пробуждений | любой | ~5–10+ лет |
6. Связь LoRa 868
Структура пакета
Открытый заголовок (для маршрутизации) + зашифрованная полезная нагрузка. Суммарно ориентир 20–40 байт до шифрования; после AES‑128 (блок 16 байт) — с выравниванием / тегом режима, без существенного раздувания канала.
| Часть | Поле | Размер | Смысл |
|---|---|---|---|
| открыто | идентификатор устройства | 2–4 B | ID узла (выбор ключа на сервере) |
| шифротекст | показание | упакованно | Целые + доли |
| уверенность | 1 байт | Уверенность распознавания | |
| флаги | 1 байт | низкая уверенность / ошибка камеры / низкий заряд / перекрыт | |
| номер сессии | 2 байта | Защита от повтора пакета | |
| напряжение батареи, мВ | 2 байта | Напряжение CR123A | |
| версия прошивки | 1 байт | Версия прошивки |
Шифрование
- Алгоритм: AES‑128 (аппаратный ускоритель ESP32‑S3 / Mbed TLS в ESP‑IDF). Предпочтительно режим с проверкой целостности (AES‑GCM) либо AES‑CTR + отдельный MAC.
- Ключ прошивается в устройство при сборке; тот же секрет хранится на сервере (по идентификатору устройства или общий на пилот).
- Смена ключа по эфиру на этапе пилота не предусматривается.
- Ретрансляторы и шлюз шифротекст не расшифровывают — только ретранслируют на сервер.
- JPEG по LoRa не передаём.
- SF7–SF9 по линку; не завышать SF без нужды (ток TX).
- Соблюдать коэффициент заполнения эфира / ЭРП для 868 МГц в РФ.
- Последний кадр с низкой уверенностью хранить во Flash; выгрузка — сервисный режим Wi‑Fi/BLE при монтаже.
7. Оптическое распознавание на оконечном устройстве
- Кадр OV3660; выделяется фиксированная область интереса из энергонезависимого хранилища (NVS).
- Нормализация / контраст.
- Модель: сегментация цифр или малая свёрточная или свёрточно-рекуррентная сеть (CNN/CRNN) (ESP-DL / TensorFlow Lite Micro + ESP-NN), int8.
- Постобработка: только [0-9], ожидаемая длина разрядов.
- Локальная проверка: уверенность ≥ порога; показание ≥ предыдущего (энергонезависимое хранилище (NVS)); разумный прирост.
- Иначе — флаг низкой уверенности, кадр во Flash для ручной проверки.
Подготовка модели выполняется поэтапно:
- набор данных с реальных счётчиков в том же ракурсе и освещении;
- обучение на ПК;
- квантование;
- прогон задержки и точности на ESP32-S3.
8. Прошивка: цикл сессии
Рабочий цикл сессии:
- пробуждение / включение;
- самопроверка PSRAM == 8 МБ;
- инициализация камеры и LoRa (минимум);
- подсветка включена — захват кадра — подсветка выключена;
- предобработка области интереса и вывод модели;
- проверка относительно последнего значения в энергонезависимом хранилище (NVS);
- сборка полезной нагрузки, шифрование AES‑128 ключом из прошивки;
- передача LoRa (открытый идентификатор устройства + шифротекст; не более одной повторной передачи);
- сохранение JPEG при низкой уверенности;
- сигнал DONE и глубокий сон.
Сервисный режим (кнопка / магнит / первые секунды после включения): точка доступа Wi‑Fi для выгрузки последнего кадра JPEG, калибровки области интереса и дистанционного обновления прошивки.
- дистанционное обновление прошивки и модели — только в сервисном режиме;
- уникальный идентификатор устройства и ключ шифрования — в прошивке при выпуске; только исходящий трафик.
9. Шлюз и серверная подсистема
Функции
- Шлюз принимает LoRa-пакет и передаёт на сервер байты как есть (шифротекст + открытый идентификатор, плюс RSSI/SNR и метка времени шлюза).
- Сервер: по идентификатору устройства выбирает ключ, расшифровывает полезную нагрузку (AES‑128), получает показание, уверенность, флаги, напряжение батареи, номер сессии.
- Повторная проверка монотонности и лимитов расхода; отбраковка повторов по номеру сессии.
- требуется проверка при низкой уверенности / аномалии.
- Кабинет оператора (в т.ч. Max): последнее значение, батарея, SNR, вне связи > 48 ч.
Модель данных (минимум)
| Сущность | Поля |
|---|---|
| Устройство | идентификатор, ключ AES (секрет), версия прошивки, время последней связи, батарея |
| Счётчик | адрес, тип циферблата, область интереса (ROI), единицы |
| Показание | значение, метка времени, уверенность, статус, флаги |
| Шлюз | идентификатор, местоположение, время последней связи |
| ЗадачаПроверки | идентификатор показания, ссылка на кадр, решение |
Структура репозитория
| Каталог | Содержимое |
|---|---|
| прошивка/ | ESP-IDF/PlatformIO: камера, распознавание, AES, LoRa, DONE / сон, энергонезависимое хранилище (NVS) |
| модель/ | Обучение, квантование, экспорт |
| шлюз/ | LoRa 868, далее MQTT или HTTP |
| серверная подсистема/ | FastAPI + PostgreSQL: расшифровка AES, валидация, хранение |
| кабинет/ | Max / веб-интерфейс |
| наборы_данных/ | Фото + разметка |
| аппаратура/ | спецификация комплектующих, схема TPL5110, корпус |
10. Этапы внедрения
| Этап | Содержание | Результат |
|---|---|---|
| 0. спецификация комплектующих и стенд | Закупка N16R8 + OV3660 + 868 + TPL5110/RTC + CR123A + корпус | PSRAM=8 МБ подтверждён |
| 1. Оптика | Корпус, окошко, подсветка, крепление | 50–200 фото набор данныха |
| 2. нейросеть на оконечном устройстве | обучение, квантование, перенос на ESP32-S3 | Задержка + точчность на устройстве |
| 3. LoRa и шлюз | полезная нагрузка, AES‑128, шлюз, расшифровка на сервере | Показание в кабинете / БД |
| 4. Питание | TPL5110 или глубокий сон, замер мА·с и срока | Бюджет на CR123A |
| 5. Опытная эксплуатация | 10 узлов, съёмка 1/сутки, 30 дней | Отчёт стабильности (см. §13) |
11. Риски и критерии приёмки
| Риск | Митигация |
|---|---|
| Плата не N16R8 / нет 8 МБ PSRAM | Самопроверка при первом запуск; возврат продавцу |
| Камера OV2640 вместо OV3660 | Проверка до сборки корпуса |
| LoRa не 868 | Маркировка частоты при заказе |
| Блики / конденсат / грязь | Угол, боковой свет, антифог, ручная проверка |
| Сдвиг крепления | Жёсткий кронштейн + повторная калибровка области интереса |
| Плохой линк в подвале | Вынос антенны, высота шлюз |
| Ложное принятие показания | Порог уверенности и монотонность на устройстве и сервере |
| Жирный глубокий сон на отладочной плате | TPL5110 или доработка питания |
Критерии успеха минимального продукта
- Сессия ≥1 раз/сутки; доставка пакета до серверная подсистема < 5 мин при доступном шлюз.
- ≥80% показаний без ручной проверки.
- ложное принятие < 1% на контрольной выборке.
- PSRAM = 8 МБ на каждой прошитой плате.
- Срок службы на одной CR123A: целевой ориентир ≥12 месяцев (по замеру/экстраполяции).
12. Контрольный перечень закупки и приёмки аппаратуры
- ESP32-S3-CAM с маркировкой N16R8 (не N8R2 / не «просто S3»)
- В описании/на модуле камера OV3660
- LoRa модуль / плата строго 868 МГц (SX1276 или SX1262)
- Внешняя антенна 868 + пигтейл IPEX/U.FL на SMA
- TPL5110 отладочный модуль или RV-3028-C7 при интервале >2 ч
- CR123A + холдер
- Корпус IP65/IP66 с возможностью окошка под объектив
- LED подсветки + крепёж под конкретный тип счётчика
- Шлюз 868 МГц для приёма
- После получения: прошить, выполнить самопроверку и зафиксировать в журнале объём PSRAM = 8388608
13. Опытная эксплуатация: 10 устройств × 1 месяц
Цель опытной эксплуатации — подтвердить стабильность железа, связи, распознавание и питания на реальных счётчиках до масштабирования.
Параметры опытной эксплуатации
| Параметр | Значение |
|---|---|
| Число узлов | 10 (каждый на своём счётчике) |
| Длительность | 30 календарных дней непрерывно |
| Частота съёмки | 1 раз в сутки (фиксированное окно, напр. 03:00–05:00) |
| Ожидаемый объём | 10 × 30 = 300 сессий / пакетов показаний |
| Питание | Один выбранный вариант питания (A, B или C из §5) на все 10 узлов |
| Связь | Один LoRa-шлюз 868 МГц с покрытием всех точек |
| Уведомления | Кабинет + Max: новое показание, вне связи, низкая уверенность, низкий заряд |
Состав комплекта опытной эксплуатации
- 10 × узел по спецификация комплектующих (§3): S3-CAM N16R8, OV3660, LoRa 868, антенна, CR123A, корпус, крепёж
- 1 × шлюз 868 + серверная подсистема + кабинет/Max
- Запас: 2 × CR123A, 1 × запасной узел (запасной узел), крепёж/герметик
- Перед стартом: калибровка области интереса (ROI) на каждом счётчике, контрольное ручное показание «день 0»
Что считаем стабильностью
| Метрика | Как считаем | Цель за 30 дней |
|---|---|---|
| Доля успешных доставок | Доля суток, когда пакет узла дошёл до серверная подсистема в окне +6 ч | ≥ 95% (≥ 285 из 300 сессий) |
| Автоматический приём показания | Показания со статус=принято без ручной проверки | ≥ 80% от доставленных |
| ложное принятие | Авто-принятое значение ≠ контрольному (выборка ≥30 сверки вручную) | < 1% |
| Инциденты потери связи | Узел не вышел на связь > 48 ч | ≤ 2 инцидента на весь парк; каждый разобран |
| Батарея | Падение напряжения за 30 дней; экстраполяция на 12 мес | Нет низкий заряд; запас согласован с §5 |
| Связь | SNR/RSSI по узлам; доля повторных передач | Нет узлов с систематическим сбой передачи |
| Железо/оптика | Смещения крепления, конденсат, отказ камеры | ≤ 1 замена/ремонт узла без срыва метрик |
Регламент на месяц
| Когда | Действие |
|---|---|
| День 0 | Монтаж 10 узлов, калибровка области интереса (ROI), ручные показания, проверка радиоканала до шлюза |
| Каждые сутки | Автосъёмка; в кабинете — факт прихода 10/10 или список недоставленных |
| 2 раза в неделю | Сверка 2–3 случайных узлов: фото/значение против циферблата визуально |
| Еженедельно | Сводка: доля успешных доставок, низкая уверенность, батарея, SNR; выезд только по оповещению |
| День 30 | Итоговый отчёт: таблицы метрик, список инцидентов, решение «запуск / доработка» по масштабированию |
Критерий «запуск / доработка» после опытной эксплуатации
- «Запуск»: доля успешных доставок ≥95%, автоматический приём ≥80%, ложное принятие <1%, нет массовых отказов батареи/радио.
- «Доработка»: любая метрика ниже порога — фикс (оптика, модель, антенна, питание) и повтор опытной эксплуатации на тех же 10 точках ещё 14–30 дней.
Объём данных опытной эксплуатации: при 10 узлах × 30 суток = 300 ожидаемых показаний. Этого достаточно, чтобы увидеть систематические сбои распознавания, «дыры» покрытия LoRa и дрейф батареи, но не заменяет годовой прогон на морозе — холодный тест вынести отдельно при необходимости.
14. Оптовые цены (ориентир, площадка Alibaba)
Цены листингов — FOB Китай / Alibaba (август 2026). Пересчёт в рубли по формуле проекта:
₽ с пошлиной = USD × 80 × 1.20 = USD × 96
Курс: 80 ₽ / $1. Пошлина: +20%.
Доставка и НДС сверх этого — отдельно (не включены в таблицы ниже).
Перед закупкой — КП и образец, проверка N16R8 / OV3660 / 868 МГц.
Плата и ключевые компоненты узла
| Позиция | Опт ~10–50 | Опт ~100–500 | Опт ≥1000 | Комментарий |
|---|---|---|---|---|
| ESP32-S3-CAM N16R8 + камера | $6.5–8.5 624–816 ₽ |
$5.5–6.7 528–643 ₽ |
$3.8–6.4 365–614 ₽ |
С OV3660; дешёвые лоты часто OV2640 |
| LoRa SX1262 / SX1276 @868 | $3.5–7.0 336–672 ₽ |
$2.8–5.0 269–480 ₽ |
$2.5–4.5 240–432 ₽ |
Не брать 433 «Ra-02» |
| Антенна 868 SMA + пигтейл | $0.8–2.0 77–192 ₽ |
$0.6–1.5 58–144 ₽ |
$0.5–1.2 48–115 ₽ |
— |
| TPL5110 отладочный модуль | $0.5–1.5 48–144 ₽ |
$0.3–1.0 29–96 ₽ |
$0.25–0.8 24–77 ₽ |
Вариант питания B |
| RTC RV-3028-C7 | $1.5–3.0 144–288 ₽ |
$1.3–2.0 125–192 ₽ |
$1.2–1.8 115–173 ₽ |
Оригинал; Alibaba $0.6–0.9 — риск подделки |
| MOSFET / LDO / мелочёвка | $0.3–0.8 29–77 ₽ |
$0.2–0.5 19–48 ₽ |
$0.15–0.4 14–38 ₽ |
— |
| Холдер CR123A | $0.15–0.40 14–38 ₽ |
$0.10–0.30 10–29 ₽ |
$0.08–0.25 8–24 ₽ |
— |
| Корпус IP65/66 + окошко | $1.5–4.0 144–384 ₽ |
$1.2–3.0 115–288 ₽ |
$1.0–2.5 96–240 ₽ |
Зависит от размера |
| LED + крепёж | $0.5–2.0 48–192 ₽ |
$0.4–1.5 38–144 ₽ |
$0.3–1.0 29–96 ₽ |
— |
Батарея CR123A (литий-диоксид марганца (Li-MnO₂), ~1500–1600 мАч)
| Партия | FOB / шт | ₽ с пошлиной / шт |
|---|---|---|
| 100–999 | $0.65–0.85 | 62–82 ₽ |
| 1 000–9 999 | $0.55–0.70 | 53–67 ₽ |
| ≥10 000 | $0.45–0.60 | 43–58 ₽ |
| ≥20 000 | $0.30–0.55 | 29–53 ₽ |
Только первичный неперезаряжаемый элемент Li-MnO₂, не 16340 перезаряжаемый под видом CR123A. минимальная партия заводов часто 1k–5k.
Сводка стоимости комплекта на 1 узел (без шлюза)
| Конфигурация | ~10 шт (опытная эксплуатация) | ~100–500 шт |
|---|---|---|
| A. Глубокий сон | $14–24 ≈ 1 340–2 300 ₽ | $11–18 ≈ 1 060–1 730 ₽ |
| B. + TPL5110 | $15–25 ≈ 1 440–2 400 ₽ | $12–19 ≈ 1 150–1 820 ₽ |
| C. + RV-3028-C7 | $16–27 ≈ 1 540–2 590 ₽ | $13–20 ≈ 1 250–1 920 ₽ |
| из них CR123A | $0.70–0.90 ≈ 67–86 ₽ | $0.55–0.70 ≈ 53–67 ₽ |
Опытная эксплуатация 10 устройств — железо
| Статья | FOB | ₽ (×80 + пошлина 20%) |
|---|---|---|
| 10 узлов (вариант B) | $150–250 | 14 400–24 000 ₽ |
| Запас 2× CR123A + мелочь | $5–15 | 480–1 440 ₽ |
| LoRa-шлюз 868 | $15–40 | 1 440–3 840 ₽ |
| Итого по опытной эксплуатации | $170–305 | 16 300–29 300 ₽ |
Не входит: доставка из Китая, НДС, разработка, сервер, монтаж, кастомная печатная плата (PCB). Доставку закладывайте сверху отдельно (для 10 узлов часто ещё +3–8 тыс. ₽ курьером).