Настройки через веб, состояние реле в UI, распиновка под реле active-LOW

Распиновка. Пина 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>
This commit is contained in:
Vitali
2026-08-07 16:02:21 +07:00
co-authored by Claude Opus 5
parent 2deb1b979f
commit a7ec85096a
4 changed files with 734 additions and 208 deletions
+100 -37
View File
@@ -42,23 +42,40 @@
**Контакт замкнут = насос работает.** Полярность не важна, внешние резисторы
и питание на контакты подавать не нужно.
### 2.3 Выходы аварии
### 2.3 Выходы на реле
| Клемма | Когда `HIGH` (3.3 В) |
|---|---|
| `D8` | Авария: оба основных насоса стоят |
| `D0` | Работает резервный насос |
Прибор рассчитан на **релейные модули с активным LOW** — те, у которых реле
включается замыканием входа на GND. Это самый распространённый тип модулей для
Arduino.
Выходы логические, 3.3 В, ток до ~12 мА. **Реле, сирену или лампу напрямую
подключать нельзя** — только через транзисторный ключ или релейный модуль
с оптронной развязкой.
| Клемма платы | Куда | Реле включается когда |
|---|---|---|
| `D3` | вход `IN` модуля «Авария» | оба основных насоса стоят |
| `D4` | вход `IN` модуля «Резерв» | работает резервный насос |
### 2.4 Кнопка сброса Wi-Fi
Питание модулей — от `5V` и `GND` платы (или от отдельного источника с общим
GND). **Сирену, лампу или пускатель напрямую к `D3`/`D4` подключать нельзя**
только через релейный модуль или транзисторный ключ.
Обычная кнопка без фиксации между `D3` и `GND`.
> **Важно: тип модуля должен быть именно active-LOW.** Если поставить модуль с
> активным HIGH, реле будет включено в норме и отпускать при аварии — логика
> перевернётся. Пины `D3` и `D4` выбраны именно под active-LOW: они удерживают
> HIGH во время загрузки платы, поэтому реле молчат при включении питания.
> Кнопку нельзя держать нажатой в момент включения питания — плата уйдёт в
> служебный режим и не запустится.
Оговорки, которые лучше знать заранее:
* Реле «Авария» **щёлкает при каждой заливке прошивки** — схема автосброса USB
дёргает `D3`. Это нормально.
* Встроенный светодиод платы повторяет состояние реле «Резерв» — удобно для
проверки монтажа.
* Схема **не отказобезопасная**: если контроллер обесточен, сигнала аварии нет.
Если это критично — снимайте нагрузку с **нормально замкнутого (NC)** контакта
реле, тогда пропажа питания читается системой как авария.
### 2.4 Свободные клеммы
`D8`, `D0` и `A0` прошивкой не используются. Учтите, что `A0` — только
аналоговый вход и цифровым выходом стать не может.
### 2.5 Экран
@@ -121,19 +138,47 @@ STATUS: OK
* три карточки насосов с индикаторами;
* панель состояния системы (`SYS_OK` или `CRITICAL`);
* **состояние обоих реле** — «Включено» / «Выключено»;
* кнопка **Сбросить Wi-Fi**;
* поле **Webhook URL** для смены адреса уведомлений.
* блок **Настройки** — адрес уведомлений, имя устройства и две выдержки.
Страница обновляется автоматически при изменении состояния насосов.
Страница обновляется автоматически при изменении состояния насосов или реле.
### Адрес уведомлений
### 5.1 Состояние реле
**На новом приборе адрес не задан** — панель покажет
`не задан - уведомления отключены`, и сообщения на сервер отправляться не будут.
Введите адрес в поле под заголовком `Webhook URL` и нажмите **Сохранить**.
Два индикатора показывают, что прибор реально подал на выход:
Адрес сохраняется в память прибора и переживает отключение питания и сброс
Wi-Fi. Максимальная длина — 220 символов.
| Индикатор | Значение |
|---|---|
| Реле «Авария» — Включено | Выход `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`.
**На новом приборе адрес уведомлений не задан** — панель покажет
`не задан - уведомления отключены`, сообщения отправляться не будут, всё
остальное работает.
---
@@ -161,17 +206,21 @@ Wi-Fi. Максимальная длина — 220 символов.
## 7. Сброс настроек Wi-Fi
Нужен при смене роутера или пароля сети.
Нужен при смене роутера или пароля сети. Физической кнопки сброса у прибора нет.
**Способ 1 — кнопкой:**
нажмите и держите кнопку на `D3`. На экране появится полоса и обратный отсчёт
от 3 секунд. Дождитесь конца — прибор перезагрузится и снова поднимет точку
доступа `Pump_Control_Set`. Отпустите кнопку раньше — ничего не произойдёт.
**Если сеть пропала или сменился пароль** — ничего делать не нужно: при
перезагрузке прибор не сможет подключиться и **сам** поднимет точку доступа
`Pump_Control_Set`. Подключитесь к ней и введите новые данные (раздел 3).
**Способ 2 — через браузер:**
на панели мониторинга нажмите **Сбросить Wi-Fi**.
**Если надо перевести прибор в другую сеть, а текущая работает** — нажмите
**Сбросить Wi-Fi** на панели мониторинга. Прибор перезагрузится и поднимет точку
доступа.
Webhook URL при сбросе Wi-Fi **не стирается**.
**Если панель недоступна, а сеть работает** — выключите роутер и перезагрузите
прибор по питанию. Не найдя сеть, он откроет портал настройки.
Настройки из блока «Настройки» (адрес уведомлений, имя устройства, выдержки) при
сбросе Wi-Fi **не стираются**.
---
@@ -182,10 +231,17 @@ Webhook URL при сбросе Wi-Fi **не стирается**.
| Событие | Задержка |
|---|---|
| Фиксация нового состояния датчика | 3 секунды |
| Авария основных насосов (после фиксации) | ещё 5 секунд |
| **Итого до сигнала аварии** | **~8 секунд** |
| Реакция на резервный насос | ~3 секунды |
| Фиксация нового состояния датчика | 3 секунды (не настраивается) |
| Авария основных насосов (после фиксации) | **Выдержка аварии**, по умолчанию 5 с |
| Пуск резерва (после фиксации) | **Выдержка резерва**, по умолчанию 0 с |
| Итого до сигнала аварии при значениях по умолчанию | **~8 секунд** |
| Итого до сигнала о резерве при значениях по умолчанию | ~3 секунды |
Обе выдержки настраиваются в панели (раздел 5.2) и действуют **одновременно на
реле и на уведомление** — отдельно задержать только уведомление нельзя.
Выдержка `0` означает «сразу после фиксации», то есть через те же 3 секунды
антидребезга.
---
@@ -199,8 +255,13 @@ Webhook URL при сбросе Wi-Fi **не стирается**.
| `WiFi: NO CONNECTION` | Сеть недоступна или сменился пароль → выполните сброс Wi-Fi (раздел 7) |
| Панель в браузере не открывается | Проверьте, что компьютер в той же сети; уточните IP на экране прибора |
| Уведомления не приходят | Проверьте адрес webhook на панели и доступность сервера. Смотрите лог в мониторе порта (115200 бод): `[HTTP] Код: 200` — доставлено; `[HTTP] DNS не ответил` — проблема с именем сервера или DNS роутера; `[HTTP] Ошибка:` — сервер не ответил вовремя |
| Экран замирает на 1-3 с в момент аварии | Так и задумано: отправка уведомления блокирует прибор не дольше 3 секунд. Выходы аварии при этом срабатывают сразу, без ожидания сервера |
| Прибор не стартует после включения | Была нажата кнопка `D3` при подаче питания либо `D8` притянут к плюсу нагрузкой |
| Экран замирает на 1-3 с в момент аварии | Так и задумано: отправка уведомления блокирует прибор не дольше 3 секунд. Реле при этом срабатывают сразу, без ожидания сервера |
| Панель пишет «Реле включено», но нагрузка не сработала | Проблема в монтаже или в типе модуля. Проверьте, что модуль **active-LOW**, что он питается, и что общий GND соединён |
| Реле сработали наоборот: включены в норме, отпускают при аварии | Стоит модуль с активным HIGH вместо active-LOW. Замените модуль либо потребуйте правку прошивки |
| Реле щёлкает при заливке прошивки | Нормально: схема автосброса USB дёргает `D3`. На работу не влияет |
| Имя устройства не сохраняется | В нём есть русские буквы, пробелы или знаки препинания — они отбрасываются. Допустимы только латиница, цифры, `_` и `-` |
| Выдержка не сохраняется | Значение вне диапазона 0…3600 или не целое число — поле игнорируется |
| Прибор не стартует после включения | На `D3` или `D4` висит нагрузка, тянущая пин к GND при старте — проверьте релейный модуль и его питание |
Подробный лог работы выводится в USB-порт: скорость **115200 бод**
(Arduino IDE → Инструменты → Монитор порта).
@@ -210,8 +271,10 @@ Webhook URL при сбросе Wi-Fi **не стирается**.
## 10. Безопасность
Прибор не имеет пароля на веб-панель. Любой пользователь локальной сети может
открыть панель, сбросить Wi-Fi и изменить адрес уведомлений. Устанавливайте
прибор в закрытом технологическом сегменте сети, не в гостевом Wi-Fi.
открыть панель, сбросить Wi-Fi, изменить адрес уведомлений и **увеличить
выдержки аварии**, то есть замедлить реакцию сигнализации. Устанавливайте прибор
в закрытом технологическом сегменте сети, не в гостевом Wi-Fi.
Контроллер выполняет **функцию мониторинга и сигнализации**, а не защиты.
Он не заменяет штатную автоматику защиты насосной станции.
Он не заменяет штатную автоматику защиты насосной станции. Кроме того, схема не
отказобезопасна: обесточенный контроллер сигнала аварии не подаёт (см. 2.3).