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
| 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.
| 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)
- 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_max30001_arduino_library
- 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
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
- Includes the libraries —
protocentral_max30001.hfor the ECG/BioZ front-end andSPI.hfor SPI bus communication - Creates the MAX30001 object — bound to the chip-select pin (D7)
- Initialises the chip —
begin()performs the SPI handshake and verifies the part is responding - Configures dual-channel mode —
BeginECGBIOZ()enables both ECG and BioZ channels with sensible defaults - Polls the INT1 pin — when DATA-READY goes low, the chip has new samples ready
- Reads and prints both channels —
ecgdata(18-bit signed ECG sample) andbiozdata(20-bit signed BioZ sample), printed as comma-separated values for the Arduino Serial Plotter to display two traces
Using the Arduino Serial Plotter
- Upload the sketch to your Arduino
- 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 electrode cable leads to the electrodes (matching cap colour to electrode position)
- Open Tools → Serial Plotter at 57600 baud
- 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:
- 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 ECG & BIOZ breakout” from the Board dropdown
- Select the correct 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
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
- Arduino Library: github.com/Protocentral/protocentral_max30001_arduino_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
Licenses
- Hardware: CERN Open Hardware Licence v2 — Permissive (CERN-OHL-P v2)
- Software: MIT License

