6.2 KiB
6.2 KiB
CHANGELOG.md — История изменений
Восстановлено по истории чатов с Claude
Проект: Весовой контроллер ESP32 / Zemic TITAN 9
[Unreleased] — Ожидает on-site теста
Запланировано
- Настройка P5=3 на весах (RS232 передача)
- On-site тест с платформой
- Переход на MQTTS (порт 8883)
[0.4.0] — 2026-03-29
Добавлено
- ETH + MQTT работают стабильно:
[ETH] IP: 192.168.2.2,[MQTT] Connecting... OK - DS3231 RTC обнаруживается при правильном порядке инициализации
- Финальная схема подключения W5500 подтверждена (GPIO4 CS, MOSI/MISO swapped)
- Платформа физически подключена к MAX3232 — пайка подтверждена
Исправлено
- DS3231 начал работать после перестановки Wire.begin() перед ETH.begin()
- W5500 "version mismatched" исправлен заменой синего модуля на зелёный (3.3V)
Изменено
- Прошивка переработана под
ETH.h+NetworkClient(ESP32 core 3.x) вместоEthernet.h+ SSLClient
[0.3.0] — 2026-03-27
Добавлено
- Открытие порта 1884 в Mosquitto для прямого подключения ESP32 (plain MQTT)
- Прошивка успешно подключается к серверу 77.222.43.248:1884
- Выявлена и решена проблема GPIO5 → перешли на GPIO4 как CS для W5500
Исправлено
- SPI конфликт из-за GPIO5 (strapping pin) — заменён на GPIO4
- MOSI/MISO перепутаны на модуле W5500 — исправлено компенсацией в прошивке
[0.2.0] — 2026-03-27
Добавлено
- Переход с
Ethernet.h+ SSLClient на нативныйETH.hиз ESP32 core 3.x (Espressif) - Обнаружение дефектного синего W5500 (RJ45 трансформатор не работал) — замена на зелёный 3.3V модуль
- NTP синхронизация через Google NTP (216.239.35.0)
- Реализована логика управления реле (светофор: красный/зелёный)
- Добавлен локальный веб-сервер на ESP32 для отображения статуса
Исправлено
- TLS handshake провалы с SSLClient — отказались в пользу ETH.h
- "W5500 version mismatched" после замены дефектного модуля на рабочий
[0.1.0] — 2026-03-26
Добавлено
- Первичная архитектура: ESP32 + W5500 + MAX3232 + DS3231 + реле
- Развёрнут Node.js/Express backend на
/var/www/scales/(порт 3016) - Настроен Mosquitto MQTT broker с авторизацией
- Пользователь
esp32для контроллера (publisher) - Пользователь
scales-serverдля бэкенда (subscriber)
- Пользователь
- Получен SSL сертификат для
scales.zeroday.suчерез certbot - Настроен nginx reverse proxy (HTTPS → 3016, WebSocket upgrade)
- Настроен nginx stream proxy (MQTTS 8883 → localhost:1883)
- Фронтенд дашборд: реальное время, история взвешиваний, график, светофор
- WebSocket для realtime обновлений без перезагрузки страницы
- PM2 процесс
scales(id=13) для автозапуска сервера - REST API:
/api/status,/api/history - Определён MQTT топик:
scales/weighing/event, QoS 1 - Определён формат данных весов:
ww000.000kg(ASCII, 9600 бод, 8N1) - JSON payload: device_id, timestamp, weight_kg, weight_raw, stable, plate
Технические решения
- RS232 → MAX3232 → GPIO16 (RX2) ESP32
- Реле: GPIO32 (красный), GPIO33 (зелёный) через BC547 транзисторы
- Питание: 5V 2A PSU для всей системы
- Весы DB25 пин 2 (TXD) → MAX3232 RX; DB25 пин 7 (GND) → общий GND
2026-06-26 — авто-захват фото + распознавание номера (Claude API)
- orange_pi/scales.py: при стабилизации веса снимает кадр с RTSP-камеры (ffmpeg) и шлёт на scales.zeroday.su/api/capture в фоновом потоке
- grab_test.py: разовый тест камеры → сервер
- сервер распознаёт номер через aiprimetech.io (claude-haiku-4-5 + fallback sonnet-4-6) и кладёт фото+номер рядом с весом
2026-06-26 — OPi шлёт нативный кадр (2560x1440)
- grab_frame: убран scale=1280, отдаём полный кадр; сервер сам кропает зону номера, делает автоконтраст и распознаёт жёлтые/белые номера
2026-06-26 — порог срабатывания MIN_WEIGHT 1600 -> 2000 кг (отсечь ложные заезды)
2026-07-15 — MQTT: авто-реконнект и честная публикация
- publish() теперь проверяет rc (paho НЕ бросает исключение при отсутствии связи, qos=0 молча терялся)
- on_connect/on_disconnect + reconnect_delay_set(1..60с); подписки восстанавливаются после каждого реконнекта
- ensure_mqtt_connected() в heartbeat_loop и перед publish_weight — самолечение канала
- heartbeat пишет в лог, дошёл ли статус ("НЕ ОТПРАВЛЕН (нет связи с брокерами)")
- Причина: 10.07 оба MQTT-канала (к нам :1884 и к ребятам 192.168.20.9:1883) отвалились и не переподключились; фото шли по HTTP, поэтому проблема была не видна