Intermediate
3 hours
Arduino Pulse Oximeter and Heart Rate Monitor
The MAX30102 uses red and infrared LEDs to shine light through your fingertip and measure how much is absorbed by oxygenated vs deoxygenated haemoglobin — calculating both pulse rate and blood oxygen saturation (SpO2). This project pairs it with an OLED display for real-time readout. Note: for clinical use always use a certified medical device; this is for educational purposes.
What You’ll Need
- Arduino Nano or Uno
- MAX30102 pulse oximeter sensor module
- SSD1306 0.96″ OLED (I2C)
- Breadboard and jumper wires
- USB power
Step-by-Step Instructions
- Install library: Search for “MAX30105” by SparkFun in Library Manager. Install it along with “Adafruit SSD1306” and “Adafruit GFX”.
- Wire MAX30102: VIN → 3.3 V, GND → GND, SDA → A4, SCL → A5. The module also has INT pin — leave unconnected for now.
- Wire OLED: Share the same I2C bus (A4/A5), VCC → 3.3 V or 5 V.
- Use SparkFun example: Open File → Examples → SparkFun MAX3010x → Example6_SpO2. This example reads both HR and SpO2 using the built-in algorithm. Modify it to display results on the OLED instead of Serial.
- Display layout: OLED top half: large BPM number. Bottom half: SpO2 percentage. Add a small scrolling pulse waveform using raw IR values if space allows.
- Test: Place fingertip firmly (not pressing hard) over the sensor. Allow 5–10 seconds for reading to stabilise. Normal HR: 60–100 BPM. Normal SpO2: 95–100%.
Safety Notes
- This project is for educational purposes only — do not use it to make medical decisions.
- Keep fingers dry and still for accurate readings — movement causes motion artefacts.
Tips & Troubleshooting
- If readings show 0 BPM, ensure your finger covers both LEDs fully and the sensor window faces upward into your fingertip.
- Ambient light can interfere — shade the sensor and fingertip from bright light when taking readings.
- The MAX30102 runs hot during extended use — it’s normal and not harmful at these power levels.