diff --git a/pump_controller_8_2_OLED_DONE/README.md b/pump_controller_8_2_OLED_DONE/README.md index cd3ea0e..71de6c0 100644 --- a/pump_controller_8_2_OLED_DONE/README.md +++ b/pump_controller_8_2_OLED_DONE/README.md @@ -12,7 +12,8 @@ | Файл | Назначение | |---|---| -| `pump_controller_8_2_OLED_DONE.ino` | Весь прошивочный код (single-file Arduino sketch) | +| `pump_controller_8_2_OLED_DONE.ino` | Логика прошивки | +| `web_page.h` | HTML веб-панели в PROGMEM (см. 7.7 — вынесен не для красоты) | | `README.md` | Техническая документация (этот файл) | | `MANUAL.md` | Руководство пользователя / монтажника | | `docs/specs/` | Согласованные проектные решения по крупным изменениям | @@ -465,6 +466,21 @@ Wi-Fi настройки из `/settings.json` не затрагивает, и Nasosnaya_1` с красным кружком. Вкладка, забытая в фоне на телефоне, продолжает сигналить, не требуя переключения на неё. +### 7.7 Почему разметка лежит в отдельном файле + +`web_page.h` вынесен не ради опрятности, а вынужденно. Генератор прототипов +Arduino не понимает сырые строковые литералы (`R"=====( ... )====="`): он находит +внутри JavaScript строку `function draw(d){`, принимает её за определение функции +C++ и вставляет в начало файла прототип `function draw(d);`. Сборка падает с +`error: 'function' does not name a type`, причём директивы `#line` показывают +ошибку на строке внутри HTML. + +Заголовочные файлы препроцессор не сканирует, поэтому страница живёт там. + +Важное следствие для проверки: обычный `g++ -fsyntax-only` по `.ino` эту ошибку +**не покажет** — он компилирует файл как обычный `.cpp`, минуя препроцессор +Arduino. Проверять сборку нужно через `arduino-cli` (раздел 11.1). + ### 7.6 Доступ Аутентификации нет: любой в той же сети может сбросить Wi-Fi, подменить адрес @@ -556,14 +572,29 @@ ALARM:ON BACKUP:ON <- состояние выходов --- -## 11. Сборка +## 11. Сборка и прошивка + +Плата в IDE: **LOLIN(WEMOS) D1 ESP-WROOM-02**, а не `D1 R2 & mini`. У WROOM-02 +модуль на 2 МБ, и только у этой платы в списке есть нужные варианты `2MB (...)`. +`Flash Size` по умолчанию для неё — `2MB (FS:64KB OTA:~992KB)`, он и используется. + +`arduino-cli` отдельно ставить не нужно, он идёт внутри Arduino IDE: ```bash -arduino-cli compile --fqbn esp8266:esp8266:d1_mini pump_controller_8_2_OLED_DONE.ino +"C:/Program Files/Arduino IDE/resources/app/lib/backend/resources/arduino-cli.exe" compile --fqbn esp8266:esp8266:d1_wroom_02:eesz=2M64 --warnings all . ``` ```bash -arduino-cli upload -p COM3 --fqbn esp8266:esp8266:d1_mini pump_controller_8_2_OLED_DONE.ino +"C:/Program Files/Arduino IDE/resources/app/lib/backend/resources/arduino-cli.exe" upload -p COM7 --fqbn esp8266:esp8266:d1_wroom_02:eesz=2M64 . ``` -Монитор порта: 115200 бод. +Монитор порта: **115200 бод**. Если заливка падает с +`could not open port 'COM7': PermissionError`, порт держит открытый монитор +Arduino IDE — закройте его. + +### 11.1 Проверять сборку только через arduino-cli + +Скетч нельзя надёжно проверить, скормив `.ino` напрямую в `g++`: так +пропускается препроцессор Arduino, а именно он ломается на некоторых +конструкциях (раздел 7.7). Ошибка, которую `g++ -fsyntax-only` не показывает, +на реальной сборке останавливает всё. diff --git a/pump_controller_8_2_OLED_DONE/pump_controller_8_2_OLED_DONE.ino b/pump_controller_8_2_OLED_DONE/pump_controller_8_2_OLED_DONE.ino index 7417c93..ba581bc 100644 --- a/pump_controller_8_2_OLED_DONE/pump_controller_8_2_OLED_DONE.ino +++ b/pump_controller_8_2_OLED_DONE/pump_controller_8_2_OLED_DONE.ino @@ -534,155 +534,14 @@ void updatePumpState(Pump &p) { // ============================================================ // ВЕБ-ПАНЕЛЬ // ============================================================ -// Страница статическая и лежит целиком во флеше (PROGMEM). Состояние в неё -// подставляет JS, забирая /status и /config. Раньше HTML собирался строкой -// в куче на каждый запрос (~14 КБ при ~40 КБ свободной кучи) — теперь куча -// не тратится вообще, а ввод в форме не сбрасывается при обновлении данных. -// -// Дизайн — световое табло аварийной сигнализации, а не дашборд: главный ответ -// («есть подача или нет») занимает верх страницы и читается с расстояния, -// остальное подчинено ему. Цвета по конвенции сигнальных ламп: зелёная -// «работа», ЖЁЛТАЯ «внимание» для резерва (резерв в работе — предупреждение, -// система ещё справляется), красная «авария» только при остановке основных. -// -// Веб-шрифты намеренно не подключаются: сеть на объекте не разрешает внешние -// имена, и @import с Google Fonts там не грузится никогда. Характер задан -// контрастом кеглей, а не гарнитурой. - -static const char PAGE_HTML[] PROGMEM = R"=====( - -Насосная -
- -
- -
Связь…получаем состояние прибора
- -
-
Насос 1
-
Насос 2
-
Резерв
-
- -
-
Выход «Авария»
-
Выход «Резерв»
-
- -
Настройки
-
Память недоступна — настройки не сохранятся до перезагрузки.
-
-
- -
-
- -
Латиница, цифры, дефис и подчёркивание
-
-
-
-
аварии
-
-
резерва
- -
-
-
- -
)====="; +// Разметка вынесена в web_page.h намеренно, а не для красоты: генератор +// прототипов Arduino не понимает сырые строковые литералы и принимает +// "function draw(d){" внутри JS за определение функции C++, после чего +// вставляет для него прототип и сборка падает. Заголовочные файлы он не +// сканирует. Обычный g++ такую ошибку не показывает — она видна только +// при сборке через arduino-cli или IDE. +#include "web_page.h" +; // ============================================================ // SETUP diff --git a/pump_controller_8_2_OLED_DONE/web_page.h b/pump_controller_8_2_OLED_DONE/web_page.h new file mode 100644 index 0000000..41d5995 --- /dev/null +++ b/pump_controller_8_2_OLED_DONE/web_page.h @@ -0,0 +1,154 @@ +#pragma once + +// ============================================================ +// ВЕБ-ПАНЕЛЬ +// ============================================================ +// Страница статическая и лежит целиком во флеше (PROGMEM). Состояние в неё +// подставляет JS, забирая /status и /config. Раньше HTML собирался строкой +// в куче на каждый запрос (~14 КБ при ~40 КБ свободной кучи) — теперь куча +// не тратится вообще, а ввод в форме не сбрасывается при обновлении данных. +// +// Дизайн — световое табло аварийной сигнализации, а не дашборд: главный ответ +// («есть подача или нет») занимает верх страницы и читается с расстояния, +// остальное подчинено ему. Цвета по конвенции сигнальных ламп: зелёная +// «работа», ЖЁЛТАЯ «внимание» для резерва (резерв в работе — предупреждение, +// система ещё справляется), красная «авария» только при остановке основных. +// +// Веб-шрифты намеренно не подключаются: сеть на объекте не разрешает внешние +// имена, и @import с Google Fonts там не грузится никогда. Характер задан +// контрастом кеглей, а не гарнитурой. + +static const char PAGE_HTML[] PROGMEM = R"=====( + +Насосная +
+ +
+ +
Связь…получаем состояние прибора
+ +
+
Насос 1
+
Насос 2
+
Резерв
+
+ +
+
Выход «Авария»
+
Выход «Резерв»
+
+ +
Настройки
+
Память недоступна — настройки не сохранятся до перезагрузки.
+
+
+ +
+
+ +
Латиница, цифры, дефис и подчёркивание
+
+
+
+
аварии
+
+
резерва
+ +
+
+
+ +
)====="