ESP32-S3 CSI Firmware v0.5.0 — mmWave Sensor Fusion (ADR-063/064)
What's New
60 GHz mmWave Radar Fusion — The firmware now auto-detects mmWave radar modules connected via UART and fuses their data with WiFi CSI for dramatically improved sensing.
Supported mmWave sensors:
| Sensor | Frequency | Capabilities | Cost |
|---|---|---|---|
| Seeed MR60BHA2 | 60 GHz | Heart rate, breathing, presence, distance | ~$15 |
| HLK-LD2410 | 24 GHz | Presence, distance (motion + static) | ~$3 |
Auto-detection: The firmware probes UART1 (GPIO17/18) at boot — first at 115200 baud (MR60BHA2), then 256000 baud (LD2410). If a sensor is found, it registers capabilities and starts a background parsing task. No configuration needed.
48-byte fused vitals packet (magic 0xC5110004): When mmWave is active, vitals are fused using weighted Kalman averaging (mmWave 80% + CSI 20%). Falls back to the standard 32-byte CSI-only packet when no mmWave is detected — fully backward compatible.
Server-side fusion bridge (scripts/mmwave_fusion_bridge.py): For setups where the mmWave runs on a separate ESP32 (e.g., ESP32-C6 with ESPHome), this script reads both serial ports and fuses data in real-time.
Hardware Verified
Dual-sensor live capture (30 seconds, 2026-03-15):
- COM7 (ESP32-S3): WiFi CSI on channel 5, RSSI -41 dBm
- COM4 (ESP32-C6 + MR60BHA2): HR 75 bpm, BR 25/min, person at 52 cm
- Both sensors feeding data concurrently
Also Includes (from v0.4.3.1)
- Fall detection fix: threshold 15.0 rad/s², 3-frame debounce, 5s cooldown (#263)
- Task watchdog fix: vTaskDelay after every frame (#266)
- 4MB flash support (#265)
- All 11 QEMU CI jobs green
Download Guide
| File | Flash | Size |
|---|---|---|
esp32-csi-node.bin
| 8MB | 990 KB |
bootloader.bin
| Both | 18 KB |
partition-table.bin
| 8MB | 3 KB |
ota_data_initial.bin
| Both | 8 KB |
esp32-csi-node-4mb.bin
| 4MB | 773 KB |
partition-table-4mb.bin
| 4MB | 3 KB |
Flash — 8MB:
python -m esptool --chip esp32s3 --port COM7 --baud 460800 \
write_flash --flash_mode dio --flash_size 8MB --flash_freq 80m \
0x0 bootloader.bin 0x8000 partition-table.bin \
0xf000 ota_data_initial.bin 0x20000 esp32-csi-node.binFlash — 4MB:
python -m esptool --chip esp32s3 --port COM7 --baud 460800 \
write_flash --flash_mode dio --flash_size 4MB --flash_freq 80m \
0x0 bootloader.bin 0x8000 partition-table-4mb.bin \
0xF000 ota_data_initial.bin 0x20000 esp32-csi-node-4mb.binProvision:
python firmware/esp32-csi-node/provision.py --port COM7 \
--ssid "YourWiFi" --password "YourPassword" --target-ip 192.168.1.20Full Changelog
See CHANGELOG.md
Closes #269