Pulse Duet is a DEVELOPMENT prototype for presenting two independent raw PulseSensor input channels together. The product idea is explicitly multi-sensor and multi-person: one sensor per participant, with both streams meeting on a shared display.
The published 0.2.6 checkpoint proves the electronics path only. It sampled
two separate sensors facing open air, transported the remote samples over a
local Wi-Fi/UDP link, and rendered synchronized outward sweeps on an M5Stack
Tab5. It did not validate use on two people, sensor contact, heartbeat
morphology, beat detection, BPM, physiology, channel accuracy, or medical use.
Pulse Duet uses:
- M5Stack Tab5: channel 1 on GPIO49 / ESP32-P4 ADC2 channel 0, plus the shared 1280×720 display.
- M5Stack StickS3: channel 2 on Port.G2 / GPIO2 / ESP32-S3 ADC1 channel 1.
- A Tab5-hosted, unauthenticated lab AP named
PulseDuet-Lab; the StickS3 sends four raw samples per UDP frame to port31337. - A 500 Hz target acquisition rate per input and a common 100 Hz, 2.4-second display timebase.
This repository does not contain the PulseLink Tab5 remote display. That is
a separate one-sensor companion project preserved with frozen PulseLink in
WorldFamousElectronics/PulseLink,
on its tab5-remote-display branch.
tab5-overlay/: the five-file Pulse Duet overlay for a pinned M5StackM5Tab5-UserDemocheckout.stick-s3/: the standalone, verified ESP-IDF Wi-Fi/UDP sensor-node firmware.scripts/prepare-tab5.sh: creates a clean, pinned Tab5 source tree and applies the overlay.docs/VERIFICATION.md: sanitized known-working evidence and limitations.docs/PRESENTATION.md: the deliberately short public-demo plan.
Private development history, unrelated experiments, device identifiers, recovery images, failure/rejected checkpoints, and internal archive material are intentionally not part of this public release.
Use one PulseSensor per input:
| Role | PulseSensor signal | Power | Ground |
|---|---|---|---|
| Tab5 / channel 1 | GPIO49 | 3.3 V | GND |
| StickS3 / channel 2 | Port.G2 / GPIO2 | 3.3 V | GND |
Confirm the exact M5Stack connector pinout before powering the hardware. Do not put 5 V on an ADC input.
Both firmware targets were verified with ESP-IDF 5.4.2.
Prepare and build the Tab5 source:
./scripts/prepare-tab5.sh
source /absolute/path/to/esp-idf-v5.4.2/export.sh
cd .build/M5Tab5-UserDemo/platforms/tab5
idf.py buildBuild the StickS3 source:
source /absolute/path/to/esp-idf-v5.4.2/export.sh
cd stick-s3
idf.py set-target esp32s3
idf.py buildThese commands build firmware but do not flash a device. Always identify the chip and port before any write. This repository deliberately does not provide device-specific port names or a one-command flasher.
Version 0.2.6 passed a two-device open-air bench on 2026-08-07. Both ADC
paths produced changing, independent raw ranges with zero ADC read errors;
the StickS3 rejoined the Tab5 AP after reboot; and the Tab5 received valid
frames and rendered one cyan leftward trace and one violet rightward trace.
Measured delivery was not lossless. See verification details.
This is maker/development firmware, not a diagnostic instrument or medical device. Do not use it for health decisions.
World Famous Electronics additions are MIT licensed. The Tab5 overlay modifies MIT-licensed M5Stack source; see third-party notices.
