Getting Started with the Protocentral Pulse Express (MAX30101/30102 + MAX32664D)
Introduction
The Protocentral Pulse Express is an all-in-one fingertip pulse-oximetry breakout that gives you SpO2, heart rate and blood-pressure-trend (BPT) outputs without writing any DSP code. The board pairs an optical PPG sensor with the MAX32664D biometric sensor hub, which runs Analog Devices’ optical biometric algorithms on-chip. Your host MCU talks I2C to the MAX32664D and reads back computed values.
This guide covers every Pulse Express revision. Pulse Express v4 uses the MAX30101 and earlier boards use the MAX30102, so the guide writes MAX30101/30102 wherever something applies to both. The section on each board’s differences is below.
This is a reflective pulse-oximetry sensor, so there’s no finger-clip probe. The LEDs and photodiode sit on the board itself, and your fingertip rests directly on them.
Note: This board is intended for research and development only. It is not FDA, CE or FCC approved for consumer or medical use. The BPT output is a trend indicator, not a clinical blood-pressure measurement.
Key Features
- MAX30101/30102 PPG sensor: LEDs and photodiode in a single 5.6 mm × 3.3 mm package
- MAX32664D biometric sensor hub: SpO2, heart-rate and BPT algorithms run on-chip
- No host-side DSP required: your MCU reads the computed values over I2C
- Three ways to use it: raw PPG streaming, heart rate + SpO2, and BPT estimation
- Works with: Arduino, ESP32, RP2040 and other modern MCUs
New in Pulse Express v4
- Qwiic connector: the default way to connect. No soldering, and MFIO and RST aren’t needed for normal use
- 5.0 V LED supply: an on-board LM2775 charge pump, so LED drive doesn’t depend on your host’s supply voltage
- Stronger strap slots: 2.19 mm of board on each side of the slots
What’s in the Box
- 1 × Protocentral Pulse Express breakout board
- 1 × 6-pin straight header
- 1 × Velcro finger strap
On v4 the header ships unsoldered, and you only need it for a 5 V host or a hub firmware update. You’ll also need a host board and a USB cable, plus a Qwiic cable or jumper wires depending on how you connect.
Specifications
| Parameter | Pulse Express v4 | Earlier boards |
|---|---|---|
| PPG sensor | MAX30101 | MAX30102 |
| Sensor hub | MAX32664D | MAX32664D |
| Outputs | Heart rate · SpO2 · BPT trend · raw PPG | Same |
| Connection | Qwiic (3.3 V) or 6-pin 0.1″ header (3.3–5 V) | 6-pin 0.1″ header (3.3–5 V) |
| Host pins needed | SDA, SCL, power, GND. MFIO and RST for firmware update only | SDA, SCL, power, GND, MFIO, RST |
| I2C address | 0x55 | 0x55 |
| LED supply | 5.0 V charge pump | On-board 3.3 V regulator |
| Board size | 35.9 × 16.4 mm, 6 mm high with the Qwiic connector | 36.0 × 17.5 mm |
The hub’s algorithms use the sensor’s red and infrared LEDs.
Connecting the Board

Qwiic (v4, recommended)
Connect a Qwiic cable between the Pulse Express and your host. That’s all the wiring you need. The board boots on its own, and the library polls it for data over I2C.
Qwiic is 3.3 V only. The Qwiic connector goes straight to the hub’s I2C bus, with no level shifting. Don’t use a Qwiic adapter cable to wire it to a 5 V host such as an Arduino Uno; use the header instead.
One host at a time. Connect one host, through either Qwiic or the header, not both.
The library still asks for two pin numbers, even when MFIO and RST aren’t connected. Keep the defaults, and don’t use those two pins for anything else in your sketch:
PulseExpress hub(RESET_PIN, MFIO_PIN);
If your board’s Qwiic connector is on a second I2C bus, such as Wire1 on the Arduino UNO R4 WiFi, pass that bus to the library and start it instead of Wire:
PulseExpress hub(RESET_PIN, MFIO_PIN, Wire1);
void setup() {
Wire1.begin();
// ...
}
0.1″ header
Use the header on 5 V hosts and on boards earlier than v4. On v4, solder the included header first. The board has on-board level shifting for 3.3–5 V hosts.
| Pulse Express pin | Arduino Uno | ESP32 | Function | Needed on v4 |
|---|---|---|---|---|
| VCC | 5 V | 3.3 V | Power | Yes |
| GND | GND | GND | Ground | Yes |
| SDA | A4 | GPIO 21 | I2C data | Yes |
| SCL | A5 | GPIO 22 | I2C clock | Yes |
| MFIO | D2 | Any GPIO | Hub mode and data ready | Firmware update only |
| RST | D4 | Any GPIO | Hub reset | Firmware update only |
On boards earlier than v4, wire all six pins. The library uses MFIO and RST to start the hub.
Finger Placement
Pulse Express uses reflective pulse oximetry: the LEDs and photodiode are on the same side of the board and rely on light scattering back from blood in your fingerpad.

| Step | Action |
|---|---|
| 1 | Find the small black sensor package. On v4 it’s in the centre of the ring markings, on the side opposite the components |
| 2 | Rest the soft pad of your index or middle finger gently on the sensor |
| 3 | Thread the included Velcro strap through the board’s two slots to hold your finger in place, if you want a steadier reading |
| 4 | Apply light, constant pressure, just enough to cover the sensor. Pressing too hard cuts off blood flow and flattens the signal |
| 5 | Hold still for 5–10 seconds while the algorithm locks on |
Tip for clean signals: Cold fingers, nail polish, thick calluses and motion all degrade the PPG signal. Use a warm, bare finger and stay still. The MAX32664D needs a few seconds of clean data before its outputs settle.
Installing the Arduino Library
Option 1: Arduino Library Manager (Recommended)
- Open the Arduino IDE
- Go to Sketch → Include Library → Manage Libraries…
- Search for “Pulse Express”
- Find “ProtoCentral Pulse Express SpO2 Heartrate and BPT sensor” and click Install
Option 2: Manual Install from GitHub
- Go to github.com/Protocentral/protocentral-pulse-express
- Click Code → Download ZIP
- In the Arduino IDE, go to Sketch → Include Library → Add .ZIP Library…
- Select the downloaded ZIP file
Your First Reading (Heart Rate + SpO2)
Open File → Examples → ProtoCentral Pulse Express SpO2 Heartrate and BPT sensor → 03.HeartRateSpO2. This is a shortened version of it:
#include <Wire.h>
#include "protocentral_pulse_express.h"
#define RESET_PIN 4
#define MFIO_PIN 2
PulseExpress hub(RESET_PIN, MFIO_PIN);
void setup() {
Serial.begin(57600);
Wire.begin();
if (hub.begin() != PulseExpressStatus::Ok ||
hub.startEstimation() != PulseExpressStatus::Ok) {
Serial.println("Pulse Express not responding: check wiring");
while (true) delay(1000);
}
Serial.println("Place finger on the sensor...");
}
void loop() {
PulseExpressSample samples[8];
size_t n = 0;
do {
n = 0;
if (hub.readSamples(samples, 8, &n) != PulseExpressStatus::Ok) return;
for (size_t i = 0; i < n; ++i) {
Serial.print("HR: ");
Serial.print(samples[i].heartRate(), 1);
Serial.print(" bpm SpO2: ");
Serial.print(samples[i].spo2(), 1);
Serial.println(" %");
}
} while (n == 8);
delay(100);
}
Upload it, open the Serial Monitor at 57600 baud, and rest your finger on the sensor. Readings settle after a few seconds.
The full example also prints the hub’s firmware version and, on firmware 40.5.0 or later, an SpO2 confidence figure. Treat low-confidence readings with caution.
Raw PPG
Open the example 01.RawPPGStreamPlotter, then Tools → Serial Plotter at 57600 baud. It streams the infrared PPG signal as raw ADC counts, and you should see a pulsing waveform that rises and falls with each heartbeat. It’s the quickest way to check your finger placement.
BPT Estimation
Blood-pressure trending needs a calibration against a reference cuff measurement. After calibration, the MAX32664D estimates systolic and diastolic values from the PPG waveform.
- Open the example 06.BPTCalibrateAndEstimate
- Set
REF_SYSTOLICandREF_DIASTOLICat the top of the sketch to a reading you’ve just taken with a validated cuff. The values in the example are placeholders - Upload the sketch and open the Serial Monitor at 57600 baud
- Rest your finger on the sensor and hold still until calibration reaches 100 %
- Keep holding still, and read the live estimates
Examples 04 and 05 split calibration and estimation into separate sketches, 07 saves the calibration to EEPROM, and 08 handles several subjects. The calibration examples don’t fit on small AVR boards such as the Uno, except the Mega; use a board with more memory.
Important: BPT is a trend indicator. It tracks changes from your calibrated baseline, and absolute values are only as reliable as the cuff measurement. Re-calibrate before each session for meaningful numbers.
Visualizing with OpenView
To see live IR and red PPG waveforms on your computer, use Protocentral OpenView 3 over USB:
- Install OpenView. The setup page has downloads and first-run steps
- Upload the example 02.RawPPGStreamOpenView
- In OpenView, choose Pulse Express as the board
- Select the serial port and start streaming
Updating the Hub Firmware
Boards ship pre-flashed, so you normally never need this. It’s the only time v4 needs MFIO and RST, and the procedure is for factory programming and recovery.
- On v4, solder the header and wire all six pins as in the table above
- Use a host with plenty of RAM, such as an ESP32, UNO R4 or RP2040. The firmware page buffer doesn’t fit on small AVR boards
- Upload the example 11.FirmwareFlash
- Run
extras/flash_tool/flash_msbl.pyfrom the library against your port and firmware file
The firmware image is Analog Devices IP and isn’t included with the library. If a flash is interrupted, the hub stays in bootloader mode; run the flash again to recover.
Troubleshooting
Sensor not found at startup
- Qwiic: reseat the cable at both ends and check the host’s Qwiic connector is on the bus your sketch uses (
WireorWire1) - Header: check SDA and SCL. On an Arduino Uno, SDA is A4 and SCL is A5
- Earlier boards: check MFIO and RST match the pin numbers in your sketch (D2 and D4 by default)
- Check power and ground, and run an I2C scanner sketch to confirm the hub responds at 0x55
- Example 10.DeviceInfoAndDiagnostics prints the hub’s firmware version and live status
Flat or very noisy PPG signal
- Warm your hand for about 30 seconds; cold fingers reduce blood flow at the fingertip
- Remove nail polish
- Apply only light, constant pressure, and keep your finger still
Heart rate or SpO2 reads strange values or 0
- The algorithm needs about 5 seconds of clean PPG data to lock on
- Check the raw waveform with example 01 before relying on computed numbers
- Make sure your fingertip fully covers the sensor
- If SpO2 stays pinned at 100 % or drifts from a reference oximeter, tune the coefficients following application note AN6845
BPT estimation drifts or jumps
- If the calibration was poor, every estimate inherits that error
- Re-calibrate at the start of each session
- BPT doesn’t replace a clinical cuff. Treat it as a trend, not an absolute number
Sketch runs out of memory
- The calibration examples build an informative stub on small AVR boards. Use a Mega or a non-AVR board
Resources
- Arduino library: github.com/Protocentral/protocentral-pulse-express
- Hardware design files: github.com/Protocentral/protocentral_pulse_express_hardware
- Datasheets: MAX30101 · MAX30102 · MAX32664
- MAX32664 user guide: UG6806
- OpenView: setup guide · source on GitHub
Licenses
- Hardware: CERN Open Hardware Licence v2, Permissive (CERN-OHL-P v2)
- Software: MIT License