diff --git a/Firmware/v4.5_AiO_WEB/README.md b/Firmware/v4.5_AiO_WEB/README.md index b3a7a82..f97f2f2 100644 --- a/Firmware/v4.5_AiO_WEB/README.md +++ b/Firmware/v4.5_AiO_WEB/README.md @@ -31,7 +31,7 @@ One row per day, in short; the details are in the sections of this file (the lin | Date | What changed | |---|---| -| 10 Nov 2026 | A temperature that a device does not give (UM982, some u-blox firmware, an older XIAO program) now reads just *not reported* ([Identification](#identification)). | +| 10 Nov 2026 | A temperature that a device does not give (UM982, some u-blox firmware, an older XIAO program) now reads just *not reported* ([Identification](#identification)). Tabs and the light/dark button 44 px high with 8 px corners ([Web page](#web-page)). | | 9 Nov 2026 | The page's questions (TM171, receiver set-up, settings, firmware, restart) in its own box: the browser's pop-ups show nothing inside an AgOpenWeb web card, so those buttons did nothing there ([Web page](#web-page)). | | 7 Nov 2026 | Add-on card (`_aowcard._tcp`) under a unique name, on the Connections card. Status cards reordered, steering settings folded into Steering; Machine tab reads the sprayer's PGN 161 (rate, alarms) ([Web page](#web-page)). Shorter notes, short headers. | | 4 Nov 2026 | Built at **450 MHz** (cooler; the loop has time to spare). Temperatures on the cards: the Teensy with its clock ([Firmware tab](#web-page)), the u-blox [receivers](#identification), the [TM171](#imu-tm171-or-bno085) and the [XIAO](#xiao-esp32c3--esp32s3). | @@ -75,7 +75,7 @@ Open `http:///`, normally `http://192.168.5.126/` (the third number f Dark or light: the ☀ / ☾ button at the top (remembered by the browser), otherwise the device's setting. -Every question the page asks (write to the TM171, load the receiver's settings, switch the WAS check off, install firmware, restart…) opens in a box of the page itself, not a browser pop-up: inside an AgOpenWeb web card the browser's pop-ups show nothing, so those buttons did nothing there (official `Docs/ADD_ON_CARDS.md`: the card's frame has no `allow-modals`). +Every question the page asks (write to the TM171, load the receiver's settings, switch the WAS check off, install firmware, restart…) opens in a box of the page itself, not a browser pop-up: inside an AgOpenWeb web card the browser's pop-ups show nothing, so those buttons did nothing there (official `Docs/ADD_ON_CARDS.md`: the card's frame has no `allow-modals`). The tabs and the light/dark button at the top are 44 px high, with the same 8 px corners as that box's buttons: a size a finger hits on the cab's screen. **Without a module:** the [simulator](https://renatorgr.github.io/Boards/) shows this page and the XIAO's with a pretend module behind them (any GPS, IMU, steering and program; tractor driving or parked), rebuilt from the code on every change. See [`Firmware/simulator`](../simulator). diff --git a/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32/README.md b/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32/README.md index 74fdcce..db5785f 100644 --- a/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32/README.md +++ b/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32/README.md @@ -23,6 +23,7 @@ Version 4.5, the same number as the Teensy firmware it goes with (v4.5_AiO_WEB). | Date | What changed | |---|---| +| 10 Nov 2026 | Tabs and the light/dark button 44 px high with 8 px corners; the WiFi tab's password to confirm in a card of its own, no longer a field across the page ([What it does](#what-it-does)). Messages give the size of an updated program, not 0 bytes. | | 9 Nov 2026 | The page's questions (save and restart, install, the module's firmware, subnet) in its own box: the browser's pop-ups show nothing inside an AgOpenWeb web card, so those buttons did nothing there ([What it does](#what-it-does)). | | 7 Nov 2026 | Add-on card (`_aowcard._tcp`) under the XIAO's own WiFi name ([What it does](#what-it-does)). Program → module shows up to 64 sections (PGN 229); the WiFi settings save in one row; a shorter note in the Module firmware card; short file headers. | | 4 Nov 2026 | The XIAO's temperature in its card, here and on the Teensy page; the Teensy's clock and temperature in the [Module card](#what-it-does). | @@ -63,6 +64,8 @@ Version 4.5, the same number as the Teensy firmware it goes with (v4.5_AiO_WEB). - Changes (WiFi, update, restart) **ask for the password of the XIAO's own network**, to confirm. - The question before each one (save and restart, install, the module's firmware, the subnet) opens in a box of the page itself, not a browser pop-up: inside an AgOpenWeb web card the browser's pop-ups show nothing, so those buttons did nothing there. + - The tabs and the light/dark button at the top are 44 px high, with the same 8 px corners as that box's buttons: a size a finger hits on the cab's screen. + - On the WiFi tab the password and **Save and restart the XIAO** have a card of their own, *Confirm and save*, as wide as the other two. - Typed once, it is filled in both tabs until the page is closed. - The page never shows or stores it. - Just viewing the page needs nothing more than being on the network. diff --git a/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32/v4.5_XIAO_ESP32.ino b/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32/v4.5_XIAO_ESP32.ino index 569be59..edfcae3 100644 --- a/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32/v4.5_XIAO_ESP32.ino +++ b/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32/v4.5_XIAO_ESP32.ino @@ -540,6 +540,7 @@ static void apiScan() // Program update: the .bin from "Sketch > Export Compiled Binary" static bool updOk = false; static String updErr; +static size_t updBytes = 0; // size of the program received (Update.progress() reads 0 once Update.end() has run) // How long an upload may wait for the next data from the browser (3 Nov 2026). The web server gives up after 5 s // (HTTP_MAX_SEND_WAIT), and a weak Wi-Fi link can pause longer than that: the upload was then cut off with nothing @@ -577,6 +578,7 @@ static void updateUpload() { if (updErr.length() == 0) { + updBytes = up.totalSize; if (Update.end(true)) updOk = true; else updErr = Update.errorString(); } @@ -596,7 +598,7 @@ static void updateDone() { if (updOk) { - logEvent("Program update: %u bytes checked, restarting", (unsigned)Update.progress()); + logEvent("Program update: %u bytes checked, restarting", (unsigned)updBytes); server.send(200, "application/json", "{\"ok\":true}"); rebootAtMs = millis() + 1500; } diff --git a/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32/xPage.h b/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32/xPage.h index 4849149..ef3c3c3 100644 --- a/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32/xPage.h +++ b/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32/xPage.h @@ -29,19 +29,18 @@ const char XIAO_PAGE[] PROGMEM = R"XIAOPAGE( @media (prefers-color-scheme:light){:root:not([data-theme]){color-scheme:light;--bg:#f2f4ef;--card:#ffffff;--ink:#1c2318;--mute:#5f6b5a;--line:#d4dbcf;--ok:#2e7d32;--warn:#b45309;--bad:#c62828;--acc:#4c7d2a;--accInk:#ffffff;--soft:#e9eee5}} *{box-sizing:border-box} body{margin:0;background:var(--bg);color:var(--ink);accent-color:var(--acc);font:15px/1.45 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif} -header{display:flex;align-items:center;gap:10px;padding:10px 16px;background:var(--card);border-bottom:1px solid var(--line)} +header{display:flex;align-items:center;gap:10px;padding:2px 16px;min-height:48px;background:var(--card);border-bottom:1px solid var(--line)} #top{position:sticky;top:0;z-index:3} /* header and tabs stay in view while the page scrolls (small windows, the program's web cards) */ header h1{font-size:16px;margin:0;font-weight:650;white-space:nowrap} header .sub{color:var(--mute);font-size:13px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .dot{width:11px;height:11px;border-radius:50%;background:var(--bad);flex:none} .dot.on{background:var(--ok)} -nav{display:flex;gap:6px;padding:8px 12px;overflow-x:auto;background:var(--card);border-bottom:1px solid var(--line)} -nav button{border:1px solid var(--line);background:var(--card);color:var(--ink);border-radius:999px;padding:7px 14px;font:inherit;font-size:14px;cursor:pointer;white-space:nowrap} +nav{display:flex;gap:6px;padding:4px 12px;overflow-x:auto;background:var(--card);border-bottom:1px solid var(--line)} +nav button{border:1px solid var(--line);background:var(--card);color:var(--ink);border-radius:8px;min-height:44px;padding:7px 14px;font:inherit;font-size:14px;cursor:pointer;white-space:nowrap} nav button.on{background:var(--acc);border-color:var(--acc);color:var(--accInk)} main{padding:14px 16px 40px;max-width:1100px;margin:0 auto} .grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:12px} .grid3{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px} -.saverow{grid-column:1/-1;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:0 12px;align-items:end;padding:0 14px}.saverow .note{grid-column:1/-1} @media (max-width:760px){.grid3{grid-template-columns:1fr}} .card{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:12px 14px;min-width:0} .card h2{font-size:12.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--mute);margin:0 0 8px;font-weight:650} @@ -86,7 +85,7 @@ h3{font-size:14px;margin:14px 0 4px} .info{background:color-mix(in srgb,var(--acc) 16%,transparent);border:1px solid var(--acc);border-radius:12px;padding:9px 12px;margin:0 0 12px;font-weight:600} .info.warn{background:color-mix(in srgb,var(--warn) 16%,transparent);border-color:var(--warn)} a{color:var(--acc)} -.tbtn{margin-left:auto;flex:none;border:1px solid var(--line);background:var(--soft);color:var(--ink);border-radius:999px;padding:3px 11px;font:inherit;font-size:13px;font-weight:650;cursor:pointer} +.tbtn{margin-left:auto;flex:none;border:1px solid var(--line);background:var(--soft);color:var(--ink);border-radius:8px;min-width:44px;min-height:44px;padding:0;font:inherit;font-size:18px;font-weight:650;cursor:pointer} @media (max-width:520px){header .sub{display:none}} /* the page's own question box (ask / askText in the script): the browser's confirm() and prompt() show nothing inside an AgOpenWeb web card (its frame has no allow-modals), so the page never uses them; buttons 44 px high, as the cards ask */ @@ -156,10 +155,10 @@ a{color:var(--acc)} -
+

Confirm and save

-

The XIAO restarts to apply them. If you change the name or the password of the XIAO network, connect the phone to the new network again. Forgot the password? Through the USB port on the panel, in the serial monitor: wifi-reset.

+

The XIAO restarts to apply the new settings. If you change the name or the password of the XIAO network, connect the phone to the new network again. Forgot the password? Through the USB port on the panel, in the serial monitor: wifi-reset.

diff --git a/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/README.md b/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/README.md index 3adf594..e3fe73f 100644 --- a/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/README.md +++ b/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/README.md @@ -4,7 +4,7 @@ The same program (`v4.5_XIAO_ESP32`, for the Teensy firmware v4.5_AiO_WEB), comp The ESP32C3 and the ESP32S3 are different chips: each needs its own file. -**Built:** 9 Nov 2026 (C3 15:49, S3 15:50), from the program as it is after the pull request that moves the page's questions (save and restart, install, the module's firmware) into the page's own box, for the AgOpenWeb web cards. Compiled in the cloud with the ESP32 core 3.3.12 (arduino-cli, the board's default settings, the same as in the program's README). +**Built:** 10 Nov 2026 (C3 20:40, S3 20:41), from the program as it is after the pull request that makes the tabs and the light/dark button 44 px high and gives the WiFi tab's password its own card. Compiled in the cloud with the ESP32 core 3.3.12 (arduino-cli, the board's default settings, the same as in the program's README). When the program in `v4.5_XIAO_ESP32` changes, compile these files again and upload them over the old ones, with the same names. **Install from GitHub** on the XIAO page offers a file when it was compiled later than the program running on the XIAO (the date is read from the file). | File | What for | diff --git a/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/v4.5_XIAO_ESP32C3.bin b/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/v4.5_XIAO_ESP32C3.bin index a91427a..b4126e8 100644 Binary files a/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/v4.5_XIAO_ESP32C3.bin and b/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/v4.5_XIAO_ESP32C3.bin differ diff --git a/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/v4.5_XIAO_ESP32C3_USB.bin b/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/v4.5_XIAO_ESP32C3_USB.bin index 0fdac97..4c1e3aa 100644 Binary files a/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/v4.5_XIAO_ESP32C3_USB.bin and b/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/v4.5_XIAO_ESP32C3_USB.bin differ diff --git a/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/v4.5_XIAO_ESP32S3.bin b/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/v4.5_XIAO_ESP32S3.bin index bd7ddcf..799830b 100644 Binary files a/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/v4.5_XIAO_ESP32S3.bin and b/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/v4.5_XIAO_ESP32S3.bin differ diff --git a/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/v4.5_XIAO_ESP32S3_USB.bin b/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/v4.5_XIAO_ESP32S3_USB.bin index 4838fcb..7ee692a 100644 Binary files a/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/v4.5_XIAO_ESP32S3_USB.bin and b/Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/v4.5_XIAO_ESP32S3_USB.bin differ diff --git a/Firmware/v4.5_AiO_WEB/zWebPage.h b/Firmware/v4.5_AiO_WEB/zWebPage.h index 0519a85..06f26df 100644 --- a/Firmware/v4.5_AiO_WEB/zWebPage.h +++ b/Firmware/v4.5_AiO_WEB/zWebPage.h @@ -39,14 +39,14 @@ const char WEB_PAGE[] PROGMEM = R"WEBPAGE( @media (prefers-color-scheme:light){:root:not([data-theme]){color-scheme:light;--bg:#f2f4ef;--card:#ffffff;--ink:#1c2318;--mute:#5f6b5a;--line:#d4dbcf;--ok:#2e7d32;--warn:#b45309;--bad:#c62828;--acc:#4c7d2a;--accInk:#ffffff;--soft:#e9eee5}} *{box-sizing:border-box} body{margin:0;background:var(--bg);color:var(--ink);accent-color:var(--acc);font:15px/1.45 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif} -header{display:flex;align-items:center;gap:10px;padding:10px 16px;background:var(--card);border-bottom:1px solid var(--line)} +header{display:flex;align-items:center;gap:10px;padding:2px 16px;min-height:48px;background:var(--card);border-bottom:1px solid var(--line)} #top{position:sticky;top:0;z-index:3} /* header and tabs stay in view while the page scrolls (small windows, the program's web cards) */ header h1{font-size:16px;margin:0;font-weight:650;white-space:nowrap} header .sub{color:var(--mute);font-size:13px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .dot{width:11px;height:11px;border-radius:50%;background:var(--bad);flex:none} .dot.on{background:var(--ok)} -nav{display:flex;gap:6px;padding:8px 12px;overflow-x:auto;background:var(--card);border-bottom:1px solid var(--line)} -nav button{border:1px solid var(--line);background:var(--card);color:var(--ink);border-radius:999px;padding:7px 14px;font:inherit;font-size:14px;cursor:pointer;white-space:nowrap} +nav{display:flex;gap:6px;padding:4px 12px;overflow-x:auto;background:var(--card);border-bottom:1px solid var(--line)} +nav button{border:1px solid var(--line);background:var(--card);color:var(--ink);border-radius:8px;min-height:44px;padding:7px 14px;font:inherit;font-size:14px;cursor:pointer;white-space:nowrap} nav button.on{background:var(--acc);border-color:var(--acc);color:var(--accInk)} main{padding:14px 16px 40px;max-width:1100px;margin:0 auto} .grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(270px,1fr));gap:12px} @@ -109,7 +109,7 @@ progress{width:100%;height:14px} .alert{background:color-mix(in srgb,var(--bad) 18%,transparent);border:1px solid var(--bad);border-radius:12px;padding:9px 12px;margin:0 0 12px;white-space:pre-line;font-weight:600} .info{background:color-mix(in srgb,var(--acc) 16%,transparent);border:1px solid var(--acc);border-radius:12px;padding:9px 12px;margin:0 0 12px;font-weight:600} a{color:var(--acc)} -.tbtn{margin-left:auto;flex:none;border:1px solid var(--line);background:var(--soft);color:var(--ink);border-radius:999px;padding:3px 11px;font:inherit;font-size:13px;font-weight:650;cursor:pointer} +.tbtn{margin-left:auto;flex:none;border:1px solid var(--line);background:var(--soft);color:var(--ink);border-radius:8px;min-width:44px;min-height:44px;padding:0;font:inherit;font-size:18px;font-weight:650;cursor:pointer} @media (max-width:520px){header .sub{display:none}} /* the page's own question box (ask / askText in the script): the browser's confirm() and prompt() show nothing inside an AgOpenWeb web card (its frame has no allow-modals), so the page never uses them; buttons 44 px high, as the cards ask */ diff --git a/Seeder/Seeder_ESP32/README.md b/Seeder/Seeder_ESP32/README.md index 4f2bf2e..429bc1b 100644 --- a/Seeder/Seeder_ESP32/README.md +++ b/Seeder/Seeder_ESP32/README.md @@ -10,7 +10,7 @@ by a 12 V DPDT relay. Two boards: - a **KinCony KC868-A32** (ESP32, 32 relays, network socket), each relay switching an external DPDT relay. -Version 0.2.6, made from [Sprayer_ESP32](../../Sprayer/Sprayer_ESP32) v0.8 when the seed drill +Version 0.2.7, made from [Sprayer_ESP32](../../Sprayer/Sprayer_ESP32) v0.8 when the seed drill got its own folder. Written from the Relay24_ESP32 design and KinCony's pin list: it has not run on either board yet. @@ -20,6 +20,7 @@ One row per day, in short; the details are in the sections of this file (the lin | Date | What changed | |---|---| +| 10 Nov 2026 | **0.2.7**: the tabs at the top of the page are 44 px high with 8 px corners, like the buttons of the page's question box: easier to hit on the cab's screen ([How it works](#how-it-works)). | | 9 Nov 2026 | **0.2.5**: *Sections on the seed drill* (Settings): the Sowing tab shows all before the program asks, relays past them idle. **0.2.6**: questions in the page's own box: the browser's pop-ups show nothing in an AgOpenWeb web card ([How it works](#how-it-works)). | | 7 Nov 2026 | **0.2.2**: add-on card (`_aowcard._tcp`) under its Wi-Fi name; `_aow-ui` and `/aow/status` gone. **0.2.3**: four tabs as the sprayer's ([How it works](#how-it-works)). **0.2.4**: Module tab: Module card, one Network settings card. Code shared with the sprayer marked ([Notes](#notes)). | | 2 Nov 2026 | **0.2.1**: the Wi-Fi settings on the page as on the XIAO page, with a search for networks ([Setup](#setup)). | @@ -66,7 +67,9 @@ Relay24_ESP32 (192.168.5.123) ──► DPDT relays 1–19 ──► 19 actuator in the [simulator](https://renatorgr.github.io/Boards/seeder/), rebuilt from this code on every change. Every question the page asks (save and restart, install a program, the password) opens in a box of the page itself, not a browser pop-up: inside an AgOpenWeb web - card the browser's pop-ups show nothing, so those buttons did nothing there. + card the browser's pop-ups show nothing, so those buttons did nothing there. The tabs at the + top are 44 px high, with the same 8 px corners as that box's buttons: a size a finger hits + on the cab's screen. ## Choosing the board @@ -121,7 +124,7 @@ The relays close when their PCF8574 pin is **LOW** (`RELAY_ON_HIGH 0`). 4. Relay24_ESP32: plug the DevKitC's USB socket into the computer (the board can be powered or not). KC868-A32: power it with 12 V and plug its USB socket in, as in KinCony's guide. *Tools → Port*: its COM port. Click *Upload*. -5. Serial Monitor at **115200**: it prints `Seeder_ESP32 v0.2.6` and `ready`. +5. Serial Monitor at **115200**: it prints `Seeder_ESP32 v0.2.7` and `ready`. Later program updates: *Sketch → Export compiled binary* in the Arduino IDE, then on the page's *Firmware* tab *Choose .bin* (`Seeder_ESP32.ino.bin` from this folder, not the diff --git a/Seeder/Seeder_ESP32/Seeder_ESP32.ino b/Seeder/Seeder_ESP32/Seeder_ESP32.ino index 53e64a4..8f4e5bf 100644 --- a/Seeder/Seeder_ESP32/Seeder_ESP32.ino +++ b/Seeder/Seeder_ESP32/Seeder_ESP32.ino @@ -9,7 +9,7 @@ Licence: GNU General Public License v3 or later (Firmware/v4.5_AiO_WEB/COPYING), WITHOUT ANY WARRANTY. SPDX-License-Identifier: GPL-3.0-or-later */ -// Seeder_ESP32.ino v0.2.6 (2026-11-09), not yet run on a board. +// Seeder_ESP32.ino v0.2.7 (2026-11-10), not yet run on a board. // // Boards (BOARD below): // - Relay24_ESP32 (folder Relay24_ESP32 of this repository): an ESP32 DevKitC V4 plugged into a board with @@ -62,7 +62,7 @@ #include "dPage.h" #define FW_NAME "Seeder_ESP32" -#define FW_VERSION "0.2.6" +#define FW_VERSION "0.2.7" // ---------------------------------------------------------------- board and pins // BOARD says which board this is (change the line below, or compile with -DBOARD=...): diff --git a/Seeder/Seeder_ESP32/Seeder_ESP32.ino.bin b/Seeder/Seeder_ESP32/Seeder_ESP32.ino.bin index da11aa8..4f5bc00 100644 Binary files a/Seeder/Seeder_ESP32/Seeder_ESP32.ino.bin and b/Seeder/Seeder_ESP32/Seeder_ESP32.ino.bin differ diff --git a/Seeder/Seeder_ESP32/Seeder_ESP32.ino.merged.bin b/Seeder/Seeder_ESP32/Seeder_ESP32.ino.merged.bin index a2b18af..08ffb39 100644 Binary files a/Seeder/Seeder_ESP32/Seeder_ESP32.ino.merged.bin and b/Seeder/Seeder_ESP32/Seeder_ESP32.ino.merged.bin differ diff --git a/Seeder/Seeder_ESP32/dPage.h b/Seeder/Seeder_ESP32/dPage.h index 01b1b79..9bf4fb3 100644 --- a/Seeder/Seeder_ESP32/dPage.h +++ b/Seeder/Seeder_ESP32/dPage.h @@ -30,8 +30,8 @@ header h1{font-size:16px;margin:0;font-weight:650;white-space:nowrap} header .sub{color:var(--mute);font-size:13px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .dot{width:11px;height:11px;border-radius:50%;background:var(--bad);flex:none} .dot.on{background:var(--ok)} -nav{display:flex;gap:6px;padding:8px 12px;overflow-x:auto;background:var(--card);border-bottom:1px solid var(--line)} -nav button{border:1px solid var(--line);background:var(--card);color:var(--ink);border-radius:999px;padding:7px 14px;font:inherit;font-size:14px;cursor:pointer;white-space:nowrap} +nav{display:flex;gap:6px;padding:4px 12px;overflow-x:auto;background:var(--card);border-bottom:1px solid var(--line)} +nav button{border:1px solid var(--line);background:var(--card);color:var(--ink);border-radius:8px;min-height:44px;padding:7px 14px;font:inherit;font-size:14px;cursor:pointer;white-space:nowrap} nav button.on{background:var(--acc);border-color:var(--acc);color:var(--accInk)} nav button.new::after{content:"";display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--ok);margin-left:6px;vertical-align:middle} nav button.on.new::after{background:var(--accInk)} diff --git a/Sprayer/Sprayer_ESP32/README.md b/Sprayer/Sprayer_ESP32/README.md index 2287efb..52a6713 100644 --- a/Sprayer/Sprayer_ESP32/README.md +++ b/Sprayer/Sprayer_ESP32/README.md @@ -4,7 +4,7 @@ Section control for an 8 m sprayer boom with 8 sections of 1 m, driven by **AgOp **AgOpenGPS** over Wi-Fi, on an **ESP32 8-relay board**. It also measures boom pressure and flow, and has its own web page. -Version 0.10.5 (successor of [Sprayer_Nano](../Sprayer_Nano) v0.3): runs on the bench, not yet +Version 0.10.6 (successor of [Sprayer_Nano](../Sprayer_Nano) v0.3): runs on the bench, not yet tested on the sprayer. ## Changelog @@ -13,6 +13,7 @@ One row per day, in short; the details are in the sections of this file (the lin | Date | What changed | |---|---| +| 10 Nov 2026 | **0.10.6**: the tabs at the top of the page are 44 px high with 8 px corners, like the buttons of the page's question box: easier to hit on the cab's screen ([How it works](#how-it-works)). | | 9 Nov 2026 | **0.10.5**: the page's questions (save and restart, install, password) in its own box: the browser's pop-ups show nothing inside an AgOpenWeb web card, so those buttons did nothing there ([How it works](#how-it-works)). | | 7 Nov 2026 | **0.10.2**: add-on card (`_aowcard._tcp`) under its Wi-Fi name; `_aow-ui` and `/aow/status` gone. **0.10.3**: alarms also as PGN 221 ([Messages](#messages)). **0.10.4**: Module tab: Module card, one Network settings card. Code shared with the seed drill marked ([Notes](#notes)). | | 2 Nov 2026 | **0.10**: rate (L/ha), target pressure and alarms worked out on the module and sent to the program (PGN 161); the page gets Spraying, [Settings](#setup), Module and Firmware tabs, with Install from GitHub. **0.10.1**: Wi-Fi settings as on the XIAO page. | @@ -80,7 +81,8 @@ ESP32_Relay_X8 board ──► 8 relays ──► 8 solenoid valves (NC), one pe A `.bin` for another board, another module's program or the `.merged.bin` is refused. Every question the page asks (save and restart, install a program, the password) opens in a box of the page itself, not a browser pop-up: inside an AgOpenWeb web card the browser's - pop-ups show nothing, so those buttons did nothing there. + pop-ups show nothing, so those buttons did nothing there. The tabs at the top are 44 px high, + with the same 8 px corners as that box's buttons: a size a finger hits on the cab's screen. Without the board, the page can be tried in the [simulator](https://renatorgr.github.io/Boards/sprayer/), rebuilt from this code on every change. @@ -148,7 +150,7 @@ divider (to-GND ÷ total) in the page's calibration. 4. *Tools → Port*: the adapter's COM port. 5. Hold **IO0**, press and release **EN**, release IO0. Click *Upload*. When it says "Hard resetting", press **EN** once. -6. Serial Monitor at **115200**: it prints `Sprayer_ESP32 v0.10.5` and `ready`. +6. Serial Monitor at **115200**: it prints `Sprayer_ESP32 v0.10.6` and `ready`. "Failed to connect": TX and RX are probably swapped, or step 5 was skipped. diff --git a/Sprayer/Sprayer_ESP32/Sprayer_ESP32.ino b/Sprayer/Sprayer_ESP32/Sprayer_ESP32.ino index cce88d6..3fba738 100644 --- a/Sprayer/Sprayer_ESP32/Sprayer_ESP32.ino +++ b/Sprayer/Sprayer_ESP32/Sprayer_ESP32.ino @@ -7,7 +7,7 @@ Licence: GNU General Public License v3 or later (file COPYING), WITHOUT ANY WARRANTY. SPDX-License-Identifier: GPL-3.0-or-later */ -// Sprayer_ESP32.ino v0.10.5 (2026-11-09), not yet tested on the sprayer. +// Sprayer_ESP32.ino v0.10.6 (2026-11-10), not yet tested on the sprayer. // // Board: "ESP32_Relay_X8" (303E32DC810): ESP32-WROOM-32E, 8 relays, 5-30 V DC in, LM2596 on board. // Or any ESP32 dev module with relay modules, up to 16 relays (BOARD_DEVKIT below). @@ -55,7 +55,7 @@ #include "sPage.h" #define FW_NAME "Sprayer_ESP32" -#define FW_VERSION "0.10.5" +#define FW_VERSION "0.10.6" // ---------------------------------------------------------------- board and pins // BOARD says which board this is (change the line below, or compile with -DBOARD=...): diff --git a/Sprayer/Sprayer_ESP32/Sprayer_ESP32.ino.bin b/Sprayer/Sprayer_ESP32/Sprayer_ESP32.ino.bin index c57f831..64c41c6 100644 Binary files a/Sprayer/Sprayer_ESP32/Sprayer_ESP32.ino.bin and b/Sprayer/Sprayer_ESP32/Sprayer_ESP32.ino.bin differ diff --git a/Sprayer/Sprayer_ESP32/Sprayer_ESP32.ino.merged.bin b/Sprayer/Sprayer_ESP32/Sprayer_ESP32.ino.merged.bin index 8a54409..c6494df 100644 Binary files a/Sprayer/Sprayer_ESP32/Sprayer_ESP32.ino.merged.bin and b/Sprayer/Sprayer_ESP32/Sprayer_ESP32.ino.merged.bin differ diff --git a/Sprayer/Sprayer_ESP32/sPage.h b/Sprayer/Sprayer_ESP32/sPage.h index 7b9139d..e2ec365 100644 --- a/Sprayer/Sprayer_ESP32/sPage.h +++ b/Sprayer/Sprayer_ESP32/sPage.h @@ -30,8 +30,8 @@ header h1{font-size:16px;margin:0;font-weight:650;white-space:nowrap} header .sub{color:var(--mute);font-size:13px;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .dot{width:11px;height:11px;border-radius:50%;background:var(--bad);flex:none} .dot.on{background:var(--ok)} -nav{display:flex;gap:6px;padding:8px 12px;overflow-x:auto;background:var(--card);border-bottom:1px solid var(--line)} -nav button{border:1px solid var(--line);background:var(--card);color:var(--ink);border-radius:999px;padding:7px 14px;font:inherit;font-size:14px;cursor:pointer;white-space:nowrap} +nav{display:flex;gap:6px;padding:4px 12px;overflow-x:auto;background:var(--card);border-bottom:1px solid var(--line)} +nav button{border:1px solid var(--line);background:var(--card);color:var(--ink);border-radius:8px;min-height:44px;padding:7px 14px;font:inherit;font-size:14px;cursor:pointer;white-space:nowrap} nav button.on{background:var(--acc);border-color:var(--acc);color:var(--accInk)} nav button.new::after{content:"";display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--ok);margin-left:6px;vertical-align:middle} nav button.on.new::after{background:var(--accInk)}