Getting Started

Getting Started with the ProtoCentral AFE4490 Pulse Oximeter Arduino Shield v2

Last updated May 7, 2026

Getting Started with the ProtoCentral AFE4490 Pulse Oximeter Breakout

Introduction

The ProtoCentral AFE4490 Pulse Oximeter Breakout is a complete pulse-oximetry front-end based on the Texas Instruments AFE4490, a single-chip analog front-end designed specifically for transmissive pulse oximetry. The board pairs the AFE4490 IC with a standard Nellcor-compatible DB9 connector so you can plug in any off-the-shelf SpO2 finger-clip probe and start streaming photoplethysmography (PPG) data in minutes.

Pulse oximetry is an indirect, optical measurement of the oxygen saturation in arterial blood. The probe shines red (~660 nm) and infrared (~880 nm) light through a fingertip, ear lobe or other thin tissue, and a photodiode on the opposite side measures how much of each wavelength is absorbed. The ratio of red-to-IR absorption changes with the proportion of oxygenated to deoxygenated haemoglobin in the blood — the AFE4490 chip drives the LEDs and digitises the photodiode current, leaving the host MCU only the simple SpO2 ratio calculation. As a useful side effect, the same PPG waveform also carries a clear heart-rate signal — no chest electrodes required.

This getting-started guide covers both ProtoCentral AFE4490 SKUs:

The pinout, library and example sketches are identical for both — the only difference is mechanical (shield vs. breakout).

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

  • TI AFE4490 single-chip pulse-oximetry front-end — drives RED + IR LEDs and digitises photodiode current
  • Nellcor-compatible DB9 connector — works with any standard adult / paediatric SpO2 finger-clip probe
  • 22-bit ambient-light-compensated ADC — clean PPG waveform even under indoor lighting
  • Programmable LED current — adapts to skin tone, finger thickness and probe geometry for stable signals
  • SPI interface — works with Arduino, ESP32 and any modern MCU
  • 5 V tolerant I/O — direct connection to Arduino Uno / Mega / R4 without level shifters
  • Two form factors — standalone breakout or Arduino-stacking shield, same library

What’s in the Box

Breakout Kit (8809):

  • 1× ProtoCentral AFE4490 breakout board
  • 1× Nellcor-compatible SpO2 finger-clip probe with DB9 connector
  • Header pins (unsoldered)

Arduino Shield v2 (8810):

  • 1× ProtoCentral AFE4490 Arduino shield (pre-assembled, stacks on Uno-style boards)
  • 1× Nellcor-compatible SpO2 finger-clip probe with DB9 connector

You will also need an Arduino Uno (or compatible board) and a USB cable.

Specifications

Parameter Value
Pulse-Oximetry AFE IC Texas Instruments AFE4490
ADC 22-bit, ambient-light-compensated transimpedance ADC
LED Wavelengths RED ~660 nm + IR ~880 nm (driven by AFE4490)
LED Drive Programmable current (typ. 0-50 mA per LED)
Probe Connector DB9 (Nellcor-compatible pinout)
Interface SPI (4-wire, mode 0) + DRDY interrupt + START / PWDN GPIO
Logic Levels 5 V tolerant
Supply Voltage 5 V
Form Factors Breakout board (8809) · Arduino shield v2 (8810)

Pin Connections

Wiring Diagram

AFE4490 breakout to Arduino Uno wiring diagram

AFE4490 Breakout to Arduino Uno (kit 8809)

AFE4490 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
DRDY D2 Data Ready / interrupt
START D5 Conversion-start GPIO
PWDN D4 Power-down / reset GPIO
Vcc 5 V Power
GND GND Ground
DIAG_END / LED_ALM / PD_ALM Cable / sensor fault indicators (optional, leave open)

Arduino Shield v2 (8810)

The shield is plug-and-play — stack it directly on an Arduino Uno, Mega, Due, R4 Minima or R4 WiFi using the standard Uno header layout. The shield routes SPI through the ICSP header, so it’s compatible with newer boards that don’t expose D11–D13 as the SPI pins. No jumper wires required.

Tip: If you’re stacking another shield on top of the AFE4490 shield, make sure that shield doesn’t also use D2, D4, D5 or D7 — those are the AFE4490’s interrupt and control pins.

AFE4490 Breakout to ESP32

AFE4490 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
DRDY GPIO 4 Data Ready / interrupt
START GPIO 16 Conversion start
PWDN GPIO 17 Power down / reset
Vcc 5 V Power
GND GND Ground

Probe Placement

Plug the supplied SpO2 finger-clip probe into the DB9 socket on the breakout (or shield). Open the clip and insert your index or middle finger with the fingernail facing up — i.e. the LEDs (in the top of the clip) shine through the nail and the photodiode (in the bottom of the clip) is in contact with the fingertip pad. Push the finger past the distal joint until it stops against the back of the clip housing.

AFE4490 SpO2 finger-clip probe placement

Component Location Role
RED LED (~660 nm) Top of clip, above the finger Source for RED PPG channel
IR LED (~880 nm) Top of clip, beside RED LED Source for IR PPG channel
Photodiode (PD) Bottom of clip, below the finger Receives transmitted light through finger
Spring hinge Side of clip Provides constant clamping pressure
DB9 cable Tail end of clip Plugs into AFE4490 breakout

Tip for clean signals: Cold fingers, nail polish (especially black, blue or brown), thick calluses, and excessive motion all degrade the SpO2 signal. For first-light testing, use a warm bare index finger of the non-dominant hand and stay still.

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 AFE4490”
  4. Find “ProtoCentral AFE4490 Pulse Oximeter Breakout Board” and click Install

Option 2: Manual Install from GitHub

  1. Go to github.com/Protocentral/protocentral-afe4490-arduino
  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 PPG Reading (Arduino Plotter)

Open the example sketch: File → Examples → ProtoCentral AFE4490 → ppg_streaming

Or create a new sketch with the following code, which streams the IR-channel PPG samples that you can view in the Arduino Serial Plotter:

#include 
#include "protocentral_afe4490.h"

#define AFE4490_CS_PIN    7
#define AFE4490_DRDY_PIN  2
#define AFE4490_START_PIN 5
#define AFE4490_PWDN_PIN  4

AFE4490 afe4490(AFE4490_CS_PIN, AFE4490_DRDY_PIN,
                AFE4490_START_PIN, AFE4490_PWDN_PIN);

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

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

void loop() {
    if (afe4490.isDataReady()) {
        afe4490.getPPGSamples();
        // Print as two columns for the Arduino Serial Plotter
        Serial.print(afe4490.red_data);
        Serial.print(',');
        Serial.println(afe4490.ir_data);
    }
}

What This Code Does

  1. Includes the librariesprotocentral_afe4490.h for the pulse-ox front-end and SPI.h for SPI bus communication
  2. Creates the AFE4490 object — bound to the chip-select, DRDY, START and PWDN pins
  3. Initialises the chipbegin() performs the SPI handshake, sets default LED currents and starts the conversion loop
  4. Polls DRDY — when DRDY goes low, the chip has new RED + IR samples ready
  5. Reads and prints both channelsred_data and ir_data are 22-bit signed integers; the Arduino Serial Plotter displays them as two traces (RED on top, IR below)

Using the Arduino Serial Plotter

  1. Upload the sketch to your Arduino
  2. Plug the SpO2 probe into the breakout’s DB9 connector
  3. Place your index or middle finger inside the clip with the nail facing up
  4. Open Tools → Serial Plotter at 57600 baud
  5. You should see two pulsatile waveforms — the IR channel will typically be larger; both rise and fall with each heartbeat

Computing SpO2

Open the example sketch: File → Examples → ProtoCentral AFE4490 → spo2_compute

#include 
#include "protocentral_afe4490.h"

#define AFE4490_CS_PIN    7
#define AFE4490_DRDY_PIN  2
#define AFE4490_START_PIN 5
#define AFE4490_PWDN_PIN  4

AFE4490 afe4490(AFE4490_CS_PIN, AFE4490_DRDY_PIN,
                AFE4490_START_PIN, AFE4490_PWDN_PIN);

void setup() {
    Serial.begin(115200);
    SPI.begin();
    afe4490.begin();
    afe4490.enableSpO2Computation();
}

void loop() {
    if (afe4490.isDataReady()) {
        afe4490.getPPGSamples();
        if (afe4490.spo2_valid) {
            Serial.print("SpO2: ");
            Serial.print(afe4490.spo2);
            Serial.print(" %    HR: ");
            Serial.print(afe4490.heart_rate);
            Serial.println(" BPM");
        }
    }
}

Open the Serial Monitor at 115200 baud — once the algorithm has ~5 seconds of clean data, you’ll see SpO2 (%) and heart rate (BPM) printed on each new beat.

Note: The library’s SpO2 algorithm uses the standard ratio-of-ratios approach with a calibration curve tuned for the supplied Nellcor-compatible probe. Different probes may need a different calibration curve.

Visualizing with OpenView

For a richer visualisation that shows both RED + IR PPG traces, computed SpO2, and heart rate together, 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 “AFE4490 breakout” from the Board dropdown
  4. Select the correct serial port and click Start
  5. You’ll see live PPG waveforms with running SpO2 and heart-rate readouts

Troubleshooting

No PPG signal / flat line

  • Check that the SpO2 probe is firmly plugged into the DB9 connector
  • Verify SPI wiring — MISO, MOSI, SCK, CS0, DRDY, START and PWDN must all be correctly connected
  • Ensure DRDY is on an interrupt-capable pin (D2 on Arduino Uno)
  • Make sure your finger is inserted past the distal joint and the clip is fully closed

Very noisy or jumpy PPG

  • Cold fingers reduce blood flow at the fingertip — warm your hand for ~30 seconds before testing
  • Remove nail polish (especially black, blue or brown shades) — it absorbs RED/IR strongly
  • Hold still during measurement; the AFE4490 has good ambient-light compensation but motion artefact is much harder to filter
  • Try a different finger — the index or middle finger of the non-dominant hand usually gives the cleanest signal

SpO2 reads strange values (e.g. 100% always or fluctuating wildly)

  • The algorithm needs ~5 seconds of clean PPG data to lock on; sit still and wait
  • Excessive ambient light through a translucent probe housing can saturate the photodiode — use the supplied opaque clip
  • Verify both RED and IR channels show a clean pulsatile waveform in the Serial Plotter before relying on the SpO2 number
  • Very low perfusion (cold fingers) gives unreliable readings — warm the hand and re-test

SPI communication errors / AFE4490 not found

  • Verify CS0 pin in the constructor matches your physical wiring (D7 on Arduino Uno)
  • For the Arduino shield v2, double-check the shield is fully seated on the headers
  • If using long jumper wires with the breakout, try reducing SPI clock speed
  • Make sure no other shield / SPI device is conflicting on the bus

Resources

Licenses

  • Hardware: CERN Open Hardware Licence v2 — Permissive (CERN-OHL-P v2)
  • Software: MIT License