Распиновка. Пина D0, который использовался под выход «Резерв», в доступном наборе нет. Кнопка сброса Wi-Fi удалена как избыточная: при пропавшей сети wm.autoConnect() сам поднимает портал. Освободившийся D3 закрыл дефицит. Выходы переехали на D3 и D4 и стали инверсными. Причина: для реле active-LOW безопасное состояние — пин в HIGH, а D3/D4 подтянуты к HIGH внешними резисторами платы и держат этот уровень всю загрузку. D8, наоборот, подтянут к LOW и щёлкал бы реле при каждом включении питания. В setup() digitalWrite() идёт до pinMode(), иначе защёлка выхода даёт короткий LOW. Инверсия живёт только в setRelay(); логическое состояние дублируется в relayMainOn/relayEmergOn, чтобы панель показывала смысл, а не уровень пина. Настройки. device, выдержка аварии и выдержка резерва вынесены в /set_config и EEPROM. Раскладка EEPROM версионирована: magic 0xA55B, старый 0xA55A распознаётся и переносится, поэтому прошитые приборы не теряют webhook. Значения по умолчанию воспроизводят прежнее поведение (5 с и 0 с). Для резерва добавлена выдержка, которой раньше не было, симметрично основной аварии. Обе выдержки гасят реле и вебхук одновременно. device_name фильтруется до [A-Za-z0-9_-] вместо экранирования: такой набор безопасен и в JSON, и в HTML. Пустое или неверное поле формы означает «не менять», поэтому частичное заполнение не сбрасывает остальное. Состояние реле выведено в /status и в панель. Проверено: xtensa-lx106-elf-g++ -fsyntax-only -Wall -Wextra против ядра 3.1.2 — предупреждений в скетче нет (попутно убран неиспользуемый isEmergency); валидация настроек прогнана на 22 граничных случаях; раскладка EEPROM проверена на перекрытия. На железе не проверялось. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
281 lines
18 KiB
Markdown
281 lines
18 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 Выходы на реле
|
||
|
||
Прибор рассчитан на **релейные модули с активным LOW** — те, у которых реле
|
||
включается замыканием входа на GND. Это самый распространённый тип модулей для
|
||
Arduino.
|
||
|
||
| Клемма платы | Куда | Реле включается когда |
|
||
|---|---|---|
|
||
| `D3` | вход `IN` модуля «Авария» | оба основных насоса стоят |
|
||
| `D4` | вход `IN` модуля «Резерв» | работает резервный насос |
|
||
|
||
Питание модулей — от `5V` и `GND` платы (или от отдельного источника с общим
|
||
GND). **Сирену, лампу или пускатель напрямую к `D3`/`D4` подключать нельзя** —
|
||
только через релейный модуль или транзисторный ключ.
|
||
|
||
> **Важно: тип модуля должен быть именно active-LOW.** Если поставить модуль с
|
||
> активным HIGH, реле будет включено в норме и отпускать при аварии — логика
|
||
> перевернётся. Пины `D3` и `D4` выбраны именно под active-LOW: они удерживают
|
||
> HIGH во время загрузки платы, поэтому реле молчат при включении питания.
|
||
|
||
Оговорки, которые лучше знать заранее:
|
||
|
||
* Реле «Авария» **щёлкает при каждой заливке прошивки** — схема автосброса USB
|
||
дёргает `D3`. Это нормально.
|
||
* Встроенный светодиод платы повторяет состояние реле «Резерв» — удобно для
|
||
проверки монтажа.
|
||
* Схема **не отказобезопасная**: если контроллер обесточен, сигнала аварии нет.
|
||
Если это критично — снимайте нагрузку с **нормально замкнутого (NC)** контакта
|
||
реле, тогда пропажа питания читается системой как авария.
|
||
|
||
### 2.4 Свободные клеммы
|
||
|
||
`D8`, `D0` и `A0` прошивкой не используются. Учтите, что `A0` — только
|
||
аналоговый вход и цифровым выходом стать не может.
|
||
|
||
### 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**;
|
||
* блок **Настройки** — адрес уведомлений, имя устройства и две выдержки.
|
||
|
||
Страница обновляется автоматически при изменении состояния насосов или реле.
|
||
|
||
### 5.1 Состояние реле
|
||
|
||
Два индикатора показывают, что прибор реально подал на выход:
|
||
|
||
| Индикатор | Значение |
|
||
|---|---|
|
||
| Реле «Авария» — Включено | Выход `D3` активен, сигнал аварии выдан |
|
||
| Реле «Резерв» — Включено | Выход `D4` активен, резерв работает |
|
||
|
||
Полезно при пусконаладке: если реле показано «Включено», а нагрузка не
|
||
сработала — проблема в монтаже или в типе релейного модуля, а не в прошивке.
|
||
|
||
### 5.2 Настройки
|
||
|
||
Все настройки в одной форме. **Пустое поле означает «не менять»** — можно
|
||
поправить одну выдержку, не трогая остальное. Неверное значение так же
|
||
игнорируется, поэтому опечатка ничего не испортит.
|
||
|
||
| Поле | Что задаёт | Допустимо | По умолчанию |
|
||
|---|---|---|---|
|
||
| **Webhook URL** | адрес сервера уведомлений | до 220 символов | не задан |
|
||
| **Имя устройства** | поле `device` в уведомлении — по нему различают приборы на сервере | латиница, цифры, `_`, `-`; до 31 символа | `Wemos_D1_Pump` |
|
||
| **Выдержка аварии, с** | сколько оба основных насоса должны стоять до сигнала | 0…3600 | `5` |
|
||
| **Выдержка резерва, с** | сколько резерв должен работать до сигнала | 0…3600 | `0` (сразу) |
|
||
|
||
Настройки сохраняются в памяти прибора, переживают отключение питания и сброс
|
||
Wi-Fi.
|
||
|
||
> Русские буквы и пробелы в имени устройства **не сохранятся** — они будут
|
||
> отброшены. Это не ошибка: ограничение защищает формат уведомления от поломки.
|
||
> Пишите, например, `Nasosnaya_1` или `Pump_Station_A`.
|
||
|
||
**На новом приборе адрес уведомлений не задан** — панель покажет
|
||
`не задан - уведомления отключены`, сообщения отправляться не будут, всё
|
||
остальное работает.
|
||
|
||
---
|
||
|
||
## 6. Уведомления на сервер
|
||
|
||
При изменении ситуации прибор отправляет сообщение на настроенный адрес:
|
||
|
||
| Событие | Что означает |
|
||
|---|---|
|
||
| `MAIN PUMPS` / `ALARM` | Оба основных насоса стоят |
|
||
| `MAIN PUMPS` / `OK` | Работа восстановлена |
|
||
| `EMERGENCY PUMP` / `STARTED` | Запустился резервный насос |
|
||
| `EMERGENCY PUMP` / `STOPPED` | Резервный насос остановился |
|
||
|
||
Уведомления отправляются один раз на каждое изменение, а не повторяются.
|
||
Если в момент события связи не было — уведомление **не будет** отправлено
|
||
позже, оно теряется.
|
||
|
||
На отправку отводится не больше **3 секунд**. Если сервер недоступен или
|
||
отвечает медленно, прибор прекращает попытку и продолжает работу: экран и
|
||
кнопка на это время замирают, но **выходы аварии срабатывают сразу**, не
|
||
дожидаясь сервера.
|
||
|
||
---
|
||
|
||
## 7. Сброс настроек Wi-Fi
|
||
|
||
Нужен при смене роутера или пароля сети. Физической кнопки сброса у прибора нет.
|
||
|
||
**Если сеть пропала или сменился пароль** — ничего делать не нужно: при
|
||
перезагрузке прибор не сможет подключиться и **сам** поднимет точку доступа
|
||
`Pump_Control_Set`. Подключитесь к ней и введите новые данные (раздел 3).
|
||
|
||
**Если надо перевести прибор в другую сеть, а текущая работает** — нажмите
|
||
**Сбросить Wi-Fi** на панели мониторинга. Прибор перезагрузится и поднимет точку
|
||
доступа.
|
||
|
||
**Если панель недоступна, а сеть работает** — выключите роутер и перезагрузите
|
||
прибор по питанию. Не найдя сеть, он откроет портал настройки.
|
||
|
||
Настройки из блока «Настройки» (адрес уведомлений, имя устройства, выдержки) при
|
||
сбросе Wi-Fi **не стираются**.
|
||
|
||
---
|
||
|
||
## 8. Задержки срабатывания
|
||
|
||
Задержки заданы намеренно, чтобы не срабатывать на кратковременные пуски и
|
||
остановки:
|
||
|
||
| Событие | Задержка |
|
||
|---|---|
|
||
| Фиксация нового состояния датчика | 3 секунды (не настраивается) |
|
||
| Авария основных насосов (после фиксации) | **Выдержка аварии**, по умолчанию 5 с |
|
||
| Пуск резерва (после фиксации) | **Выдержка резерва**, по умолчанию 0 с |
|
||
| Итого до сигнала аварии при значениях по умолчанию | **~8 секунд** |
|
||
| Итого до сигнала о резерве при значениях по умолчанию | ~3 секунды |
|
||
|
||
Обе выдержки настраиваются в панели (раздел 5.2) и действуют **одновременно на
|
||
реле и на уведомление** — отдельно задержать только уведомление нельзя.
|
||
|
||
Выдержка `0` означает «сразу после фиксации», то есть через те же 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 секунд. Реле при этом срабатывают сразу, без ожидания сервера |
|
||
| Панель пишет «Реле включено», но нагрузка не сработала | Проблема в монтаже или в типе модуля. Проверьте, что модуль **active-LOW**, что он питается, и что общий GND соединён |
|
||
| Реле сработали наоборот: включены в норме, отпускают при аварии | Стоит модуль с активным HIGH вместо active-LOW. Замените модуль либо потребуйте правку прошивки |
|
||
| Реле щёлкает при заливке прошивки | Нормально: схема автосброса USB дёргает `D3`. На работу не влияет |
|
||
| Имя устройства не сохраняется | В нём есть русские буквы, пробелы или знаки препинания — они отбрасываются. Допустимы только латиница, цифры, `_` и `-` |
|
||
| Выдержка не сохраняется | Значение вне диапазона 0…3600 или не целое число — поле игнорируется |
|
||
| Прибор не стартует после включения | На `D3` или `D4` висит нагрузка, тянущая пин к GND при старте — проверьте релейный модуль и его питание |
|
||
|
||
Подробный лог работы выводится в USB-порт: скорость **115200 бод**
|
||
(Arduino IDE → Инструменты → Монитор порта).
|
||
|
||
---
|
||
|
||
## 10. Безопасность
|
||
|
||
Прибор не имеет пароля на веб-панель. Любой пользователь локальной сети может
|
||
открыть панель, сбросить Wi-Fi, изменить адрес уведомлений и **увеличить
|
||
выдержки аварии**, то есть замедлить реакцию сигнализации. Устанавливайте прибор
|
||
в закрытом технологическом сегменте сети, не в гостевом Wi-Fi.
|
||
|
||
Контроллер выполняет **функцию мониторинга и сигнализации**, а не защиты.
|
||
Он не заменяет штатную автоматику защиты насосной станции. Кроме того, схема не
|
||
отказобезопасна: обесточенный контроллер сигнала аварии не подаёт (см. 2.3).
|