From 6240862c27a86681f3a061698d8f077e3f120372 Mon Sep 17 00:00:00 2001 From: Vitali Date: Sat, 8 Aug 2026 01:08:17 +0700 Subject: [PATCH] =?UTF-8?q?fix(build):=20=D0=B2=D1=8B=D0=BD=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=B8=20HTML=20=D0=B2=20web=5Fpage.h=20-=20=D1=81=D0=B1?= =?UTF-8?q?=D0=BE=D1=80=D0=BA=D0=B0=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20ard?= =?UTF-8?q?uino-cli=20=D0=BF=D0=B0=D0=B4=D0=B0=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Генератор прототипов Arduino не понимает сырые строковые литералы: внутри JS он нашёл "function draw(d){" и "function poll(){", принял их за определения функций C++ и вставил для них прототипы в начало файла. Сборка падала с "error: 'function' does not name a type", а директивы #line показывали ошибку на строках внутри HTML. Заголовочные файлы препроцессор не сканирует, поэтому страница переехала в web_page.h. Тот же приём используется в соседнем проекте. Ошибка не всплывала раньше потому, что я проверял скетч через g++ -fsyntax-only по .ino: так файл компилируется как обычный .cpp и препроцессор Arduino не участвует. Проверять сборку нужно arduino-cli, это записано в README 11.1. Прошито и проверено на железе (COM7, LOLIN D1 ESP-WROOM-02, 2MB FS:64KB): размеры флеша совпадают, LittleFS монтируется, ранее заданные через панель настройки пережили перепрошивку, Wi-Fi поднимается, датчики читаются. Co-Authored-By: Claude Opus 5 --- pump_controller_8_2_OLED_DONE/README.md | 41 ++++- .../pump_controller_8_2_OLED_DONE.ino | 157 +----------------- pump_controller_8_2_OLED_DONE/web_page.h | 154 +++++++++++++++++ 3 files changed, 198 insertions(+), 154 deletions(-) create mode 100644 pump_controller_8_2_OLED_DONE/web_page.h 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
+
Резерв
+
+ +
+
Выход «Авария»
+
Выход «Резерв»
+
+ +
Настройки
+
Память недоступна — настройки не сохранятся до перезагрузки.
+
+
+ +
+
+ +
Латиница, цифры, дефис и подчёркивание
+
+
+
+
аварии
+
+
резерва
+ +
+
+
+ +
)====="