Getting Started with the ProtoCentral tinyECG (MAX30001 · QT Py / XIAO Form Factor)
Introduction
The ProtoCentral tinyECG is a credit-card-corner-sized ECG and respiration module built around the Analog Devices MAX30001. It exposes single-lead ECG (Lead I) plus a bio-impedance respiration channel through a 3.5 mm stereo cable, and is electrically and software-identical to the ProtoCentral MAX30001 Breakout — same chip, same library, same example sketches.
What makes tinyECG different is the mechanical form factor: it’s designed as a base board for an Adafruit QT Py or Seeed Studio XIAO host MCU. The QT Py / XIAO sits directly on the tinyECG’s headers — no jumper wires between the two boards — so a complete USB-powered, battery-ready ECG + respiration node fits in less than 25 mm × 35 mm. Castellated edge pads on the sides also let you solder the module directly into a larger custom PCB for wearable designs.
Note: This board is intended for research and development purposes only. It is not FDA, CE, or FCC approved for consumer or medical use.
Key Features
- MAX30001 ECG + Bio-Z front-end — single-lead ECG with on-chip R-R detection, plus impedance-pneumography respiration on the same electrodes
- QT Py / XIAO compatible footprint — the host MCU mounts directly on the headers, no jumpers
- Castellated edge pads — solder the module straight into your own PCB for wearable / custom builds
- Breadboard-friendly 2.54 mm headers — also work with bench-top jumper wiring
- 3.5 mm stereo (TRS) ECG input — via the supplied stereo connector adapter (3-electrode cable)
- High input impedance — works well with dry / passive electrodes
- On-board 3.3 V LDO — accepts 5 V (USB / VBUS) or 3.3 V supply
- Ultra-low noise — 15.9 ENOB ECG, 17 ENOB BioZ
- Ultra-low power — suitable for battery-powered wearables
What’s in the Box
- 1× ProtoCentral tinyECG module (MAX30001)
- 1× 3.5 mm stereo connector adapter (3-pin header → TRS jack)
- 1× 3-electrode ECG snap cable (3.5 mm stereo plug → LA / RA / RL leads)
- A small set of disposable electrodes for first-light testing
You will also need a host MCU with the QT Py / XIAO footprint — Adafruit QT Py (ESP32-C3 / SAMD21 / RP2040), Seeed Studio XIAO (SAMD21 / ESP32-C3 / RP2040 / nRF52840), or any other module that matches the 14-pin layout — plus a USB-C cable.
Specifications
| Parameter | Value |
|---|---|
| ECG / BioZ AFE IC | Analog Devices MAX30001 |
| ECG Channels | 1 (single-lead, 3-electrode: LA, RA, RL) |
| BioZ Channels | 1 (respiration via impedance pneumography) |
| ENOB | 15.9 bits (ECG) · 17 bits (BioZ) |
| BioZ Drive Current | 55 nA – 96 µA (programmable) |
| Built-in DSP | R-R interval detection (Pan-Tompkins) |
| Interface | SPI (4-wire, mode 0) |
| Form Factor | QT Py / XIAO base board (~22 mm × 32 mm) with castellated edges |
| Electrode Connector | 3.5 mm stereo (TRS) via supplied adapter |
| Logic Levels | 3.3 V (5 V tolerant inputs) |
| Supply Voltage | 5 V (USB / VBUS) or 3.3 V — on-board LDO |
Hardware Setup
Wiring & Stack-up
- Mount the host MCU on the tinyECG. Solder the QT Py / XIAO into the tinyECG’s headers (or use stacking female headers if you want it removable). The pin labels on the tinyECG silkscreen line up with the QT Py / XIAO pinout — there are no jumper wires between the two boards.
- Plug in the 3.5 mm stereo adapter. Slide the supplied 3-pin header adapter onto the ECG header on the tinyECG. The adapter terminates in a 3.5 mm stereo (TRS) jack.
- Plug the ECG cable into the adapter. The supplied 3-electrode snap cable has a 3.5 mm stereo plug on one end and three colour-coded snap leads on the other.
- Power the system over USB. Connect a USB-C cable from your computer to the QT Py / XIAO host. The 5 V from VBUS feeds the on-board 3.3 V LDO on the tinyECG.
tinyECG to Host (default QT Py ESP32-C3 mapping)
| tinyECG Pin (MAX30001) | QT Py ESP32-C3 Pin | Function |
|---|---|---|
| MISO | MISO | SPI data out (Slave → Master) |
| MOSI | MOSI | SPI data in (Master → Slave) |
| SCLK | SCK | SPI clock |
| CS | D6 | Chip select |
| INTB | A0 | Interrupt 1 / Data Ready |
| INT2B | – (NC) | Interrupt 2 (optional) |
| FCLK | – (NC) | External 32 kHz clock (unused — on-board oscillator) |
| VCC | 5 V (USB / VBUS) | Power |
| GND | GND | Ground |
Tip: The default pin names match the Arduino-IDE pin labels for the QT Py ESP32-C3. If you’re using a different host (XIAO SAMD21, XIAO nRF52840, etc.), the SPI pins move automatically — just confirm CS and INTB pin numbers in the example sketch match your board.
Electrode Placement
Because tinyECG uses the MAX30001 chip, the electrode placement is identical to the MAX30001 Breakout — 3-electrode single-lead ECG (LA, RA, RL) which simultaneously carries the Bio-Z respiration signal.
| Lead | Cable Cap Colour | Placement on Body | Function |
|---|---|---|---|
| LA | Red | Below the left collarbone, near the left shoulder | Lead I positive · BioZ inject + sense |
| RA | Black | Below the right collarbone, near the right shoulder | Lead I negative · BioZ inject + sense |
| RL | Green | Lower right abdomen | Reference / common-mode return |
Note: Cable cap colours vary by supplier. If your cable doesn’t match the colours above, identify each lead by tracing it to the 3.5 mm plug pin (Tip / Ring / Sleeve) and consult the breakout’s silkscreen labels (LA / RA / RL).
For best signal quality, wipe the electrode sites with an alcohol swab before attaching the snap electrodes. Avoid placement directly over hair or large muscle groups (the pectoralis is fine; the deltoid will pick up motion artefact).
Tip: The RL reference electrode is what gives this 3-electrode setup its noise immunity. Skipping it will work in a pinch, but both the ECG trace and the Bio-Z respiration signal will pick up significantly more 50/60 Hz mains hum and motion artefact.
Installing the Arduino Library
Set up your QT Py / XIAO board first
- Install the appropriate Arduino board package for your host MCU:
- QT Py ESP32-C3 — install the Espressif ESP32 board package (see Espressif’s installation guide)
- QT Py SAMD21 / RP2040 — install Adafruit’s SAMD or RP2040 board packages
- Seeed XIAO — install Seeed Studio’s board package
- Select the correct board from Tools → Board and the correct serial port.
Install the ProtoCentral library
The tinyECG uses the same MAX30001 library as the standalone breakout.
Option 1: Arduino Library Manager (Recommended)
- Open the Arduino IDE
- Go to Sketch → Include Library → Manage Libraries…
- Search for “Protocentral MAX30001”
- Find “ProtoCentral MAX30001 ECG and BioZ AFE Sensor Library” and click Install
Option 2: Manual Install from GitHub
- Go to github.com/Protocentral/protocentral_tinyecg_max30001
- Click Code → Download ZIP
- In the Arduino IDE, go to Sketch → Include Library → Add .ZIP Library…
- Select the downloaded ZIP file
Your First ECG + Respiration Reading
Open the example sketch: File → Examples → ProtoCentral MAX30001 → ecg_bioz_streaming
#include
#include "protocentral_max30001.h"
// QT Py ESP32-C3 default pins
#define MAX30001_CS_PIN 6
#define MAX30001_INT1_PIN A0
MAX30001 max30001(MAX30001_CS_PIN);
void setup() {
Serial.begin(115200);
SPI.begin();
if (!max30001.begin()) {
Serial.println("MAX30001 not found — check that the QT Py is fully seated on the tinyECG");
while (1);
}
max30001.BeginECGBIOZ();
}
void loop() {
if (digitalRead(MAX30001_INT1_PIN) == LOW) {
max30001.getECGSamples();
max30001.getBioZSamples();
Serial.print(max30001.ecgdata);
Serial.print(',');
Serial.println(max30001.biozdata);
}
}
What This Code Does
- Includes the libraries —
protocentral_max30001.handSPI.h - Creates the MAX30001 object — bound to the host’s CS pin (D6 on QT Py ESP32-C3)
- Initialises the chip —
begin()performs the SPI handshake; if it fails, you’ll see a diagnostic message in the Serial Monitor - Configures dual-channel mode —
BeginECGBIOZ()enables both ECG and BioZ - Polls INT1 — reads new samples whenever DATA-READY goes low
- Prints CSV columns — for the Arduino Serial Plotter at 115200 baud to display two traces
Using the Arduino Serial Plotter
- Upload the sketch
- Attach the three electrodes to your torso: LA below the left collarbone, RA below the right collarbone, RL on the lower right abdomen
- Snap the cable leads to the electrodes (matching cap colour to position)
- Open Tools → Serial Plotter at 115200 baud
- You should see two live traces — the ECG waveform on top with its characteristic PQRST complex, and the slower-moving Bio-Z respiration signal below
Measuring Heart Rate and R-R Interval
The MAX30001 inside the tinyECG computes heart rate and R-R interval on-chip via the Pan-Tompkins algorithm. Same code as the standalone MAX30001 breakout:
void setup() {
Serial.begin(115200);
SPI.begin();
max30001.begin();
max30001.BeginRtoRMode();
}
void loop() {
if (max30001.getHeartRate()) {
Serial.print("Heart Rate (BPM): ");
Serial.print(max30001.heartRate);
Serial.print(" R-R interval (ms): ");
Serial.println(max30001.RRinterval);
}
}
Visualizing with OpenView
- Install OpenView 2 — see the setup guide for downloads + first run on Windows / Linux / iOS / Android
- Upload the OpenView example sketch from the library examples
- Open OpenView 2, select “MAX30001 breakout” from the Board dropdown (the same option works for tinyECG since the chip is identical)
- Select the QT Py / XIAO’s serial port and click Start
- You’ll see real-time ECG with computed heart rate, alongside the Bio-Z respiration trace and computed respiration rate
Troubleshooting
MAX30001 not found at startup
- Verify the QT Py / XIAO is fully seated on the tinyECG headers — a partial seat is the most common cause of SPI failures here
- If you’re using long stacking headers, try the alternate solid-pin pads to reduce inter-board capacitance
- Confirm you’ve selected the correct host board in Tools → Board so the SPI pins map correctly
No ECG signal / flat line
- Check that all three electrodes (LA, RA, RL) are firmly attached to skin
- Make sure the 3.5 mm stereo plug is fully inserted into the adapter — a half-seated plug shorts inputs together
- Replace electrodes if the gel has dried out
Very noisy signal
- Confirm the RL (reference) electrode is connected — it’s the single biggest contributor to noise immunity
- Wipe the skin with an alcohol swab before attaching electrodes
- Keep the breakout and electrode wires away from power supplies and switching loads
Bio-Z respiration trace is flat or very noisy
- Bio-Z is more sensitive to electrode-skin contact than ECG — re-prep skin and use fresh electrodes
- Make sure the LA and RA electrodes are spanning the chest (not on the same side of the body)
- Excessive motion will overwhelm the breathing signal; sit still during initial testing
Heart rate reads zero or wildly fluctuates
- Confirm the breakout is in R-R mode (
BeginRtoRMode()) — heart-rate registers are only valid in this mode - The chip needs ~3 seconds of clean signal to lock onto the R-peak rhythm
Resources
- Arduino Library: github.com/Protocentral/protocentral_tinyecg_max30001 (forks/alias of the MAX30001 library)
- Hardware Design Files: GitHub repository — schematic, layout and KiCad source under
/hardware/ - MAX30001 Datasheet: Analog Devices MAX30001 Datasheet (PDF)
- OpenView 2: setup guide · source on GitHub
- Adafruit QT Py family: adafruit.com/category/595
- Seeed Studio XIAO family: wiki.seeedstudio.com/Seeeduino-XIAO/
Licenses
- Hardware: CERN Open Hardware Licence v2 — Permissive (CERN-OHL-P v2)
- Software: MIT License


