EEPROM.commit() на целевой плате возвращает false — падает сам вызов SDK. Проверкой исходников исключены ошибка в библиотеке, перекрытие адресов и стирание сектора со стороны WiFiManager. Физический размер флеша тоже ни при чём: LittleFS на этом же чипе работает, что подтверждено соседним проектом на такой же плате. Наиболее вероятный механизм: при раскладке 4MB/FS:2MB сектор EEPROM (1019, 0x3FB000) попадает в щель между концом ФС (0x3FA000) и служебной областью SDK (0x3FC000) и оказывается защищён от стирания. Доказать не удалось, поэтому в документации гипотеза помечена как гипотеза. Переход на LittleFS выбран не как обход симптома, а как переезд на подтверждённо работающий на этом железе механизм. Настройки теперь в /settings.json (ArduinoJson v7). Загрузка отказоустойчива: отсутствующий или битый ключ оставляет значение по умолчанию, поэтому файл от прошлой версии прошивки не ломается при добавлении полей. Имена ключей вынесены в константы KEY_*, используемые и при чтении, и при записи. Молчаливой потери настроек больше нет: при недоступной ФС взводится settingsFsReady = false, и веб-панель показывает предупреждение, что настройки не переживут перезагрузку. В лог при старте выводится геометрия ФС и предупреждение при выборе FS:none. Проверено: xtensa-lx106-elf-g++ -fsyntax-only -Wall -Wextra против ядра 3.1.2 — предупреждений нет. На железе не проверялось. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
18 KiB
Контроллер насосов v8.2 — руководство пользователя
Документ для монтажника и обслуживающего персонала. Техническое описание кода — в README.md.
1. Что делает прибор
Контроллер следит за тремя насосами:
- Насос 1 и Насос 2 — основные;
- Резерв — аварийный (экстренный) насос.
Прибор:
- показывает состояние на экране;
- включает выход «Авария», если оба основных насоса остановлены;
- включает выход «Резерв», когда запускается резервный насос;
- отправляет уведомления на сервер (webhook) через интернет;
- показывает панель мониторинга в браузере в локальной сети.
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. Первое включение
-
Подайте питание. На экране появится
PUMP CTRL v8 / Starting.... -
Прибор не найдёт сохранённой сети и поднимет свою точку доступа:
Имя сети: Pump_Control_Set -
Подключитесь к ней с телефона или ноутбука (пароль не требуется).
-
Откройте в браузере
http://192.168.4.1— откроется страница настройки. -
Выберите вашу Wi-Fi-сеть, введите пароль, нажмите Save.
-
Прибор перезагрузится и покажет на экране полученный 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.
Если панель показывает красное предупреждение «Файловая система недоступна», настройки работают только до перезагрузки. Причина почти всегда в настройке
Flash Sizeпри прошивке — нужен вариант с файловой системой, неFS:none.
Русские буквы и пробелы в имени устройства не сохранятся — они будут отброшены. Это не ошибка: ограничение защищает формат уведомления от поломки. Пишите, например,
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).