docs: full PROJECT_KNOWLEDGE.md with complete project state
This commit is contained in:
+238
-3
@@ -6,10 +6,245 @@
|
||||
## Назначение проекта
|
||||
|
||||
ESP32-based весовой контроллер для автомобильной грузовой платформенной весовой системы.
|
||||
Индикатор: **Zemic TITAN 9** (основан на Zemic A12E). Грузоподьёмность платформы — до 50 тонн.
|
||||
Индикатор: **Zemic TITAN 9** (основан на Zemic A12E). Грузоподъёмность платформы — до 50 тонн.
|
||||
|
||||
**Задачи контроллера:**
|
||||
- Приём данных весов RS232 (через MAX3232 → Serial2)
|
||||
- Приём данных весов по RS232 (через MAX3232 → Serial2)
|
||||
- Передача данных на сервер по MQTT over Ethernet (W5500)
|
||||
- Управление светофором (2-канальное реле: красный / зелёный сигнал)
|
||||
- Локальный веб-интерфейс на ЕСП32 (статус + IP)
|
||||
- Локальный веб-интерфейс на ESP32 (статус + IP)
|
||||
|
||||
---
|
||||
|
||||
## Стек технологий
|
||||
|
||||
### Железо (Hardware)
|
||||
|
||||
| Компонент | Модель | Примечание |
|
||||
|---|---|---|
|
||||
| МК | ESP32 Dev Module | Arduino IDE, ESP32 core 3.x (Espressif) |
|
||||
| Ethernet | W5500 зелёный, компактный 3.3V | Первый синий модуль был дефектный (RJ45 трансформатор не работал) |
|
||||
| RS232 → TTL | MAX3232 | Для согласования уровней 12V RS232 и 3.3V ESP32 |
|
||||
| RTC | DS3231 | Обнаружение нестабильное — требует инициализации **до** ETH.begin() |
|
||||
| Реле | 2-канальный оптоизолированный модуль | Управление через BC547 транзисторы |
|
||||
| Питание | 5V 2A PSU | |
|
||||
|
||||
### Подключение W5500 → ESP32
|
||||
|
||||
| W5500 | ESP32 GPIO | Примечание |
|
||||
|---|---|---|
|
||||
| MOSI | GPIO 23 | На модуле MOSI/MISO физически перепутаны — компенсировано в прошивке |
|
||||
| MISO | GPIO 19 | (MISO/MOSI swapped на плате) |
|
||||
| SCK | GPIO 18 | |
|
||||
| CS | GPIO 4 | GPIO5 — strapping pin, вызывал конфликты SPI при инициализации |
|
||||
| RST | GPIO 26 | |
|
||||
| INT | GPIO 27 | Не используется |
|
||||
|
||||
### Подключение MAX3232 → ESP32
|
||||
|
||||
| MAX3232 (TTL сторона) | ESP32 GPIO |
|
||||
|---|---|
|
||||
| TX (TTL out) | GPIO 16 (RX2) |
|
||||
| RX (TTL in) | GPIO 17 (TX2) — не используется |
|
||||
| VCC | 3V3 |
|
||||
| GND | GND |
|
||||
|
||||
### Подключение весов Zemic TITAN 9
|
||||
|
||||
| DB25 пин весов | Куда |
|
||||
|---|---|
|
||||
| Пин 2 (TXD) | MAX3232 RX (RS232 сторона) |
|
||||
| Пин 7 (GND) | Общий GND |
|
||||
|
||||
### Реле (управление светофором)
|
||||
|
||||
| GPIO ESP32 | Реле | Сигнал |
|
||||
|---|---|---|
|
||||
| GPIO 32 | Канал 1 | Красный |
|
||||
| GPIO 33 | Канал 2 | Зелёный |
|
||||
|
||||
---
|
||||
|
||||
## Прошивка (Firmware)
|
||||
|
||||
**Файл:** `firmware/scales_controller.ino`
|
||||
|
||||
**Библиотеки:**
|
||||
- `ETH.h` — нативная библиотека ESP32 core 3.x (Espressif) для W5500
|
||||
- `NetworkClient`, `NetworkUDP` — из ESP32 core 3.x
|
||||
- `PubSubClient` (Nick O'Leary) — MQTT клиент
|
||||
- `ArduinoJson` (Benoit Blanchon) — сериализация JSON
|
||||
- `RTClib` — DS3231 RTC
|
||||
|
||||
**Ключевые параметры прошивки:**
|
||||
|
||||
```cpp
|
||||
// Ethernet SPI
|
||||
#define ETH_SPI_SCK 18
|
||||
#define ETH_SPI_MISO 19 // Физически MOSI на плате (swapped!)
|
||||
#define ETH_SPI_MOSI 23 // Физически MISO на плате (swapped!)
|
||||
#define ETH_PHY_CS 4 // Не GPIO5! (strapping pin)
|
||||
#define ETH_PHY_RST 26
|
||||
#define ETH_PHY_IRQ 27
|
||||
|
||||
// UART (весы)
|
||||
#define SCALES_BAUD 9600 // P3 в меню весов
|
||||
|
||||
// Реле
|
||||
#define RELAY_RED_PIN 32
|
||||
#define RELAY_GREEN_PIN 33
|
||||
|
||||
// MQTT (тестовая фаза)
|
||||
const char* MQTT_HOST = "77.222.43.248"; // или scales.zeroday.su
|
||||
const int MQTT_PORT = 1884; // plain MQTT
|
||||
const char* MQTT_USER = "esp32";
|
||||
const char* MQTT_TOPIC = "scales/weighing/event";
|
||||
```
|
||||
|
||||
**Порядок инициализации в setup() (критично!):**
|
||||
1. `Wire.begin(21, 22)` → DS3231 RTC
|
||||
2. `SPI.begin(SCK, MISO, MOSI)` → W5500
|
||||
3. `ETH.begin(...)` → Ethernet
|
||||
4. `mqttClient.setServer(...)` → MQTT
|
||||
5. `Serial2.begin(9600, ...)` → RS232 от весов
|
||||
|
||||
---
|
||||
|
||||
## Сервер (Backend)
|
||||
|
||||
**Сервер:** `scales.zeroday.su`
|
||||
**IP:** `77.222.43.248`
|
||||
**ОС:** Ubuntu 24
|
||||
**Директория проекта:** `/var/www/scales/`
|
||||
|
||||
### Структура директории
|
||||
|
||||
```
|
||||
/var/www/scales/
|
||||
├── server.js # Node.js Express + WebSocket + MQTT subscriber
|
||||
├── public/
|
||||
│ └── index.html # Дашборд (реальное время, история, светофор, график)
|
||||
├── node_modules/
|
||||
└── package.json
|
||||
```
|
||||
|
||||
### Стек сервера
|
||||
|
||||
| Компонент | Версия / Конфиг |
|
||||
|---|---|
|
||||
| Node.js | LTS |
|
||||
| Express | HTTP + WebSocket (ws) |
|
||||
| MQTT клиент | mqtt (npm) |
|
||||
| PM2 | Процесс: `scales` (id=13), порт 3016 |
|
||||
| Mosquitto | MQTT broker, конфиг: `/etc/mosquitto/conf.d/acs.conf` |
|
||||
| nginx | Reverse proxy + SSL termination |
|
||||
| SSL | Let's Encrypt (certbot), домен `scales.zeroday.su` |
|
||||
| PostgreSQL | Установлен, для будущей персистентности (пока in-memory) |
|
||||
|
||||
### Переменные окружения (server.js)
|
||||
|
||||
```js
|
||||
const PORT = 3016;
|
||||
const MQTT_BROKER = 'mqtt://localhost:1883';
|
||||
const MQTT_USER = 'scales-server';
|
||||
// MQTT_PASS — хранится в server.js, не публикуется
|
||||
const MQTT_TOPIC = 'scales/weighing/event';
|
||||
const MAX_HISTORY = 100; // событий в памяти
|
||||
```
|
||||
|
||||
### MQTT Конфигурация
|
||||
|
||||
**Файл:** `/etc/mosquitto/conf.d/acs.conf`
|
||||
|
||||
```
|
||||
listener 1883 127.0.0.1 # для Node.js бэкенда
|
||||
listener 1884 0.0.0.0 # для ESP32 (plain, тестовый)
|
||||
allow_anonymous false
|
||||
password_file /etc/mosquitto/passwd
|
||||
```
|
||||
|
||||
**Пользователи MQTT:**
|
||||
|
||||
| Пользователь | Роль |
|
||||
|---|---|
|
||||
| `esp32` | ESP32 контроллер (publisher) |
|
||||
| `scales-server` | Node.js backend (subscriber) |
|
||||
|
||||
*Пароли хранятся в `/etc/mosquitto/passwd`, в документацию не включаются.*
|
||||
|
||||
### nginx
|
||||
|
||||
- HTTPS → порт 3016 (proxy_pass)
|
||||
- WebSocket upgrade: `Upgrade $http_upgrade; Connection "upgrade"`
|
||||
- MQTTS stream proxy: порт 8883 → localhost:1883 (запланировано, настроено в nginx stream)
|
||||
|
||||
**Конфиг:** `/etc/nginx/sites-available/scales.zeroday.su`
|
||||
**Stream:** nginx.conf (stream блок в конце)
|
||||
|
||||
### REST API (server.js)
|
||||
|
||||
| Endpoint | Метод | Описание |
|
||||
|---|---|---|
|
||||
| `/api/status` | GET | Статус MQTT, uptime, последнее событие |
|
||||
| `/api/history` | GET | Последние 100 событий взвешивания |
|
||||
| WebSocket `/` | WS | Реалтайм события + инит состояния |
|
||||
|
||||
---
|
||||
|
||||
## Формат данных весов
|
||||
|
||||
### RS232 строка от TITAN 9 / A12E
|
||||
|
||||
```
|
||||
ww000.000kg — брутто
|
||||
wn000.000kg — нетто
|
||||
wt000.000kg — тара
|
||||
```
|
||||
ASCII, 9600 бод, 8N1.
|
||||
|
||||
### MQTT JSON payload
|
||||
|
||||
```json
|
||||
{
|
||||
"device_id": "scales_01",
|
||||
"timestamp": "2026-03-27T16:35:25Z",
|
||||
"weight_kg": 15420.5,
|
||||
"weight_raw": "ww015420.500kg",
|
||||
"stable": true,
|
||||
"plate": null
|
||||
}
|
||||
```
|
||||
|
||||
Топик: `scales/weighing/event`, QoS: 1, Retain: false.
|
||||
|
||||
---
|
||||
|
||||
## Параметры весов Zemic TITAN 9
|
||||
|
||||
| Параметр | Назначение | Нужное значение |
|
||||
|---|---|---|
|
||||
| P3 | Скорость RS232 | 9600 (по умолчанию) |
|
||||
| P4 | Формат вывода | Стандартный `ww000.000kg` |
|
||||
| P5 | Режим передачи | **3** (передача при стабильном весе) — **НЕ НАСТРОЕН** |
|
||||
|
||||
**Пароль сервисного меню:** `1`
|
||||
|
||||
---
|
||||
|
||||
## Текущий статус проекта (на 2026-05-03)
|
||||
|
||||
✅ ESP32 инициализирует W5500 и подключается к MQTT
|
||||
✅ Backend задеплоен, дашборд работает на https://scales.zeroday.su
|
||||
✅ MQTT авторизация настроена
|
||||
✅ Relay логика реализована в прошивке
|
||||
❌ Весы не передают RS232 — параметр P5 = "нет передачи" (не изменён)
|
||||
❌ DS3231 обнаруживается нестабильно
|
||||
⏳ MQTTS (порт 8883) настроен в nginx, но не активирован в прошивке
|
||||
|
||||
---
|
||||
|
||||
## Контакты и ресурсы
|
||||
|
||||
- Zemic support (настройка P5): +7 (472) 277-71-19
|
||||
- Репозиторий: https://git.zeroday.su/admin/weighing-controller
|
||||
- Дашборд: https://scales.zeroday.su
|
||||
|
||||
Reference in New Issue
Block a user