Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Firmware/v4.5_AiO_WEB/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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). |
Expand Down Expand Up @@ -75,7 +75,7 @@ Open `http://<module IP>/`, 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).

Expand Down
3 changes: 3 additions & 0 deletions Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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). |
Expand Down Expand Up @@ -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.
Expand Down
4 changes: 3 additions & 1 deletion Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32/v4.5_XIAO_ESP32.ino
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -577,6 +578,7 @@ static void updateUpload()
{
if (updErr.length() == 0)
{
updBytes = up.totalSize;
if (Update.end(true)) updOk = true;
else updErr = Update.errorString();
}
Expand All @@ -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;
}
Expand Down
13 changes: 6 additions & 7 deletions Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32/xPage.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,19 +29,18 @@ const char XIAO_PAGE[] PROGMEM = R"XIAOPAGE(<!doctype html>
@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}
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -156,10 +155,10 @@ a{color:var(--acc)}
<label class="field"><span>That network's password (blank: keeps the current one; for a new network, blank = open network)</span><input type="password" name="staPass" maxlength="63"></label>
<label class="field"><span>XIAO name on that network</span><input type="text" name="host" maxlength="24"></label>
</div>
<div class="saverow">
<div class="card"><h2>Confirm and save</h2>
<label class="field"><span>Current password of the XIAO network (to confirm)</span><input type="password" name="pw" id="pwW" maxlength="63"></label>
<div class="row"><button class="act" type="submit">Save and restart the XIAO</button><span id="setMsg" class="note"></span></div>
<p class="note">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: <span class="mono">wifi-reset</span>.</p>
<p class="note">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: <span class="mono">wifi-reset</span>.</p>
</div>
</form>
<div class="grid3" style="margin-top:12px">
Expand Down
2 changes: 1 addition & 1 deletion Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
Expand Down
Binary file modified Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/v4.5_XIAO_ESP32C3.bin
Binary file not shown.
Binary file not shown.
Binary file modified Firmware/v4.5_AiO_WEB/v4.5_XIAO_ESP32_bin/v4.5_XIAO_ESP32S3.bin
Binary file not shown.
Binary file not shown.
8 changes: 4 additions & 4 deletions Firmware/v4.5_AiO_WEB/zWebPage.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,14 @@ const char WEB_PAGE[] PROGMEM = R"WEBPAGE(<!doctype html>
@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}
Expand Down Expand Up @@ -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 */
Expand Down
9 changes: 6 additions & 3 deletions Seeder/Seeder_ESP32/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand All @@ -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)). |
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions Seeder/Seeder_ESP32/Seeder_ESP32.ino
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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=...):
Expand Down
Binary file modified Seeder/Seeder_ESP32/Seeder_ESP32.ino.bin
Binary file not shown.
Binary file modified Seeder/Seeder_ESP32/Seeder_ESP32.ino.merged.bin
Binary file not shown.
4 changes: 2 additions & 2 deletions Seeder/Seeder_ESP32/dPage.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)}
Expand Down
Loading
Loading