Releases: GrayHatGuy/MeshCore
v0.3 — BMA423 wrist-lift screen-wake (T-Watch S3)
Third tagged release. Adds on-device wrist-lift screen-wake to the LilyGo T-Watch S3 family on top of v0.2. Tagged on the feature branch (consistent with v0.1/v0.2) as the "as-submitted-upstream" snapshot for the meshcore-dev PR. Same 20 variants as v0.2, rebuilt at this commit.
Changelog since v0.2
- BMA423 accelerometer + wrist-lift screen-wake (T-Watch S3) — new header-only
MotionBMA423driver (lewisxhe/SensorLib): the on-board BMA423 (INT GPIO14) wakes the display when you lift/move the watch (raw accel-magnitude motion), with the Bosch wrist-tilt + double-tap feature engines also enabled. Adds a no-opMainBoard::loop()board hook +board.loop()in the companion/repeater main loops (no-op on all other boards). Commitab0203f4.
Full diff: v0.2...v0.3 — 1 commit, 8 files, +156.
Hardware-verified
- Wrist-lift screen-wake on the T-Watch S3 Plus (SX1280): display blanks after ~15 s idle (backlight off via GPIO45) and lights on a lift. Sensitivity knob =
MOTION_WAKE_FRAC(default 0.18). - Carried from v0.2 (still verified): 2.4 GHz messaging (3-node mesh, public + cross-chip SX1280↔LR1121; private channels @ 2.4 GHz; companion client-repeat @ 2450); sub-GHz LR1121 US 915; T-Watch ST7789 display + FT6336 touch + dynamic BLE PIN.
Notes / known limitations
- App caps BW at 500 kHz — 2.4 GHz uses the compiled 812.5 default; set BW via the firmware default, not the app.
- Online flasher needs 2.4 GHz bandwidths — the web flasher's repeater setup can't configure a 2.4 GHz repeater (it caps at 500 kHz). Its bandwidth selector needs the SX1280 / LR1121 (2.4 GHz high-band) LoRa bandwidths added, and the cap raised: 203.125 / 406.25 / 812.5 / 1625.0 kHz. Firmware already accepts them (
LORA_MAX_BW=1700); the flasher UI is the missing piece. - T-Watch power — keeps
TWATCH_INHIBIT_SLEEP=1(CPU does not light-sleep). The dominant draw (TFT backlight) is cut on idle; proper CPU light-sleep is a follow-up (BLE/light-sleep coexistence is non-trivial). - Post-flash — after flashing a T-Watch it may sit on "Loading…" ~30–60 s → press RST (once per flash; ESP32-S3 native-USB behavior).
Firmware images (20 — attached)
Merged full-flash images, filename = env name. ESP32-S3, flash at offset 0x0 (esptool --chip esp32s3 write_flash 0x0 <env>.bin, or pio run -e <env> -t upload).
T-Watch S3 family (8):
LilyGo_TWatch_S3_sx1262_companion_radio_ble·_usb·_repeaterLilyGo_TWatch_S3_sx1280_companion_radio_ble·_usb·_repeaterLilyGo_TWatch_S3_Plus_sx1262_companion_radio_ble·LilyGo_TWatch_S3_Plus_sx1280_companion_radio_ble
T3S3 LR1121 (8):
- 2.4 GHz:
LilyGo_T3S3_lr1121_companion_radio_ble·_usb·_repeater·_room_server - US sub-GHz:
LilyGo_T3S3_lr1121_subghz_companion_radio_ble·_usb·_repeater·_room_server
T3S3 SX1280 (4):
LilyGo_T3S3_sx1280_companion_radio_ble·_usb·_repeater·_room_server
v0.2 — T3S3 SX1280 (2.4 GHz) variant + companion client-repeat
Second tagged release. Adds the T3S3 SX1280 (2.4 GHz) variant and a 2.4 GHz companion client-repeat fix on top of v0.1. 2.4 GHz messaging is hardware-verified (public, cross-chip SX1280↔LR1121); the new items below are built but pending on-air verification.
Changelog since v0.1
- Companion client-repeat on 2.4 GHz —
isValidClientRepeatFreq()now includes the 2.4 GHz ISM band (2400–2500 MHz), so a companion can act as a repeater at 2450 (was rejected asILLEGAL_ARG). Commit33f517e2. - New variant: LilyGo T3S3 + SX1280 (2.4 GHz) — same board (
t3_s3_v1_x) + SSD1306 OLED as the LR1121 T3S3; SX1280 with external RF switch (RXEN=21 / TXEN=10); OLED reset = −1 (GPIO21 is RXEN). Commit6094cd46. - (A BW lower-bound guard was trialed and reverted — SX1280/LR1121 legitimately support 203/406 kHz; the app's 500 kHz BW cap stays a documented note, not a firmware limit.)
Full diff: v0.1...v0.2
✅ Open items to verify this release
- 2.4 GHz client-repeat — flash a 2.4 GHz companion, enable repeat mode at 2450, confirm it forwards when no dedicated repeater is in range.
- T3S3 SX1280 variant on hardware — radio init (
RADIOLIB_ERR_NONE), 2.4 GHz TX/RX, OLED, and interop with the existing SX1280/LR1121 2.4 GHz mesh. - Private channels @ 2.4 GHz — add the same channel name + secret on all nodes; confirm private messages decode (public already works).
- T-Watch power-save — builds currently never light-sleep (
TWATCH_INHIBIT_SLEEP=1, radio-safe but continuous draw); confirm behavior / decide power strategy before upstreaming.
Already verified (v0.1 + testing): sub-GHz messaging (LR1121 US 915); 2.4 GHz public messaging, cross-chip SX1280↔LR1121 (3-node mesh); T-Watch S3 Plus display + FT6336 touch + dynamic PIN + pairing.
Variants (3)
lilygo_twatch_s3— T-Watch S3 family (SX1262 sub-GHz + SX1280 2.4 GHz;-D T_WATCH_S3_PLUS= GPS). Companion variants drive the ST7789 240×240 TFT + FT6336 touch + proportional font.lilygo_t3s3_lr1121— T3S3 v1.3 LR1121, multi-band (2.4 GHz + US sub-GHz 910.525). SSD1306 OLED on all roles.lilygo_t3s3_sx1280— new — T3S3 with SX1280 (2.4 GHz). SSD1306 OLED on all roles.
Default frequency plans
| Plan | Freq | BW | SF | CR | Preamble | Sync | TX |
|---|---|---|---|---|---|---|---|
| 2.4 GHz (SX1280 / LR1121) | 2450.0 MHz | 812.5 kHz | 10 | 4/5 | 12 | 0x12 | 13 dBm |
| US sub-GHz (LR1121) | 910.525 MHz | 62.5 kHz | 7 | 4/5 | 16 | 0x12 | 20 dBm |
| SX1262 T-Watch | repo default sub-GHz region plan |
Firmware images (20 — attached)
Merged full-flash images, filename = env name. ESP32-S3, flash at offset 0x0 (esptool --chip esp32s3 write_flash 0x0 <env>.bin, or pio run -e <env> -t upload).
T-Watch S3 family (8):
LilyGo_TWatch_S3_sx1262_companion_radio_ble·_usb·_repeaterLilyGo_TWatch_S3_sx1280_companion_radio_ble·_usb·_repeaterLilyGo_TWatch_S3_Plus_sx1262_companion_radio_ble·LilyGo_TWatch_S3_Plus_sx1280_companion_radio_ble
T3S3 LR1121 (8):
- 2.4 GHz:
LilyGo_T3S3_lr1121_companion_radio_ble·_usb·_repeater·_room_server - US sub-GHz:
LilyGo_T3S3_lr1121_subghz_companion_radio_ble·_usb·_repeater·_room_server
T3S3 SX1280 (4, new):
LilyGo_T3S3_sx1280_companion_radio_ble·_usb·_repeater·_room_server
v0.1 — T-Watch S3 family + T3S3 LR1121: displays, touch, dynamic PIN
First tagged release of LilyGo T-Watch S3 family + T3S3 LR1121 support for MeshCore, building on the V0.0 pre-release. On-device displays, capacitive touch, and the dynamic pairing PIN are in and hardware-validated, and 2.4 GHz messaging is now verified on hardware (see below).
⚠️ First boot after flashing a T-Watch
On the first power-up right after flashing, the T-Watch can sit on the "Loading…" screen for ~30–60 s. Wait that long, then press the RST button and it boots normally. This only happens once after a flash — it does not recur on subsequent boots, battery power-on, or OTA. (Standard ESP32-S3 native-USB post-flash behavior; a cold-boot radio retry is also built in.)
Verification status
- ✅ Sub-GHz — messaging works with the MeshCore app. LR1121 US sub-GHz (910.525 / 62.5 kHz / SF7) confirmed end-to-end on a T3S3 v1.3 (live TX/RX on public channels, BLE pairing, OLED). SX1262 T-Watch variants use the same standard sub-GHz path.
- ✅ 2.4 GHz — messaging verified (public, cross-chip). 3-node mesh — T-Watch SX1280 companion + T3S3 LR1121 repeater + T3S3 LR1121 companion at 2450 / 812.5 kHz / SF10 / CR4-5: public-channel messaging, advertising, repeater detection, nearby-node discovery, and RX-log ADVERTs all confirmed — proving SX1280 ↔ LR1121 interoperate at 2.4 GHz. (Private channels not yet confirmed — needs the matching channel key on all nodes, an app/config step.)
- ✅ T-Watch S3 UI — confirmed on a T-Watch S3 Plus: ST7789 display, FT6336 touch, proportional font, dynamic PIN pairing.
Known issues / app notes
- Bandwidth in the app caps at 500 kHz and shows blank for the 812.5 kHz 2.4 GHz value — this is an app UI limit, not the firmware (the verified mesh runs 812.5). On 2.4 GHz builds, keep BW on the compiled default or set it via
meshcore-cli— do not change BW in the app (saving radio settings there can push BW ≤ 500 and break the 2.4 GHz link). - Client-repeat (companion "repeat" mode) is not available at 2.4 GHz in v0.1 — the firmware's repeat-frequency whitelist didn't include the 2.4 GHz band. Fixed in the next release.
- 2.4 GHz is a custom frequency plan, not a named region — the app's region picker won't list/discover it; nodes run the compiled 2450 plan directly.
What's new since V0.0
On-device UI
- T3S3 LR1121 — 0.96" SSD1306 OLED on every role (companion / repeater / room server, both bands). HW-confirmed.
- T-Watch S3 — 1.54" 240×240 ST7789 TFT on all companion variants (SX1262, SX1280, both Plus), with FT6336 capacitive touch: tap = wake / next page, touch-and-hold = long-press (e.g. advertise / toggle BT). BOOT button also paginates. Uses a proportional FreeSans 9 pt font so the dense 2-column screens (freq/SF, GPS pos/alt) and the pairing PIN read cleanly on the 240×240 panel. HW-confirmed on a T-Watch S3 Plus.
- Dynamic BLE pairing PIN on display builds (the standard MeshCore scheme): a random per-boot 6-digit PIN shown on screen; static
123456only on headless / USB builds. HW-confirmed.
Power / sleep (T-Watch)
- AXP2101 rail map corrected to the LilyGo factory table — ALDO2 = backlight, ALDO3 = display+touch, ALDO4 = radio — with ALDO4 held on at all times.
TWATCH_INHIBIT_SLEEP=1(default on the T-Watch): never light-sleeps, so the radio rail stays continuously powered and the SX1280 is never sleep/wake cycled. Toggleable build flag.- Cold-boot radio retry in
radio_init()so the first boot after flashing self-heals (see first-boot note above).
Environments
LilyGo T-Watch S3 family (lilygo_twatch_s3; -D T_WATCH_S3_PLUS adds GPS) — companion variants drive the ST7789 + touch:
- SX1262 (sub-GHz):
_companion_radio_ble·_usb·_repeater - SX1280 (2.4 GHz):
_companion_radio_ble·_usb·_repeater - Plus (+GPS):
Plus_sx1262_companion_radio_ble·Plus_sx1280_companion_radio_ble
LilyGo T3S3 v1.3 LR1121 (lilygo_t3s3_lr1121, multi-band) — all drive the SSD1306 OLED:
- 2.4 GHz:
_companion_radio_ble·_usb·_repeater·_room_server - US sub-GHz:
_subghz_companion_radio_ble·_usb·_repeater·_room_server
Default frequency plans
| Plan | Freq | BW | SF | CR | Preamble | Sync | TX |
|---|---|---|---|---|---|---|---|
| 2.4 GHz (SX1280 / LR1121) | 2450.0 MHz | 812.5 kHz | 10 | 4/5 | 12 | 0x12 | 13 dBm |
| US sub-GHz (LR1121) | 910.525 MHz | 62.5 kHz | 7 | 4/5 | 16 | 0x12 | 20 dBm |
| SX1262 T-Watch | repo default sub-GHz region plan |
Firmware images (attached)
Merged full-flash images (bootloader + partitions + app); filename = env name. Both boards are ESP32-S3 — flash at offset 0x0:
esptool --chip esp32s3 write_flash 0x0 <env-name>.bin
(Or pio run -e <env-name> -t upload.)
V0.0 changelog (prior pre-release)
- Added the LilyGo T-Watch S3 family (SX1262 + SX1280,
-D T_WATCH_S3_PLUSGPS) and T3S3 v1.3 LR1121 variants. - Added 2.4 GHz LoRa support (previously SX128x was excluded): new
CustomSX1280/CustomLR1121RadioLib wrappers, compile-timeLORA_MAX_BW, default 2450 plan. - Added the US sub-GHz LR1121 plan + envs (910.525 / 62.5 / SF7).
- Headless builds only (BLE/USB companion + repeater); no on-device displays yet.
V0.0 — T-Watch S3 family + 2.4 GHz LoRa (SX1280/LR1121)
Pre-release for hardware testing — NOT yet validated on a physical device.
Every environment below compiles clean under PlatformIO (RadioLib 7.7.1), but none has been flashed or RF-tested yet. Tag V0.0 = first cut, hardware bring-up pending.
Variants created
lilygo_twatch_s3 — LilyGo T-Watch S3 family (ESP32-S3 + AXP2101 PMU; combined SX1262 sub-GHz and SX1280 2.4 GHz; -D T_WATCH_S3_PLUS enables on-board GPS):
LilyGo_TWatch_S3_sx1262_companion_radio_ble·_usb·_repeater(SX1262, sub-GHz)LilyGo_TWatch_S3_sx1280_companion_radio_ble·_usb·_repeater(SX1280, 2.4 GHz)LilyGo_TWatch_S3_Plus_sx1262_companion_radio_ble(SX1262 + GPS)LilyGo_TWatch_S3_Plus_sx1280_companion_radio_ble(SX1280 + GPS)
lilygo_t3s3_lr1121 — LilyGo T3S3 v1.3 with LR1121 (multi-band; band auto-selected from LORA_FREQ):
- 2.4 GHz:
LilyGo_T3S3_lr1121_companion_radio_ble·_usb·_repeater - US sub-GHz:
LilyGo_T3S3_lr1121_subghz_companion_radio_ble·_usb·_repeater
Default 2.4 GHz LoRa frequency plan (SX1280 & LR1121 2.4 GHz variants)
Compiled-in default for every sx1280 and 2.4 GHz lr1121 environment (changeable later via the companion app / CLI). Identical for both radios:
| Parameter | Value |
|---|---|
| Frequency | 2450.0 MHz |
| Bandwidth (BW) | 812.5 kHz |
| Spreading factor (SF) | 10 |
| Coding rate (CR) | 4/5 |
| Preamble length | 12 symbols |
| Sync word | 0x12 (private) |
| TX power | 13 dBm (2.4 GHz PA max) |
Default US sub-GHz LoRa plan (T3S3 LR1121 _subghz envs)
Matches the MeshCore "USA" preset, so it interoperates with an existing sub-GHz fleet and works with the standard MeshCore app / region tooling (the 2.4 GHz CLI workaround is not needed for sub-GHz):
| Parameter | Value |
|---|---|
| Frequency | 910.525 MHz |
| Bandwidth (BW) | 62.5 kHz |
| Spreading factor (SF) | 7 |
| Coding rate (CR) | 4/5 |
| Preamble length | 16 (MeshCore default) |
| Sync word | 0x12 (private) |
| TX power | 20 dBm |
The SX1262 sub-GHz T-Watch envs keep the repo's default sub-GHz region plan.
Firmware images (attached)
Each .bin asset is a merged full-flash image (bootloader + partitions + app). Filename = environment name. Both boards are ESP32-S3 — flash at offset 0x0:
esptool.py --chip esp32s3 write_flash 0x0 <env-name>.bin
(Or build from source: pio run -e <env-name> -t upload.)
Other changes
- New RadioLib wrappers
CustomSX1280andCustomLR1121; SX128x is re-enabled per-env (it was excluded repo-wide). - Compile-time
LORA_MAX_BW(default 500) so the wide 2.4 GHz bandwidth (812.5 kHz) passes freq/region validation — existing sub-GHz boards are unaffected (regression-checked against Heltec_v3).
Known caveats / test focus
- LR1121 RF-switch table is best-effort (sourced from the Meshtastic
tlora_t3s3_v1reference) and serves both bands. If the LR1121 inits but won't TX/RX, adjust the table invariants/lilygo_t3s3_lr1121/target.cpp— sub-GHz usesMODE_RX/MODE_TX_HP, 2.4 GHz usesMODE_TX_HF. - GPS (Plus): if no fix, swap
PIN_GPS_TX/PIN_GPS_RX. - Interop: treat SX1280 and LR1121 as separate 2.4 GHz networks unless verified to interoperate (same logical "private" sync word, different underlying PHY registers).
First-boot sanity (USB serial): radio init should return RADIOLIB_ERR_NONE.
Commits: cf14ea6 (variants + 2.4 GHz) · cd5d30a (T3S3 LR1121 US sub-GHz)