Introduction: Arduino Pulse Oximeter Using MAX30100

This project outlines how to create a bluetooth pulse oximeter using a bluno nano and the MAX 30100 IC chip.

Step 1: Supplies

Supply List:

Computer with Aurduino Software

1 Bluno Nano (Any Arduino micro-controller with enough pins and 5v logic can be used) [$33.55]

1 BLE Link (Not needed for another micro-controller or if bluetooth is not being used) [$7.95]

1 Cable to connect micro-controller to computer (Bluno Nano uses micro USB) [About $5]

1 9v Battery (for a portable power source) [About $6]

1 9v Battery Clip (for a portable power source) [$1.95]

1 Switch (to allow for the portable power source to be turned on and off) [$1.50]

1 MAX 30100 PCB Breakout Board [$20.89]

1 Wilson Armband [$4.42]

1 Soldering Iron and Solder

About 5 feet of Wire

Needle and thread


For the housing, a 3D print can be used to print both a holder for a 9v battery and a housing for the device which can then be sewn onto a sweat armband to allow for more portability of the device.

Also for an easier to use user interface LabView 2015 SP1 was used to interface with the device over bluetooth, however, the Arduino program can also be used to view the serial port.

Step 2: Housing

A 9v battery holder from Thingiverse user circuito. This was sewn onto the underside of the armband using the holes on the four sides of the part. In order to house the micro-controller a custom part was designed using TinkerCAD to fit the Bluno Nano and switch with ports allowing the wires to the battery and MAX 30100 breakout board to exit. Depending on the resolution of the 3D printer used, the lids top edges may need to be sanded down to accommodate some drooping from printing the overhang above the slot for the lid.

9v Battery Holder:

Custom Housing: See attached .stl file

Step 3: Programming


This project utilizes the Arduino-MAX30100 oximetry / heart rate integrated sensor library by OXullo Intersecans for I2C and MAX interfacing.

The micro-controller monitors for input from LabView (a "b" for Heart Rate mode and an "a" for SPO2 mode). The program modifies the MAX mode (HRONLY for IR, SPO2_HR for IR/Red) by utilizing the library to write to the specific registers storing the settings bytes.

After processing the raw IR values with a 1st order low-pass Butterworth (included in library) and an algorithm to remove DC components (included in library), another beat-detector algorithm (included in library) provides a HR value.

Similarly, processed IR and Red values are used for the SPO2 calculation as follows:


SPO2=115-25*R (The 115 was changed from a default of 110 to properly calibrate our sensor)

A 25-value running average is applied to the processed values before writing to serial.

There is a delay of 1000ms to allow for stable communication with LabView and to allow time to detect a mode change.

The code was verified and uploaded with the Arduino software using a micro-USB cable.


The VISA interface was used to read and write to the serial port. Serial write is used to write the value corresponding to the position of the switch on the VI. Serial read is then used to read the value which is output by the micro-controller. This value is then displayed on the front panel along with the current mode.

Step 4: Soldering

Soldering the MAX 30100 Breakout Board

On the underside of the MAX 30100 PCB there are five contacts, four of which need to be utilized. At least one foot of wire should be soldered to the Vcc, Serial Data Line (SDL), Serial Clock Line (SCL), and Ground (GND).

Soldering MAX 30100 PCB to Bluno Nano

The four wires from the MAX 30100 should be threaded through the forward facing port on the custom housing. Since these were being soldered onto header pins, pliers were used to bend the wire ends into loops which could easily be soldered to the pins.

Pin Mapping
MAX30100 VCC to Bluno +5V

MAX30100 GND to Bluno GND

MAX30100 SCL to Bluno A5

MAX30100 SDL to Bluno A4

Soldering Battery clip and Switch

The positive terminal wire from the battery clip was threaded through the side port of the housing and soldered to one of the side terminals of the switch. A wire was then soldered from the middle terminal to the Vin pin on the micro-controller. The negative terminal of the battery clip was also threaded through the side port and then soldered directly to the GND pin of the micro-controller.

Pin Mapping
9V (+) to Bluno VIN

9V (-) to Bluno GND

Step 5: Operation

Fixing device to arm:

Slide armband onto wrist with the MAX 30100 PCB protruding towards the fingers. Then using the velcro strap which came with the MAX 30100 PCB, secure the PCB to the index finger to hold the MAX 30100 chip in the center of the finger as shown.

Turning device on and ensuring a connection:

Ensure the battery clip is attached to the battery and then flip the switch to connect the terminals to the micro-controller. Next, if bluetooth is being used connect the BLE Link to the computer. If bluetooth is not being used, connect the micro-controller to the computer using a USB cable. Wait until the link light is lit on both the Bluno and BLE Link.

If Ardiuno is being used:

Click on the Serial Monitor icon in the upper right hand corner of the code window. Initially, heart rate data wil be displayed. In order to switch to SpO2 mode, click in the input box on top of the Serial Monitor and type b and click send. To switch back to HR mode, type a and then click send.

If LabView is being used:

Open NIMAX, click on devices and select the micro-controller. Then select the VISA test panel and go to the Input/Output tab. Using this tab, write b to in the Slect of Enter Command box and click Write to write to the serial port. After that make sure that LabView can read from the device by clicking read. Then close NIMAX and open the VI attached. Go to the block diagram and ensure the COM port selected is the correct one. Navigate back to the Front Panel and click the white arrow to run the VI. If a timeout error is received, simply click continue. Now flipping the switch will change the device into the mode shown by the two on screen LEDs. In order to end to program, click the stop button.