BearSSL делает TLS-хендшейк синхронно, поэтому вместо асинхронности блокировка ограничивается по времени. Главный источник залипания — не таймауты HTTPClient, а DNS: WiFiClientSecureCtx::connect(name, port) резолвит имя через WiFi.hostByName() без таймаута и подвешивает loop() на ~10 с. Теперь имя разрешается заранее с лимитом 800 мс, результат попадает в кэш lwIP, и внутренний резолв возвращается мгновенно. Соединение по-прежнему идёт по имени, поэтому SNI и заголовок Host сохраняются. Остаток бюджета уходит в http.setTimeout(): он ограничивает и connect+TLS (через _client->setTimeout() до connect), и чтение ответа (собственный цикл HTTPClient по _tcpTimeout). Худший случай: ~3.5 с вместо прежних 10-15 с. Выходы аварии не затронуты — digitalWrite() и раньше выполнялся до отправки. Проверено: xtensa-lx106-elf-g++ -fsyntax-only -Wall -Wextra против ядра 3.1.2 — в скетче замечаний нет; разбор URL прогнан на 15 граничных случаях. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
218 lines
11 KiB
Markdown
218 lines
11 KiB
Markdown
# Контроллер насосов v8.2 — руководство пользователя
|
||
|
||
Документ для монтажника и обслуживающего персонала.
|
||
Техническое описание кода — в [README.md](README.md).
|
||
|
||
---
|
||
|
||
## 1. Что делает прибор
|
||
|
||
Контроллер следит за тремя насосами:
|
||
|
||
* **Насос 1** и **Насос 2** — основные;
|
||
* **Резерв** — аварийный (экстренный) насос.
|
||
|
||
Прибор:
|
||
|
||
1. показывает состояние на экране;
|
||
2. включает выход «Авария», если **оба** основных насоса остановлены;
|
||
3. включает выход «Резерв», когда запускается резервный насос;
|
||
4. отправляет уведомления на сервер (webhook) через интернет;
|
||
5. показывает панель мониторинга в браузере в локальной сети.
|
||
|
||
---
|
||
|
||
## 2. Подключение
|
||
|
||
### 2.1 Питание
|
||
|
||
5 В через microUSB (блок питания не менее 500 мА).
|
||
|
||
### 2.2 Датчики насосов
|
||
|
||
К каждому входу подключается **сухой контакт** — свободный контакт пускателя
|
||
насоса или датчика потока.
|
||
|
||
| Клемма платы | Что подключить |
|
||
|---|---|
|
||
| `D5` и `GND` | Контакт насоса 1 |
|
||
| `D6` и `GND` | Контакт насоса 2 |
|
||
| `D7` и `GND` | Контакт резервного насоса |
|
||
|
||
**Контакт замкнут = насос работает.** Полярность не важна, внешние резисторы
|
||
и питание на контакты подавать не нужно.
|
||
|
||
### 2.3 Выходы аварии
|
||
|
||
| Клемма | Когда `HIGH` (3.3 В) |
|
||
|---|---|
|
||
| `D8` | Авария: оба основных насоса стоят |
|
||
| `D0` | Работает резервный насос |
|
||
|
||
Выходы логические, 3.3 В, ток до ~12 мА. **Реле, сирену или лампу напрямую
|
||
подключать нельзя** — только через транзисторный ключ или релейный модуль
|
||
с оптронной развязкой.
|
||
|
||
### 2.4 Кнопка сброса Wi-Fi
|
||
|
||
Обычная кнопка без фиксации между `D3` и `GND`.
|
||
|
||
> Кнопку нельзя держать нажатой в момент включения питания — плата уйдёт в
|
||
> служебный режим и не запустится.
|
||
|
||
### 2.5 Экран
|
||
|
||
OLED 128×64 (I2C): `SDA → D1`, `SCL → D2`, `VCC → 3V3`, `GND → GND`.
|
||
|
||
---
|
||
|
||
## 3. Первое включение
|
||
|
||
1. Подайте питание. На экране появится `PUMP CTRL v8 / Starting...`.
|
||
2. Прибор не найдёт сохранённой сети и поднимет свою точку доступа:
|
||
|
||
```
|
||
Имя сети: Pump_Control_Set
|
||
```
|
||
|
||
3. Подключитесь к ней с телефона или ноутбука (пароль не требуется).
|
||
4. Откройте в браузере `http://192.168.4.1` — откроется страница настройки.
|
||
5. Выберите вашу Wi-Fi-сеть, введите пароль, нажмите **Save**.
|
||
6. Прибор перезагрузится и покажет на экране полученный IP-адрес.
|
||
**Запишите этот адрес** — по нему открывается панель мониторинга.
|
||
|
||
Если за 2 минуты сеть не настроена, прибор переходит в автономный режим:
|
||
экран, выходы аварии и логика работают, webhook и веб-панель — нет.
|
||
|
||
---
|
||
|
||
## 4. Экран
|
||
|
||
```
|
||
PUMP CONTROLLER v8
|
||
────────────────────────
|
||
PUMP 1 : RUNNING
|
||
PUMP 2 : STOPPED
|
||
BACKUP : STANDBY
|
||
────────────────────────
|
||
192.168.1.42
|
||
STATUS: OK
|
||
```
|
||
|
||
| Надпись | Значение |
|
||
|---|---|
|
||
| `PUMP 1/2 : RUNNING` | Насос работает |
|
||
| `PUMP 1/2 : STOPPED` | Насос остановлен |
|
||
| `BACKUP : ACTIVE` | Резервный насос запущен |
|
||
| `BACKUP : STANDBY` | Резерв в ожидании |
|
||
| `WiFi: NO CONNECTION` | Нет связи с сетью |
|
||
| `INIT...` | Идёт запуск (первые ~4 секунды) |
|
||
| `STATUS: OK` | Норма |
|
||
| `WARN: BACKUP RUNNING` | Работает резерв — требуется внимание |
|
||
| `!! ALARM: NO PUMPS !!` (мигает) | **Авария: подача воды прекращена** |
|
||
|
||
---
|
||
|
||
## 5. Панель в браузере
|
||
|
||
Откройте `http://<IP-адрес прибора>` в любом браузере в той же сети.
|
||
|
||
На странице:
|
||
|
||
* три карточки насосов с индикаторами;
|
||
* панель состояния системы (`SYS_OK` или `CRITICAL`);
|
||
* кнопка **Сбросить Wi-Fi**;
|
||
* поле **Webhook URL** для смены адреса уведомлений.
|
||
|
||
Страница обновляется автоматически при изменении состояния насосов.
|
||
|
||
### Адрес уведомлений
|
||
|
||
**На новом приборе адрес не задан** — панель покажет
|
||
`не задан - уведомления отключены`, и сообщения на сервер отправляться не будут.
|
||
Введите адрес в поле под заголовком `Webhook URL` и нажмите **Сохранить**.
|
||
|
||
Адрес сохраняется в память прибора и переживает отключение питания и сброс
|
||
Wi-Fi. Максимальная длина — 220 символов.
|
||
|
||
---
|
||
|
||
## 6. Уведомления на сервер
|
||
|
||
При изменении ситуации прибор отправляет сообщение на настроенный адрес:
|
||
|
||
| Событие | Что означает |
|
||
|---|---|
|
||
| `MAIN PUMPS` / `ALARM` | Оба основных насоса стоят |
|
||
| `MAIN PUMPS` / `OK` | Работа восстановлена |
|
||
| `EMERGENCY PUMP` / `STARTED` | Запустился резервный насос |
|
||
| `EMERGENCY PUMP` / `STOPPED` | Резервный насос остановился |
|
||
|
||
Уведомления отправляются один раз на каждое изменение, а не повторяются.
|
||
Если в момент события связи не было — уведомление **не будет** отправлено
|
||
позже, оно теряется.
|
||
|
||
На отправку отводится не больше **3 секунд**. Если сервер недоступен или
|
||
отвечает медленно, прибор прекращает попытку и продолжает работу: экран и
|
||
кнопка на это время замирают, но **выходы аварии срабатывают сразу**, не
|
||
дожидаясь сервера.
|
||
|
||
---
|
||
|
||
## 7. Сброс настроек Wi-Fi
|
||
|
||
Нужен при смене роутера или пароля сети.
|
||
|
||
**Способ 1 — кнопкой:**
|
||
нажмите и держите кнопку на `D3`. На экране появится полоса и обратный отсчёт
|
||
от 3 секунд. Дождитесь конца — прибор перезагрузится и снова поднимет точку
|
||
доступа `Pump_Control_Set`. Отпустите кнопку раньше — ничего не произойдёт.
|
||
|
||
**Способ 2 — через браузер:**
|
||
на панели мониторинга нажмите **Сбросить Wi-Fi**.
|
||
|
||
Webhook URL при сбросе Wi-Fi **не стирается**.
|
||
|
||
---
|
||
|
||
## 8. Задержки срабатывания
|
||
|
||
Задержки заданы намеренно, чтобы не срабатывать на кратковременные пуски и
|
||
остановки:
|
||
|
||
| Событие | Задержка |
|
||
|---|---|
|
||
| Фиксация нового состояния датчика | 3 секунды |
|
||
| Авария основных насосов (после фиксации) | ещё 5 секунд |
|
||
| **Итого до сигнала аварии** | **~8 секунд** |
|
||
| Реакция на резервный насос | ~3 секунды |
|
||
|
||
---
|
||
|
||
## 9. Диагностика
|
||
|
||
| Симптом | Причина / что делать |
|
||
|---|---|
|
||
| Экран не горит | Проверьте питание и провода SDA/SCL. Если адрес дисплея `0x3D`, требуется правка прошивки (константа `OLED_ADDR`) |
|
||
| Экран горит, но насосы всегда `STOPPED` | Контакты датчиков не замыкаются на `GND`; проверьте общий провод |
|
||
| Насосы всегда `RUNNING` | Вход замкнут на `GND` постоянно — проверьте контакт пускателя |
|
||
| `WiFi: NO CONNECTION` | Сеть недоступна или сменился пароль → выполните сброс Wi-Fi (раздел 7) |
|
||
| Панель в браузере не открывается | Проверьте, что компьютер в той же сети; уточните IP на экране прибора |
|
||
| Уведомления не приходят | Проверьте адрес webhook на панели и доступность сервера. Смотрите лог в мониторе порта (115200 бод): `[HTTP] Код: 200` — доставлено; `[HTTP] DNS не ответил` — проблема с именем сервера или DNS роутера; `[HTTP] Ошибка:` — сервер не ответил вовремя |
|
||
| Экран замирает на 1-3 с в момент аварии | Так и задумано: отправка уведомления блокирует прибор не дольше 3 секунд. Выходы аварии при этом срабатывают сразу, без ожидания сервера |
|
||
| Прибор не стартует после включения | Была нажата кнопка `D3` при подаче питания либо `D8` притянут к плюсу нагрузкой |
|
||
|
||
Подробный лог работы выводится в USB-порт: скорость **115200 бод**
|
||
(Arduino IDE → Инструменты → Монитор порта).
|
||
|
||
---
|
||
|
||
## 10. Безопасность
|
||
|
||
Прибор не имеет пароля на веб-панель. Любой пользователь локальной сети может
|
||
открыть панель, сбросить Wi-Fi и изменить адрес уведомлений. Устанавливайте
|
||
прибор в закрытом технологическом сегменте сети, не в гостевом Wi-Fi.
|
||
|
||
Контроллер выполняет **функцию мониторинга и сигнализации**, а не защиты.
|
||
Он не заменяет штатную автоматику защиты насосной станции.
|