Getting Started

Getting Started with the ProtoCentral tinyECG (MAX30001 · QT Py / XIAO Form Factor)

Last updated May 9, 2026

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

tinyECG with QT Py / XIAO host wiring diagram

  1. 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.
  2. 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.
  3. 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.
  4. 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 Breakout3-electrode single-lead ECG (LA, RA, RL) which simultaneously carries the Bio-Z respiration signal.

tinyECG 3-electrode ECG + Bio-Z placement on torso (LA, RA, RL)

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

  1. 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
  2. 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)

  1. Open the Arduino IDE
  2. Go to Sketch → Include Library → Manage Libraries…
  3. Search for “Protocentral MAX30001”
  4. Find “ProtoCentral MAX30001 ECG and BioZ AFE Sensor Library” and click Install

Option 2: Manual Install from GitHub

  1. Go to github.com/Protocentral/protocentral_tinyecg_max30001
  2. Click Code → Download ZIP
  3. In the Arduino IDE, go to Sketch → Include Library → Add .ZIP Library…
  4. 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

  1. Includes the librariesprotocentral_max30001.h and SPI.h
  2. Creates the MAX30001 object — bound to the host’s CS pin (D6 on QT Py ESP32-C3)
  3. Initialises the chipbegin() performs the SPI handshake; if it fails, you’ll see a diagnostic message in the Serial Monitor
  4. Configures dual-channel modeBeginECGBIOZ() enables both ECG and BioZ
  5. Polls INT1 — reads new samples whenever DATA-READY goes low
  6. Prints CSV columns — for the Arduino Serial Plotter at 115200 baud to display two traces

Using the Arduino Serial Plotter

  1. Upload the sketch
  2. Attach the three electrodes to your torso: LA below the left collarbone, RA below the right collarbone, RL on the lower right abdomen
  3. Snap the cable leads to the electrodes (matching cap colour to position)
  4. Open Tools → Serial Plotter at 115200 baud
  5. 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

  1. Install OpenView 2 — see the setup guide for downloads + first run on Windows / Linux / iOS / Android
  2. Upload the OpenView example sketch from the library examples
  3. Open OpenView 2, select “MAX30001 breakout” from the Board dropdown (the same option works for tinyECG since the chip is identical)
  4. Select the QT Py / XIAO’s serial port and click Start
  5. 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

Licenses

  • Hardware: CERN Open Hardware Licence v2 — Permissive (CERN-OHL-P v2)
  • Software: MIT License