Getting Started

Getting Started with the ProtoCentral MAX30001 ECG and Bio-Impedance Breakout Board

Last updated May 25, 2026

Getting Started with the ProtoCentral MAX30001 ECG and Bio-Impedance Breakout Board

Introduction

The ProtoCentral MAX30001 ECG and Bio-Impedance Breakout Board is a compact, dual-channel biopotential and bio-impedance front-end based on the Maxim/Analog Devices MAX30001. It captures a single-lead ECG and a bio-impedance respiration signal simultaneously, from the same set of three chest electrodes — making it ideal for wearable devices that need both heart-rate and breathing-rate measurement without adding extra sensors.

The MAX30001 IC delivers ECG performance comparable to the MAX30003 (ultra-low power, 18-bit sigma-delta ADC, on-chip R-to-R peak detection via Pan-Tompkins), and adds a bio-impedance pneumography (Bio-Z) channel that injects a small AC current through the same chest electrodes and measures the impedance change as the chest expands and contracts during respiration. The breakout includes an on-board level translator and dual 1.8 V / 3.3 V regulators for direct use with both 3.3 V and 5 V hosts.

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 chip, two simultaneous channels
  • 3-electrode single-lead ECG — Lead I (LA − RA) with RL reference
  • Bio-impedance respiration — derived from the same LA / RA electrode pair, no additional electrodes needed
  • On-chip R-R peak detection — heart rate computed in hardware via Pan-Tompkins algorithm
  • Ultra-low power — 85 µW (typical), 1.1 V minimum supply
  • High DC offset tolerance — handles electrode polarisation drift without saturating
  • Programmable gain and sample rate — 128, 256, or 512 SPS at 18-bit resolution for ECG
  • On-board level translator — direct 5 V-tolerant I/O
  • Dual on-board low-noise regulators — 1.8 V analog and 3.3 V digital rails
  • SPI interface — works with Arduino, ESP32, and any modern MCU
  • Compact form factor — suitable for wearables and embedded research platforms

What’s in the Box

  • 1× ProtoCentral MAX30001 ECG and Bio-Impedance breakout board
  • 1× 3.5 mm stereo ECG snap cable (3-electrode)
  • A small set of disposable electrodes for first-light testing

You will also need an Arduino Uno (or compatible board), jumper wires, and a USB cable.

Specifications

Parameter Value
ECG / BioZ AFE IC Maxim/Analog Devices MAX30001
ECG Channels 1 (single-lead, 3-electrode: LA, RA, RL)
BioZ Channels 1 (respiration via impedance pneumography)
ADC Resolution 18-bit, sigma-delta (ECG); 20-bit (BioZ)
ECG Sampling Rates 128, 256, 512 SPS
BioZ Sampling Rates 16, 32, 64 SPS
Power Consumption 85 µW (typ., 1.1 V)
Built-in DSP R-R interval detection (Pan-Tompkins)
Interface SPI (4-wire, mode 0)
Logic Levels 5 V tolerant (on-board level translator)
Supply Voltage 3.3 V or 5 V (on-board regulators)
Electrode Connector 3.5 mm stereo (TRS) jack

Pin Connections

Wiring Diagram

MAX30001 breakout to Arduino Uno wiring diagram

MAX30001 Breakout to Arduino Uno

MAX30001 Pin Arduino Uno Pin Function
MISO D12 SPI data out (Slave → Master)
MOSI D11 SPI data in (Master → Slave)
SCK D13 SPI clock
CS0 D7 Chip select
INT1 D2 Interrupt / Data Ready
FCLK – External 32 kHz clock (not used; on-board oscillator)
INT2 – Optional second interrupt
Vcc 5 V Power
GND GND Ground

MAX30001 Breakout to ESP32

MAX30001 Pin ESP32 Pin (VSPI) Function
MISO GPIO 19 SPI data out
MOSI GPIO 23 SPI data in
SCK GPIO 18 SPI clock
CS0 GPIO 5 Chip select
INT1 GPIO 4 Interrupt / Data Ready
Vcc 3.3 V or 5 V Power
GND GND Ground

Electrode Placement

The MAX30001 breakout uses a standard 3-electrode single-lead ECG configuration: two signal electrodes (LA, RA) plus a reference electrode (RL). The same three electrodes also carry the Bio-Z respiration signal — there are no separate respiration electrodes to attach. The cable supplied with the board has a 3.5 mm stereo plug on one end and three snap leads on the other.

MAX30001 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). Electrode adhesion is especially important for the Bio-Z channel — small impedance changes from poor skin contact can swamp the breathing signal.

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

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_max30001_arduino_library
  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

Or create a new sketch with the following code, which streams the ECG and Bio-Z respiration samples side-by-side that you can view in the Arduino Serial Plotter:

#include <SPI.h>
#include "protocentral_max30001.h"

#define MAX30001_CS_PIN   7
#define MAX30001_INT1_PIN 2

MAX30001 max30001(MAX30001_CS_PIN);

void setup() {
    Serial.begin(57600);
    SPI.begin();

    if (!max30001.begin()) {
        Serial.println("MAX30001 not found — check wiring");
        while (1);
    }

    // Enable both ECG and BioZ channels
    max30001.BeginECGBIOZ();
}

void loop() {
    if (digitalRead(MAX30001_INT1_PIN) == LOW) {
        max30001.getECGSamples();
        max30001.getBioZSamples();

        // Print as two columns for the Arduino Serial Plotter
        Serial.print(max30001.ecgdata);
        Serial.print(',');
        Serial.println(max30001.biozdata);
    }
}

What This Code Does

  1. Includes the libraries — protocentral_max30001.h for the ECG/BioZ front-end and SPI.h for SPI bus communication
  2. Creates the MAX30001 object — bound to the chip-select pin (D7)
  3. Initialises the chip — begin() performs the SPI handshake and verifies the part is responding
  4. Configures dual-channel mode — BeginECGBIOZ() enables both ECG and BioZ channels with sensible defaults
  5. Polls the INT1 pin — when DATA-READY goes low, the chip has new samples ready
  6. Reads and prints both channels — ecgdata (18-bit signed ECG sample) and biozdata (20-bit signed BioZ sample), printed as comma-separated values for the Arduino Serial Plotter to display two traces

Using the Arduino Serial Plotter

  1. Upload the sketch to your Arduino
  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 electrode cable leads to the electrodes (matching cap colour to electrode position)
  4. Open Tools → Serial Plotter at 57600 baud
  5. You should see two live traces — the ECG waveform on top with its characteristic PQRST complexes, and the slower-moving Bio-Z respiration signal below, rising and falling with each breath

Measuring Heart Rate and R-R Interval

Like the MAX30003, the MAX30001 computes heart rate and R-R interval on-chip via the Pan-Tompkins algorithm — no microcontroller-side DSP required.

Open the example sketch: File → Examples → ProtoCentral MAX30001 → heartrate_rrinterval

#include <SPI.h>
#include "protocentral_max30001.h"

#define MAX30001_CS_PIN 7

MAX30001 max30001(MAX30001_CS_PIN);

void setup() {
    Serial.begin(115200);
    SPI.begin();

    if (!max30001.begin()) {
        Serial.println("MAX30001 not found");
        while (1);
    }

    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);
    }
}

Open the Serial Monitor at 115200 baud to see the heart rate (BPM) and R-R interval (ms) printed each time a new beat is detected.

Visualizing with OpenView

For a richer visualization that shows ECG, respiration, heart rate and respiration rate together, use the ProtoCentral OpenView application:

  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 ECG & BIOZ breakout” from the Board dropdown
  4. Select the correct 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

No ECG signal / flat line

  • Check that all three electrodes (LA, RA, RL) are firmly attached to skin with good contact
  • Verify SPI wiring — MISO, MOSI, SCK, CS0, and INT1 must all be correctly connected
  • Ensure the electrode cable is fully seated in the 3.5 mm jack on the breakout
  • Check that INT1 is on an interrupt-capable pin (D2 on Arduino Uno)

Very noisy signal

  • Confirm the RL (reference) electrode is connected — it’s the single biggest contributor to noise immunity for both ECG and Bio-Z
  • Replace electrodes if they have been worn for a long time — the conductive gel dries out
  • Wipe the skin with an alcohol swab before attaching electrodes
  • Keep the breakout and electrode wires away from power supplies, motors, and switching loads
  • Make sure the subject is not touching grounded metal objects during recording

Bio-Z respiration trace is flat or very noisy

  • Bio-Z is more sensitive to electrode-skin contact than ECG — re-prep the 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
  • Lower the BioZ sample rate (16 SPS) if the signal looks “spiky” — the on-chip filters will give a cleaner trace

Heart rate reads zero or wildly fluctuates

  • Confirm the breakout is in R-R mode (BeginRtoRMode()) — the heart-rate registers are only valid in this mode
  • The chip needs ~3 seconds of clean signal to lock onto the R-peak rhythm
  • Excessive motion artefact will prevent the algorithm from detecting peaks; sit still for an initial reading

SPI communication errors / MAX30001 not found

  • Verify CS0 pin in the constructor matches your physical wiring (D7 on Arduino Uno)
  • Make sure no other SPI device is conflicting on the bus
  • If using long jumper wires, try reducing SPI clock speed in SPI.beginTransaction()
  • Check the breakout is powered (5 V on Vcc; you should see ~3.3 V on the on-board regulator output)

Resources

Licenses

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