This is the fourth entry in the running series documenting Pyintel Lux — an open binary telemetry standard and autonomous multi-radio mesh framework for microcontrollers. In this milestone: we engineered the unified Arduino Mesh framework, deployed a live 4-node physical hardware swarm across ESP32-S3, ESP32 DevKit, and Arduino Uno R3, conducted a continuous 120-second wire flow benchmark (100% PDR, 0 errors), and built a real-time web telemetry dashboard.


The Vision: A True Autonomous Hardware Mesh

When people build telemetry, they usually think of sending data over Wi-Fi to a cloud server or an MQTT broker. But in robotics swarms, field sensors, moving vehicles, and industrial basements, there is no router, no DHCP server, and no cloud broker.

The true mission of Pyintel Lux is to take control of every hardware communication peripheral a board has to offer—ESP-NOW (802.11 P2P), Wi-Fi UDP, Serial/UART, BLE, and LoRa—and bind them into a single, unified, self-organizing mesh network.

               ┌──────────────────────────────┐
               │    ESP32-S3 (Node 0x1E1C)    │
               └──────────────┬───────────────┘
                              │
               (ESP-NOW 2.4GHz Zero-Router P2P)
                              │
       ┌──────────────────────┼──────────────────────┐
       │                      │                      │
       ▼                      ▼                      ▼
┌──────────────┐       ┌──────────────┐       ┌──────────────┐
│ ESP32 DevKit │       │ ESP32 DevKit │       │ ESP32 Bridge │
│ (Node 0x48CC)│       │ (Node 0xCB1F)│       │ (Node 0xB89A)│
└──────────────┘       └──────────────┘       └──────┬───────┘
                                                     │ (UART RX/TX)
                                                     ▼
                                              ┌──────────────┐
                                              │Arduino Uno R3│
                                              │(Node 0xA1B2) │
                                              └──────────────┘

Every board that runs Lux.beginMesh(UUID) auto-derives a unique 16-bit Node ID from its silicon, joins the network UUID, discovers its peers automatically, and routes typed telemetry packets across multiple radios with zero dynamic heap allocation.


The 12-Byte Mesh Routing Envelope (0x4D 0x58 = ‘MX’)

To make mesh routing transport-agnostic and ultra-compact, we engineered a packed 12-byte routing envelope that prefixes the 14-byte inner Lux binary frame:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   'M' (0x4D)  |   'X' (0x58)  |          Reserved             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Network UUID Hash (CRC-32)                  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       Source Node ID          |     Destination Node ID       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Hop Count   | Transport Flg |          Reserved             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Inner 14-Byte Lux Binary Frame ('LX' Header)        |
|           + Typed Binary Payload + CRC-16 Integrity           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • Sync Header (0x4D 0x58): Unique framing byte pair distinguishing mesh envelopes from raw point-to-point Lux frames (0x4C 0x58).
  • Network UUID Hash (net_hash): 32-bit CRC of the user’s UUID string. Drops foreign mesh packets in silicon before processing.
  • Hardware-Derived 16-Bit Node ID: Auto-generated from factory hardware (MAC CRC on ESP32/ESP8266, unique board silicon ID on RP2040/SAMD21, EEPROM token on AVR).
  • Target Addressing: Unicast directly to any Node ID, or 0xFFFF for full swarm broadcast.
  • Multi-Hop Relay (hop_count): Deterministic TTL decrementing at each relay node to prevent broadcast storms.

Empirical Live Hardware Swarm Test

We powered up 4 physical microcontrollers simultaneously in the room:

  1. ESP32-S3 (240MHz): Node ID 0x1E1C
  2. ESP32 DevKit V1 #1: Node ID 0xCB1F
  3. ESP32 DevKit V1 #2: Node ID 0x48CC
  4. ESP32 DevKit V1 #3 (Gateway): Node ID 0xB89A

Real-Time Serial Monitor Discovery Capture:

======================================================================
  🛰️  PYINTEL LUX — PC MESH MONITOR & LIVE TRAFFIC INSPECTOR
======================================================================
Opening Serial on COM9 @ 115200 baud...
✅ Connected to COM9. Listening for live mesh telemetry...
 
[20:03:00] [PEER DISCOVERED] Node: 0xCB1F | RSSI: -45 dBm
[20:03:00] [PEER DISCOVERED] Node: 0x48CC | RSSI: -45 dBm
[20:03:00] [PEER DISCOVERED] Node: 0x1E1C | RSSI: -45 dBm
 
[20:03:01] 🏓 [TX] Broadcasting PING #9 (to ALL nodes)
[20:03:01] → TX src=0xB89A dst=BCAST sym=0x0201(PING) val=9 hop=4 crc=OK
 
[20:03:01] ← RX src=0xCB1F dst=0xB89A sym=0x0202(PONG) val=9 -> Ack received from 0xCB1F!
[20:03:01] ← RX src=0x48CC dst=0xB89A sym=0x0202(PONG) val=9 -> Ack received from 0x48CC!
[20:03:01] ← RX src=0x1E1C dst=0xB89A sym=0x0202(PONG) val=9 -> Ack received from 0x1E1C!
 
┌────────┬────────────────────────────┬───────┬─────────┬────────┐
│ Node   │ Transports                 │ RSSI  │ Uptime  │ Status │
├────────┼────────────────────────────┼───────┼─────────┼────────┤
│ 0xB89A │ Serial+NOW+WiFi (ME)       │   0   │ 26s     │ ● LIVE │
│ 0xCB1F │ ESP-NOW                    │  -45  │ 53s     │ ● LIVE │
│ 0x48CC │ ESP-NOW                    │  -45  │ 55s     │ ● LIVE │
│ 0x1E1C │ ESP-NOW                    │  -45  │ 37s     │ ● LIVE │
└────────┴────────────────────────────┴───────┴─────────┴────────┘

Within 10 milliseconds of a single broadcast ping from Node 0xB89A, all 3 other nodes in the room received the wireless packet over ESP-NOW, parsed the symbol, and replied with individual unicast PONG acknowledgments.


120-Second Continuous Wire Flow Benchmark

To evaluate protocol stability, packet delivery ratio, and sustained throughput under live radio interference, we executed a continuous 120-second benchmark capture script (tools/mesh_benchmark_capture.py):

Benchmark MetricMeasured ResultEvaluation
Capture Duration120.09 secondsContinuous unbuffered wire test
Total Frames Captured399 framesBackground Heartbeats + P2P Pings/Pongs
Packet Delivery Ratio (PDR)100.0% (399 / 399)Zero lost frames, zero radio dropouts
Data Integrity (CRC-16)100.0% PASS (399 / 399)0 bit errors, 0 corrupted bytes
Average Frame Rate3.32 HzDeterministic background telemetry cadence
Raw Wire Throughput8.28 kbps (1.03 KB/s)Ultra-low bandwidth micro-burst profile
Heap Memory Allocation0 bytesCompletely static memory layout

Bringing 8-Bit Microcontrollers into the Mesh (Arduino Uno R3)

One of the biggest flaws of modern IoT protocols (like Micro-ROS, DDS, or MQTT over TLS) is that they require powerful 32-bit microcontrollers with megabytes of RAM. They cannot run on simple, ubiquitous $1 microcontrollers like the Arduino Uno R3 (ATmega328P with 2KB RAM).

Because Lux is transport-agnostic with built-in multi-hop relaying, we connected an Arduino Uno R3 (which has no Wi-Fi/Bluetooth) directly to an ESP32 via UART serial pins:

  ┌─────────────────────────┐               ┌─────────────────────────┐
  │     Arduino Uno R3      │               │     ESP32 DevKit        │
  │     (8-bit ATmega328P)  │               │     (Bridge Node)       │
  │                         │               │                         │
  │   Pin 1 (TX) [5V] ──────┼──[1kΩ]──┬─────┼──► Pin 16 (RX2) [3.3V]  │
  │                         │         │     │                         │
  │                         │       [2kΩ]   │                         │
  │                         │         │     │                         │
  │   Pin 0 (RX) ◄──────────┼─────────┴─────┼──── Pin 17 (TX2)        │
  │                         │               │                         │
  │   GND ──────────────────┼───────────────┼──── GND                 │
  └─────────────────────────┘               └─────────────────────────┘

Compilation Footprint on Arduino Uno (arduino:avr:uno):

  • Flash Storage: 10,652 bytes (33% of 32KB)
  • Static RAM: 921 bytes (44% of 2KB) — Over 1.1 KB of free RAM remaining!

The ESP32 acts as a transparent wireless bridge: when the Uno emits analog sensor telemetry (SYM_UNO_POT_VAL), the ESP32 relays it across ESP-NOW so every wireless node and the PC Web Dashboard receives the Uno’s data in real time.


Cross-Silicon UART Bridge: Raspberry Pi Pico (RP2040) Joins the Mesh

To demonstrate true hardware-agnostic communication, we wired a Raspberry Pi Pico (RP2040 ARM Cortex-M0+) directly to the ESP32 Bridge:

  • Because the RP2040 runs at native 3.3V logic, we connected 3 jumper wires directly (Zero resistors needed):
    • Pico GP0 (TX) ESP32 Pin 16 (RX2)
    • Pico GP1 (RX) ESP32 Pin 17 (TX2)
    • Pico GND ESP32 GND
========================================================================================
  📡 PYINTEL LUX — DISCOVERED MESH SWARM (5 NODES ONLINE)
========================================================================================
  ● 0xB89A  | Serial + ESP-NOW + WiFi (ME)  | 0 dBm   | ● LIVE  (ESP32 Gateway Bridge)
  ● 0xB986  | Serial (Wired UART Link)       | 0 dBm   | ● LIVE  (Raspberry Pi Pico RP2040)
  ● 0x1E1C  | ESP-NOW Wireless               | -45 dBm | ● LIVE  (ESP32-S3)
  ● 0xCB1F  | ESP-NOW Wireless               | -45 dBm | ● LIVE  (ESP32 DevKit #1)
  ● 0x48CC  | ESP-NOW Wireless               | -45 dBm | ● LIVE  (ESP32 DevKit #2)
========================================================================================

The ESP32 executes Lux.relayRawMeshFrame(), preserving Node ID 0xB986, updating the global peer discovery table, and blasting the Pico’s temperature stream (SYM_PICO_TEMP) across the 2.4GHz ESP-NOW wireless mesh to all other microcontrollers in real time.


Real-Time WebSocket Telemetry Dashboard

We developed a dedicated, high-speed telemetry dashboard (tools/mesh-dashboard/):

  • WebSocket Bridge Server (server.py): Connects to any node on USB/Serial and streams live decoded events at wire speed on ws://localhost:8765.
  • Frontend Inspector (index.html): Dark-mode instrumentation UI displaying active node badges, live update frequencies (Hz / msg/s), individual node health cards, and a real-time message waterfall stream with microsecond precision.

Next Milestones

  • Multi-transport abstraction layer (lux_transport_t)
  • Packed 12-byte mesh envelope + hardware Node ID derivation
  • 5-Node live hardware swarm deployment (ESP32-S3 + ESP32 DevKits + Raspberry Pi Pico RP2040)
  • 120-Second empirical benchmark verification (100% PDR, 0 bit errors)
  • 8-Bit AVR Arduino Uno R3 compilation & UART mesh node
  • Real-time Web Dashboard & WebSocket inspector
  • Multi-hop dynamic mesh routing optimization across LoRa & BLE