1. Introduction
A Portable Pulse Oximeter using Arduino is a compact device used to measure:
- Blood Oxygen Saturation (SpO₂)
- Heart Rate (BPM)
It works using a MAX30100/MAX30102 sensor, which emits red and infrared light through the fingertip and measures absorption changes due to blood flow.
This project is ideal for:
- Biomedical electronics learning
- IoT healthcare projects
- Student demonstrations
2. Components
- Arduino Nano / Uno
- MAX30100 or MAX30102 Pulse Oximeter Sensor
- OLED Display (SSD1306 I2C, 128x64)
- Lithium-ion Battery (3.7V)
- TP4056 Charging Module
- MT3608 Boost Converter
- Connecting wires
- Breadboard / PCB
3. Circuit and Connections
| Arduino Nano Pinout Diagram |
| Pinout Diagram MAX30102 Sensor |
| Pinout Diagram of OLED Display SSD1306 |
| TP4056 Pinout Diagram |
🔹 MAX30102 Sensor → Arduino
- VCC → 3.3V
- GND → GND
- SDA → A4
- SCL → A5
🔹 OLED Display → Arduino
- VCC → 5V
- GND → GND
- SDA → A4
- SCL → A5
👉 Both devices use I2C communication, so they share the same SDA and SCL pins.
🔹 Power Section
- Battery → TP4056
- TP4056 → Boost Converter
- Boost Converter → Arduino VIN (5V)
4. Detailed Step By Step Circuit Working
- When power is supplied, Arduino initializes the sensor and OLED display.
- The MAX30102 emits red and infrared light into the finger.
- Blood absorbs light differently based on oxygen level.
- The photodetector captures reflected light signals.
- Sensor converts signals into digital values via I2C.
- Arduino processes the data using an algorithm.
- Heartbeat is detected from waveform peaks → BPM calculated.
- Ratio of red/IR signals → SpO₂ calculated.
- Results are displayed on OLED screen in real time.
5. Libraries to be Included
Install from Arduino Library Manager:
- Adafruit GFX
- Adafruit SSD1306
- MAX30100lib or SparkFun MAX3010x
6. Code
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
PulseOximeter pox;
uint32_t tsLastReport = 0;
void setup()
{
Serial.begin(9600);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED failed");
for(;;);
}
display.clearDisplay();
if (!pox.begin()) {
Serial.println("Sensor failed");
for(;;);
}
pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
}
void loop()
{
pox.update();
if (millis() - tsLastReport > 1000) {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print("BPM:");
display.println(pox.getHeartRate());
display.setCursor(0,30);
display.print("SpO2:");
display.print(pox.getSpO2());
display.println("%");
display.display();
tsLastReport = millis();
}
}
7. Detailed Step By Step Code Working
-
#include <Wire.h>→ Enables I2C communication -
MAX30100_PulseOximeter.h→ Sensor control library - OLED libraries → Display control
Setup Function
- Initializes OLED display
- Starts pulse oximeter sensor
- Sets LED current for stable readings
Loop Function
-
pox.update()→ Continuously reads sensor data -
Every 1 second:
- Clears display
-
Reads BPM using
getHeartRate() -
Reads SpO₂ using
getSpO2() - Displays results
8. Tips
- Keep finger steady for accurate readings
- Use 3.3V for MAX30102 (very important)
- Avoid bright external light interference
- Ensure proper finger placement
- Use filtering if readings fluctuate
9. Uses
- Health monitoring systems
- Fitness tracking devices
- Biomedical projects
- Remote patient monitoring
- IoT healthcare applications
10. Conclusion
This Arduino-based Portable Pulse Oximeter is a powerful project combining sensor technology, signal processing, and display interfacing. It is compact, low-cost, and highly useful for educational and prototype healthcare applications.
You can further enhance it by adding:
- Bluetooth/WiFi connectivity
- Data logging (SD card)
- Alert systems for abnormal readings