Getting Started with the ProtoCentral Pulse Express (MAX30102 + MAX32664D)
Introduction
The ProtoCentral Pulse Express is an all-in-one fingertip pulse-oximetry breakout that gives you SpO2, heart rate and blood-pressure-trending (BPT) outputs without writing any DSP code. The board pairs Maxim’s MAX30102 PPG sensor (RED + IR LEDs and a photodiode in one tiny package) with the MAX32664D biometric sensor hub IC — a small Cortex-M4 microcontroller pre-loaded with Maxim’s optical biometric algorithms. Your host MCU just talks I2C to the MAX32664D and reads back computed values; the algorithms run on the hub itself.
This is a reflective pulse-oximetry sensor, so unlike the AFE4490 there’s no DB9 finger-clip probe — the LEDs and photodiode sit on the board itself, and you place your fingertip directly on the on-board sensor area. The board is small enough (35 mm × 17 mm) and low-power enough to design into wearables, and a footprint for an optional motion-tracking IMU is provided on the underside for projects that need accelerometer-based motion-artefact compensation.
Note: This board is intended for research and development purposes only. It is not FDA, CE, or FCC approved for consumer or medical use. The BPT estimation feature is a trend indicator, not a clinical blood-pressure measurement.
Key Features
- MAX30102 high-sensitivity PPG sensor — RED + IR LEDs and photodiode in a single 5.6 mm × 3.3 mm package
- MAX32664D biometric sensor hub — Maxim’s pre-baked algorithms for SpO2, heart rate and BPT run on-chip
- No host-side DSP required — your MCU just reads the computed metrics over I2C
- Three modes: raw PPG streaming · algorithm mode (HR + SpO2) · BPT estimation mode
- Optional on-board IMU footprint — for motion-artefact compensation (populated as needed)
- Easy-to-use I2C interface — works with Arduino, ESP32, RP2040, and any modern MCU
- Ultra-low power — suitable for battery-powered wearables
- Compact footprint — 35 mm × 17 mm
What’s in the Box
- 1× ProtoCentral Pulse Express breakout board
You will also need an Arduino Uno (or compatible board), a USB cable, and 6 jumper wires.
Specifications
| Parameter | Value |
|---|---|
| PPG Sensor | Maxim MAX30102 (RED + IR LEDs + integrated photodiode) |
| Sensor Hub | Maxim MAX32664D (Cortex-M4 with biometric algorithms) |
| Outputs | Heart rate (BPM) · SpO2 (%) · BPT (systolic / diastolic trend, mmHg) |
| Modes | Raw PPG streaming · Algorithm (HR + SpO2) · BPT calibration + estimation |
| Interface | I2C (4-pin) + 2 GPIOs (MFIO + RESET for boot-mode handshake) |
| I2C Address | 0x55 (MAX32664D 7-bit address) |
| Logic Levels | 5 V tolerant (on-board level translator) |
| Supply Voltage | 3.3 V or 5 V (on-board regulators) |
| Optional IMU | Footprint for an accelerometer (motion-artefact compensation) |
| Dimensions | 35 mm × 17 mm |
Pin Connections
Wiring Diagram
Pulse Express to Arduino Uno
| Pulse Express Pin | Arduino Uno Pin | Function |
|---|---|---|
| SDA | A4 (or dedicated SDA) | I2C data |
| SCL | A5 (or dedicated SCL) | I2C clock |
| MFIO | D5 | Multi-function I/O — used for boot-mode handshake |
| RESET | D4 | Active-low reset — toggled by the library at startup |
| VIN | 5 V | Power |
| GND | GND | Ground |
Pulse Express to ESP32
| Pulse Express Pin | ESP32 Pin | Function |
|---|---|---|
| SDA | GPIO 21 (default I2C0 SDA) | I2C data |
| SCL | GPIO 22 (default I2C0 SCL) | I2C clock |
| MFIO | GPIO 16 | Multi-function I/O |
| RESET | GPIO 17 | Active-low reset |
| VIN | 3.3 V or 5 V | Power |
| GND | GND | Ground |
Tip: The MFIO + RESET pins are part of the MAX32664D’s boot sequence. The ProtoCentral library toggles them at startup to put the hub into application mode, so don’t repurpose those pins for anything else while the sensor is in use.
Finger Placement
Pulse Express uses reflective pulse oximetry — the LEDs and photodiode are both on the same side of the board and rely on light scattering back from blood inside the fingerpad. Placement is much simpler than a clip-on probe: just rest a fingertip directly on the sensor area.
| Step | Action |
|---|---|
| 1 | Locate the small black package on the top of the PCB labelled MAX30102 — that’s the sensor area |
| 2 | Rest your index or middle finger pad (the soft underside of the fingertip) gently on top of the sensor |
| 3 | The fingernail should be facing up, away from the board |
| 4 | Apply light, constant pressure — just enough to fully cover the LEDs and photodiode; 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 on the underside, thick calluses, and motion all degrade the PPG signal. Use a warm bare finger and stay still during measurement. The MAX32664D needs a few seconds of clean data before its HR / SpO2 / BPT 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 “Protocentral 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 PPG Reading (Raw Mode)
Open the example sketch: File → Examples → Protocentral Pulse Express → raw_mode
This sketch streams the raw RED and IR PPG samples directly from the MAX30102 — useful for verifying your finger placement and the signal-to-noise ratio:
#include <Wire.h>
#include "protocentral_pulse_express.h"
#define MFIO_PIN 5
#define RESET_PIN 4
PulseExpress pulseExpress(MFIO_PIN, RESET_PIN);
void setup() {
Serial.begin(115200);
Wire.begin();
if (!pulseExpress.begin()) {
Serial.println("Pulse Express not found — check wiring");
while (1);
}
pulseExpress.beginRawMode();
}
void loop() {
if (pulseExpress.readSample()) {
// Two columns for the Arduino Serial Plotter
Serial.print(pulseExpress.red);
Serial.print(',');
Serial.println(pulseExpress.ir);
}
}
What This Code Does
- Includes the libraries —
Wire.hfor I2C,protocentral_pulse_express.hfor the sensor - Creates the Pulse Express object — bound to MFIO (D5) and RESET (D4)
- Initialises the chip —
begin()runs the MFIO/RESET boot-mode handshake to put the MAX32664D into application mode - Configures raw mode —
beginRawMode()enables direct PPG streaming from the MAX30102 - Reads samples —
readSample()pulls one new sample pair;redandirare 18-bit unsigned integers - Prints two columns — the Arduino Serial Plotter at 115200 baud displays them as two traces
Using the Arduino Serial Plotter
- Upload the sketch to your Arduino
- Place your fingerpad on the on-board MAX30102 sensor area
- Open Tools → Serial Plotter at 115200 baud
- You should see two pulsatile waveforms — IR is typically larger, both rise and fall with each heartbeat
Algorithm Mode (Heart Rate + SpO2)
Open the example sketch: File → Examples → Protocentral Pulse Express → algorithm_mode
In algorithm mode, the MAX32664D outputs already-computed HR and SpO2:
#include <Wire.h>
#include "protocentral_pulse_express.h"
#define MFIO_PIN 5
#define RESET_PIN 4
PulseExpress pulseExpress(MFIO_PIN, RESET_PIN);
void setup() {
Serial.begin(115200);
Wire.begin();
pulseExpress.begin();
pulseExpress.beginAlgorithmMode();
}
void loop() {
if (pulseExpress.readAlgorithm()) {
Serial.print("HR: ");
Serial.print(pulseExpress.heartRate);
Serial.print(" BPM SpO2: ");
Serial.print(pulseExpress.spo2);
Serial.print(" % Confidence: ");
Serial.println(pulseExpress.confidence);
}
}
The confidence value (0 – 100) tells you how trustworthy each reading is — discard or de-weight low-confidence samples in your application.
BPT Estimation Mode
Blood-pressure trending (BPT) requires a one-time calibration against a reference cuff measurement. After calibration, the MAX32664D estimates systolic and diastolic blood pressure from the PPG morphology alone.
Open the example sketch: File → Examples → Protocentral Pulse Express → bpt_mode
- Update the calibration variables at the top of the sketch with your typical SpO2 reading and a recent reference systolic/diastolic from a clinical cuff
- Upload the sketch to your Arduino
- Open the Serial Monitor at 115200 baud
- Place your finger on the sensor and hold still until the calibration progress reaches 100 %
- Wait ~10 seconds for the algorithm to settle, then read off systolic / diastolic estimates
Important: BPT is a trend indicator. It tracks changes from your calibrated baseline; absolute values are only as reliable as the calibration cuff measurement and degrade over time as physiology changes. Re-calibrate periodically (and ideally before each session) for meaningful numbers.
Visualizing with OpenView
For a richer visualisation that shows the raw PPG traces alongside computed HR / SpO2 / BPT, 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 “Pulse Express” from the Board dropdown
- Select the correct serial port and click Start
- You’ll see live PPG waveforms with running HR / SpO2 readouts (and BPT after calibration)
Troubleshooting
Sensor not found at startup
- Check SDA/SCL wiring — on Arduino Uno, SDA is on A4 and SCL is on A5
- Verify MFIO and RESET match the constructor pins (default D5 / D4)
- Confirm power: VIN to 5 V (or 3.3 V on a 3.3 V host), solid GND
- Run an I2C scanner sketch to confirm the MAX32664D responds at 0x55
Flat / very noisy PPG signal
- Cold fingers reduce blood flow at the fingertip — warm your hand for ~30 seconds before testing
- Remove nail polish (especially on the underside of the finger near the cuticle) — it can absorb LED light through the fingerpad
- Apply only light, constant pressure — pressing hard cuts off blood flow and flattens the waveform
- Keep the finger still during measurement
HR / SpO2 reads strange values or “0”
- The algorithm needs ~5 seconds of clean PPG data to lock on
- Check the confidence value — discard or ignore samples below ~70 %
- Verify the raw RED + IR traces look pulsatile in raw mode before relying on algorithm-mode numbers
- Make sure both LEDs and the photodiode are fully covered by the fingertip
BPT estimation drifts or jumps
- BPT is calibrated against your reference cuff measurement; if the calibration was poor, every estimate inherits that error
- Re-calibrate at the start of each session for best results
- BPT is not a substitute for a clinical cuff — treat it as a trend indicator, not an absolute number
Library compile errors / boot handshake fails
- Ensure the MFIO and RESET pins in the constructor match your physical wiring — the library toggles them in a specific sequence at startup
- Try a slower SPI / I2C clock speed if you’re using long jumper wires
- Power-cycle the breakout to retry the boot handshake
Resources
- Arduino Library: github.com/Protocentral/protocentral-pulse-express
- Hardware Design Files: GitHub repository — schematic, layout and KiCad source under
/hardware/ - MAX30102 Datasheet: Maxim/Analog Devices MAX30102 Datasheet (PDF)
- MAX32664D User Guide: Maxim Sensor Hub Quick Start (UG6806)
- OpenView 2: setup guide · source on GitHub
Licenses
- Hardware: CERN Open Hardware Licence v2 — Permissive (CERN-OHL-P v2)
- Software: MIT License

