Compare commits

..
8 Commits
Author SHA1 Message Date
oskarvitalii f77ff376d4 Merge dev into master: переработанный интерфейс и текст события в webhook
Веб-панель переделана в световое табло: главный ответ читается с
расстояния, цвета по конвенции сигнальных ламп, настройки свёрнуты.
Исправлено: лампа выхода «Авария» горела зелёным при срабатывании,
обновление стирало ввод в форме, шрифты тянулись с Google Fonts и на
объекте не загружались.

Страница переехала во флеш (PROGMEM) и в отдельный файл web_page.h -
последнее вынужденно: генератор прототипов Arduino не понимает сырые
строковые литералы и ломался на JavaScript внутри.

OLED: верхняя строка отдана статусу кеглем 2, добавлено состояние реле.

В теле webhook поле status теперь содержит человеческую фразу
(«Насосы стоят, подачу держит резерв»), машиночитаемое значение
переехало в новое поле state.

Прошито и проверено на приборе: COM7, LOLIN D1 ESP-WROOM-02, 2MB FS:64KB.
2026-08-08 01:40:10 +07:00
oskarvitalii d53035a5ef Merge dev into master: pump_controller_8_2_OLED_DONE
Добавлен проект контроллера насосной станции на Wemos D1 mini вместе с
его историей: мониторинг двух основных и резервного насоса, два реле
аварий на D3/D4 (модули active-LOW), OLED, веб-панель с настройками и
состоянием реле, уведомления на HTTPS-webhook, настройки в LittleFS.

Также: .gitignore переведён на белый список, чтобы рабочий каталог
D:\Soft\Arduino мог служить рабочим деревом репозитория, не втягивая
в него старые версии скетчей, архивы и драйверы.
2026-08-07 23:20:29 +07:00
oskarvitaliiandClaude Opus 4.8 bda2ecb7a3 Merge dev into master: carousel dot fix
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-25 13:56:38 +07:00
oskarvitaliiandClaude Opus 4.8 208669d19f Merge dev into master: boot icon carousel
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-25 12:51:03 +07:00
oskarvitaliiandClaude Opus 4.8 68bdfdc879 Merge dev into master: RU/EN web interface + scrollable forecast log
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-25 11:27:09 +07:00
oskarvitaliiandClaude Opus 4.8 2bf49c14ac revert: restore pre-4b59b89 web server (drop chunked API + low-memory auto-reboot)
The chunked API handlers and the maxblock<6000 auto-restart from 4b59b89
broke the web UI on-device; restore the working String-based handlers and
plain loop while keeping the scrollable forecast log.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 08:48:25 +07:00
oskarvitaliiandClaude Opus 4.8 f8294d4aed feat(web): scrollable Forecast log with fixed height
Cap the log panel at ~216px with a thin themed scrollbar so a long
forecast history does not stretch the page.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 07:08:21 +07:00
oskarvitaliiandClaude Opus 4.8 4b59b8936b fix: stream large API responses to stop heap-exhaustion truncation
Serving /api/history (and /api/forecasts) built a ~12 KB String +
JsonDocument every 15 s; over days this fragmented the ESP8266 heap until
the TCP stack could no longer send a full response, causing the web page
to fail with ERR_CONTENT_LENGTH_MISMATCH. Stream both array endpoints via
chunked transfer (small stack buffer, no big allocations). Add free-heap
to /api/current and Serial, plus a low-memory safety restart (history is
persisted first).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-21 06:57:09 +07:00
3 changed files with 5 additions and 51 deletions
+4 -15
View File
@@ -60,18 +60,12 @@ GND). **Сирену, лампу или пускатель напрямую к `
> **Важно: тип модуля должен быть именно active-LOW.** Если поставить модуль с
> активным HIGH, реле будет включено в норме и отпускать при аварии — логика
> перевернётся. Пины `D3` и `D4` выбраны именно под active-LOW: они удерживают
> HIGH во время загрузки, поэтому реле не остаются включёнными на всё время
> старта.
> HIGH во время загрузки платы, поэтому реле молчат при включении питания.
Оговорки, которые лучше знать заранее:
* **Оба реле кратковременно моргают при каждой перезагрузке прибора** — и при
подаче питания, и при заливке прошивки. Так и есть, это нормально: выходы
сидят на служебных пинах платы, и пока прошивка не запустилась, уровнем на них
управляет не она. Автоматика в этот момент ещё не работает, ложных уведомлений
моргание не вызывает.
* Если моргание окажется недопустимым (например, сирена успевает пискнуть) —
ставится RC-цепочка на вход релейного модуля. Прошивку менять не нужно.
* Реле «Авария» **щёлкает при каждой заливке прошивки**схема автосброса USB
дёргает `D3`. Это нормально.
* Встроенный светодиод платы повторяет состояние реле «Резерв» — удобно для
проверки монтажа.
* Схема **не отказобезопасная**: если контроллер обесточен, сигнала аварии нет.
@@ -149,11 +143,6 @@ ALARM:OFF BACKUP:OFF
Панель устроена как световое табло: **сверху крупно главный ответ**, ниже —
лампы датчиков и выходов, в самом низу свёрнутые настройки.
![Вид панели: состояние «Подача есть», лампы насосов и выходов, раскрытые настройки](docs/img/panel.jpg)
Так панель выглядит в норме. Здесь блок настроек раскрыт; обычно он свёрнут
в одну строку и не отвлекает.
### 5.1 Главная плашка
| Плашка | Цвет | Что значит |
@@ -306,7 +295,7 @@ ALARM:OFF BACKUP:OFF
| Экран замирает на 1-3 с в момент аварии | Так и задумано: отправка уведомления блокирует прибор не дольше 3 секунд. Реле при этом срабатывают сразу, без ожидания сервера |
| Панель пишет «Реле включено», но нагрузка не сработала | Проблема в монтаже или в типе модуля. Проверьте, что модуль **active-LOW**, что он питается, и что общий GND соединён |
| Реле сработали наоборот: включены в норме, отпускают при аварии | Стоит модуль с активным HIGH вместо active-LOW. Замените модуль либо потребуйте правку прошивки |
| Реле моргают при перезагрузке или заливке прошивки | Нормально, см. 2.3. Выходы на служебных пинах платы; пока прошивка не стартовала, уровнем управляет не она. Уведомления при этом не отправляются |
| Реле щёлкает при заливке прошивки | Нормально: схема автосброса USB дёргает `D3`. На работу не влияет |
| Имя устройства не сохраняется | В нём есть русские буквы, пробелы или знаки препинания — они отбрасываются. Допустимы только латиница, цифры, `_` и `-` |
| Задержка не сохраняется | Значение вне диапазона 0…3600 или не целое число — поле игнорируется |
| Прибор не стартует после включения | На `D3` или `D4` висит нагрузка, тянущая пин к GND при старте — проверьте релейный модуль и его питание |
+1 -36
View File
@@ -17,7 +17,6 @@
| `README.md` | Техническая документация (этот файл) |
| `MANUAL.md` | Руководство пользователя / монтажника |
| `docs/specs/` | Согласованные проектные решения по крупным изменениям |
| `docs/img/` | Снимки экрана для документации |
---
@@ -55,7 +54,7 @@ Wemos D1 Mini (ESP8266). Питание 5 В по microUSB или 3.3 В на п
Для реле active-LOW безопасное состояние — пин в `HIGH`. Значит выход обязан
сидеть на пине, который держит `HIGH` **всю загрузку**, пока `setup()` ещё не
выполнился, иначе реле останется включённым на всё время старта.
выполнился, иначе реле щёлкнет ложной аварией при каждом включении питания.
| Пин | GPIO | Уровень при загрузке | Реле active-LOW при загрузке |
|---|---|---|---|
@@ -79,42 +78,12 @@ Wemos D1 Mini (ESP8266). Питание 5 В по microUSB или 3.3 В на п
void setRelay(int pin, bool on) { digitalWrite(pin, on ? LOW : HIGH); }
```
#### Что происходит при перезагрузке на самом деле
Проверено на собранном приборе: **при перезагрузке оба реле кратковременно
моргают.** Признано некритичным и оставлено как есть.
Ранее в этом разделе утверждалось, что реле при загрузке молчат — это оказалось
неверно, и формулировка исправлена.
Наиболее вероятный механизм: оба выхода неизбежно сидят на служебных пинах.
`GPIO2` (`D4`) — это ещё и `UART1 TX`, и на нём во время загрузки появляется
служебный вывод; `GPIO0` (`D3`) — пин выбора режима загрузки, который дёргается
схемой сброса. Пока `setup()` не выполнился, уровнем на них управляет не
прошивка. Точную причину не измеряли: осциллографа в проверке не было.
Часть морганий может приходиться на светодиод релейного модуля, а не на
фактическое переключение контакта: короткий импульс успевает зажечь индикатор,
но не перебросить якорь. Различить можно тестером на контактах реле, если это
когда-нибудь станет важно.
**Почему решение всё равно верное.** Альтернатива — `D8` — не улучшила бы
ситуацию, а ухудшила: он подтянут к `LOW`, и реле было бы уверенно **включено
всю загрузку**, а не моргнуло бы. Кратковременное моргание предпочтительнее
устойчивого ложного сигнала на несколько секунд.
**Если моргание когда-нибудь станет проблемой** (например, сирена успевает
пискнуть): ставится RC-цепочка на вход релейного модуля, чтобы короткие импульсы
не проходили, либо модуль с триггером Шмитта на входе. Прошивку менять не
потребуется.
### 2.4 Прочие особенности ESP8266
* `D4` (GPIO2) — встроенный светодиод платы, тоже активен от `LOW`. Реле
«Резерв» получает бесплатную индикацию на плате.
* `D3` (GPIO0) — пин выбора режима загрузки. Схема автосброса USB дёргает его
вниз при заливке скетча, поэтому реле «Авария» щёлкает при каждой прошивке.
Кроме того, оба реле кратковременно моргают при любой перезагрузке (см. 2.3).
Косметика, но пугает.
* `A0` — **только аналоговый вход** (0–3.2 В, без внутренней подтяжки). Ни
цифровым выходом, ни входом с подтяжкой быть не может, поэтому в бюджет
@@ -442,10 +411,6 @@ Wi-Fi настройки из `/settings.json` не затрагивает, и
## 7. Веб-интерфейс
![Веб-панель контроллера: плашка состояния, лампы датчиков и выходов, раскрытые настройки](docs/img/panel.jpg)
*Панель в норме, с раскрытым блоком настроек. Снимок с работающего прибора.*
Сервер на порту `80`.
| Маршрут | Метод | Описание |
Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB