Getting Started

Getting Started with the ProtoCentral MAX30003 Single-Lead ECG Breakout Board

Last updated May 5, 2026

Getting Started with the ProtoCentral MAX30003 Single-Lead ECG Breakout Board

Introduction

The ProtoCentral MAX30003 Single-Lead ECG Breakout Board is a compact, low-power, single-lead electrocardiogram (ECG) front-end based on the Maxim/Analog Devices MAX30003. It is designed for wearable, battery-powered, and research-grade biopotential applications where signal quality, low power, and a tiny footprint matter more than channel count.

The MAX30003 IC has two characteristics that make it stand out for wearables. First, power consumption is just 85 µW at 1.1 V — orders of magnitude lower than traditional ECG front-ends, allowing it to run for weeks on a small lithium cell. Second, the chip’s high common-mode rejection ratio and built-in DC offset cancellation work well even on a simple 3-electrode setup, eliminating the need for a complex active drive circuit.

The breakout’s most useful feature is the on-chip R-to-R peak detection algorithm based on the Pan-Tompkins method. The chip itself measures the time between successive R-peaks of the QRS complex, so heart-rate computation is available right out of the box without any microcontroller-side DSP code. The board includes an on-board level translator and dual 1.8 V / 3.3 V regulators, so it works directly with both 3.3 V and 5 V Arduino-class 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

  • MAX30003 single-lead ECG front-end — ultra-low power (85 µW), 1.1 V minimum supply
  • On-chip R-R peak detection — heart rate computed in hardware via Pan-Tompkins algorithm
  • 3-electrode single-lead ECG — LA, RA, and RL reference for clean signals on a single channel
  • High DC offset tolerance — handles electrode polarisation drift without saturating
  • Programmable gain and sample rate — 128, 256, or 512 SPS at 18-bit resolution
  • 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 — high-speed digital communication with Arduino, ESP32, or any modern MCU
  • Compact form factor — ideal for wearables and embedded research platforms

What’s in the Box

  • 1× ProtoCentral MAX30003 single-lead ECG breakout board (v2)
  • 1× 3.5 mm stereo ECG snap cable
  • 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 AFE IC Maxim/Analog Devices MAX30003
Channels 1 (single-lead, 3-electrode: LA, RA, RL)
ADC Resolution 18-bit, sigma-delta
Sampling Rates 128, 256, 512 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

MAX30003 breakout to Arduino Uno wiring diagram

MAX30003 Breakout to Arduino Uno

MAX30003 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

MAX30003 Breakout to ESP32

MAX30003 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 MAX30003 breakout uses a standard 3-electrode single-lead ECG configuration: two signal electrodes (LA, RA) plus a reference electrode (RL). The cable supplied with the board has a 3.5 mm stereo plug on one end and three snap leads on the other.

MAX30003 3-electrode ECG 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
RA Black Below the right collarbone, near the right shoulder Lead I negative
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). The MAX30003’s high DC offset range tolerates a wide variation in skin-electrode interface impedance, but clean skin still gives the cleanest signal.

Tip: The RL reference electrode is what gives this 3-electrode setup its noise immunity. Skipping it will work in a pinch, but the ECG trace 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 MAX30003”
  4. Find “ProtoCentral MAX30003 ECG AFE Sensor Library” and click Install

Option 2: Manual Install from GitHub

  1. Go to github.com/Protocentral/protocentral_max30003
  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 Reading

Open the example sketch: File → Examples → ProtoCentral MAX30003 → ecg_streaming

Or create a new sketch with the following code, which streams raw ECG samples that you can view in the Arduino Serial Plotter:

#include 
#include "protocentral_max30003.h"

#define MAX30003_CS_PIN   7
#define MAX30003_INT1_PIN 2

MAX30003 max30003(MAX30003_CS_PIN);

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

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

    max30003.BeginECGOnly();
}

void loop() {
    if (digitalRead(MAX30003_INT1_PIN) == LOW) {
        max30003.getECGSamples();
        Serial.println(max30003.ecgdata);
    }
}

What This Code Does

  1. Includes the librariesprotocentral_max30003.h for the ECG front-end and SPI.h for SPI bus communication
  2. Creates the MAX30003 object — bound to the chip-select pin (D7)
  3. Initialises the chipbegin() performs the SPI handshake and verifies the part is responding
  4. Configures ECG-only modeBeginECGOnly() enables the ECG channel and sets sensible defaults (sample rate, gain, filter cutoffs)
  5. Polls the INT1 pin — when DATA-READY goes low, the chip has new ECG samples in its FIFO
  6. Reads and prints samplesgetECGSamples() pulls the data; ecgdata is the latest 18-bit sample as a signed integer

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 the live ECG waveform — the characteristic PQRST complex of your heartbeat

Measuring Heart Rate and R-R Interval

The MAX30003’s most powerful feature is on-chip R-peak detection, so heart rate and R-R interval are available with no microcontroller-side DSP.

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

#include 
#include "protocentral_max30003.h"

#define MAX30003_CS_PIN 7

MAX30003 max30003(MAX30003_CS_PIN);

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

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

    max30003.BeginRtoRMode();
}

void loop() {
    if (max30003.getHeartRate()) {
        Serial.print("Heart Rate (BPM): ");
        Serial.print(max30003.heartRate);
        Serial.print("    R-R interval (ms): ");
        Serial.println(max30003.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 experience, use the ProtoCentral OpenView application:

  1. Download OpenView 2 from GitHub
  2. Upload the OpenView example sketch from the library examples
  3. Open OpenView 2, select “MAX30003 breakout” from the Board dropdown
  4. Select the correct serial port and click Start
  5. You’ll see real-time ECG waveforms with computed heart rate alongside

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
  • 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
  • Try a lower sample rate (128 SPS) — the on-chip filters will give a cleaner waveform

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 / MAX30003 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