Reference NEXT firmware
Questions and Answers
A quick reference for common questions about HealthyPi 5. For walkthroughs, start at the Welcome page.
Before you buy
What is HealthyPi 5?
An open-source biosignals-acquisition platform built around a Raspberry Pi RP2040 main MCU and an ESP32-C3 wireless co-processor, with dedicated analog front-ends for ECG, respiration, SpO₂, and temperature. It runs as a Raspberry Pi HAT, a standalone wearable, or a desktop biosignals platform.
What does it measure?
Heart rate, respiration rate, SpO₂, skin temperature, and the ECG, PPG, and respiration waveforms. All of it streams live over USB or BLE, records to the microSD card, or shows on the on-board display.
Which sensors are on the board?
- MAX30001 — ECG, bio-impedance (respiration), heart rate
- AFE4400 — PPG and SpO₂
- MAX30205 or AS6221 — body temperature, auto-detected at boot
- MAX17048 — battery fuel gauge (absent if no battery is fitted)
Where can I buy it?
Crowd Supply or Mouser.
Is it open source?
Yes — the hardware design files, the Arduino firmware, the Zephyr firmware, and the ESP32-C3 wireless firmware.
Firmware
Which firmware should I use?
The Arduino (NEXT) firmware, unless you have the display add-on — the Arduino build doesn’t drive the LCD in this release. See Choosing Your Firmware Path.
What happened to the operating modes?
They’re gone. Earlier firmware shipped Basic, BLE, Display, and Logger as separate images. There is now one production firmware; USB streaming, BLE, SD recording, and on-device vitals are all available at once, and in the Arduino build each is switched on with a single line in setup().
How do I program the device?
Either drag-and-drop a pre-built .uf2 — no toolchain needed — or build it yourself. See the Welcome page and the Arduino Quick Start.
How does the boot button work?
Hold the RP2040 boot button while powering the device on. It enumerates as a USB mass-storage device named RPI-RP2, ready to receive a .uf2. Full sequence: Welcome → Flash the firmware.
Why does my sketch fail to compile with a FreeRTOS error?
The HealthyPi5 runtime needs the FreeRTOS-SMP variant of the arduino-pico core. Set Tools → os → “FreeRTOS SMP”. Tutorials 01–08 and 10 don’t need it; 09, 11, and the full firmware do.
Can I run my own signal processing?
Yes. HealthyPi5.enableLoopStream() then HealthyPi5.read(s) hands you raw samples in loop(). Acquisition stays lossless no matter how slow your loop is — a full queue drops the newest sample and counts it, and never back-pressures core1. See examples/Tutorials/09_RawProcessing.
My sketch reads ECG fine but SpO₂ is nonsense.
Check the AFE4400 chip select. It is GPIO 19, and the microSD chip select is GPIO 13 — GPIO 16 is the LCD backlight. Use the HPI_PIN_* macros from board.h rather than literal GPIO numbers and this can’t happen.
Wireless
Is there a mobile app?
Yes — OpenView 2, on Android and iOS. See Wireless: BLE & Wi-Fi for links and the pairing flow.
Why is there no BLE example for the RP2040?
The RP2040 has no radio — it’s a plain RP2040, not a Pico W. BLE and Wi-Fi both run on the on-board ESP32-C3, which has its own firmware. The RP2040 streams to it over a UART. BLE and Wi-Fi are identical from the RP2040’s side; the radio is chosen on the ESP32.
I upgraded to NEXT and Bluetooth stopped working.
You flashed the RP2040 but not the ESP32-C3. Under the earlier firmware the RP2040 ran the entire BLE host stack and the ESP32-C3 was only a Bluetooth HCI controller; NEXT reverses that, so the ESP32-C3 now needs the HealthyBridge firmware — which was never on it. Flash it and BLE returns, along with Wi-Fi, MQTT and the web dashboard. See Programming the ESP32-C3.
Do I have to flash the ESP32-C3 too?
If you’re moving an existing board to NEXT and want wireless, yes — always. Otherwise only if you want BLE, Wi-Fi, MQTT or the dashboard; USB streaming, SD recording, on-device vitals and the teaching sketches don’t involve the ESP32-C3 at all. It has its own USB-C port, separate from the RP2040’s.
I flashed the ESP32-C3 and it lost my Wi-Fi settings.
Expected. The full healthybridge-esp32-merged.bin image is written at 0x0 and overwrites the NVS partition where credentials live. Re-provision through the captive portal, or next time flash with --app-only to update the app at 0x10000 and keep your settings.
Wireless isn’t working — frames sent is 0 and drops are climbing.
The ESP32 isn’t draining the UART. It’s unflashed, held in reset, or CTS is deasserted. Flash healthybridge-esp32 to the co-processor. The RP2040 drops frames rather than blocking, so acquisition keeps running either way.
The board resets when Wi-Fi starts.
The ESP32’s SoftAP draws a current spike on the shared rail. Power from a solid 5 V source.
Recording
Where can I record data?
To the on-board microSD card, to a computer through OpenView 2 desktop, or to a phone through OpenView 2 mobile. See Recording Data.
What format are the SD recordings?
It depends on the firmware. Arduino (NEXT) writes binary /REC*.BIN — a 32-byte header plus 16-byte little-endian records of ecg, bioz, ppg_red, ppg_ir. Zephyr writes CSV. The binary layout and a Python snippet to read it are on the Recording Data page.
How do I get the recording off the card?
Power down, pop the microSD out, and read it with a card reader. On the Zephyr firmware you can also fetch files over BLE from the mobile app via Get Logs.
Will a slow SD card cause dropped samples?
Not from acquisition. The card is an independently queued sink — if it can’t keep up, it drops its own records, counts them, and reports the count in the 1 Hz telemetry line. Core1 keeps sampling regardless.
Setting up
Is it safe to connect to the body?
For body-contact use, we recommend the Complete Kit — the carrier board adds galvanic isolation between the analog front-ends and the rest of the system.
Can I use just the main board?
Yes, for benchtop development that doesn’t involve a person in the circuit. For body-contact use, the carrier board is recommended.
Why does the Serial Plotter show garbage?
You’re probably running the OpenView stream, which is a multi-channel binary packet. The Serial Plotter expects newline-delimited text. Use OpenView 2 for that stream, and the Serial Plotter for the single-signal tutorials (01–07) at 115200 baud.
Which temperature sensor do I have?
Whichever it is, the firmware detects it at boot. Older kits carry a MAX30205 at I²C 0x49; newer QWIIC kits carry an AS6221 at 0x48.
Still stuck?
- Open an issue on GitHub.
- Email [email protected].