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
| 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.
| 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)
- Open the Arduino IDE
- Go to Sketch → Include Library → Manage Libraries…
- Search for “Protocentral MAX30003”
- Find “ProtoCentral MAX30003 ECG AFE Sensor Library” and click Install
Option 2: Manual Install from GitHub
- Go to github.com/Protocentral/protocentral_max30003
- Click Code → Download ZIP
- In the Arduino IDE, go to Sketch → Include Library → Add .ZIP Library…
- 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
- Includes the libraries —
protocentral_max30003.hfor the ECG front-end andSPI.hfor SPI bus communication - Creates the MAX30003 object — bound to the chip-select pin (D7)
- Initialises the chip —
begin()performs the SPI handshake and verifies the part is responding - Configures ECG-only mode —
BeginECGOnly()enables the ECG channel and sets sensible defaults (sample rate, gain, filter cutoffs) - Polls the INT1 pin — when DATA-READY goes low, the chip has new ECG samples in its FIFO
- Reads and prints samples —
getECGSamples()pulls the data;ecgdatais the latest 18-bit sample as a signed integer
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 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:
- Download OpenView 2 from GitHub
- Upload the OpenView example sketch from the library examples
- Open OpenView 2, select “MAX30003 breakout” from the Board dropdown
- Select the correct serial port and click Start
- 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
- Arduino Library: github.com/Protocentral/protocentral_max30003
- Hardware Design Files: GitHub repository — schematic, layout and KiCad source under
/hardware/ - MAX30003 Datasheet: Analog Devices MAX30003 Datasheet (PDF)
- OpenView 2: github.com/Protocentral/protocentral_openview2
Licenses
- Hardware: CERN Open Hardware Licence v2 — Permissive (CERN-OHL-P v2)
- Software: MIT License


