DIY Pulse Oximeter using MAX30100 Module, Arduino Nano, MAX30100 Module, Bread Board, Connecting Wires, 10k Potentiometer, 560 ohm Resistor, 16x2 LCD Screen, Power Supply, Circuit Diagram

Let's get started with this innovative Arduino tutorial on how to build your own Pulse Oximeter. In this project, you will learn to interface a MAX30100 Pulse Oximeter Sensor to an Arduino to measure blood oxygen and heart rate and display the results on a 16x2 LCD display. SpO2 (blood oxygen concentration) is measured in percentage, and BPM (heart rate/pulse rate) is measured in beats per minute. This device is especially useful for people who need to monitor these parameters due to medical conditions like asthma or congestive heart failure. 


Components Required:


What is MAX30100 Module?

What is MAX30100 Module? , MAX30100


To detect pulse oximetry and heart rate signals, the MAX30100 chip incorporates two LEDs: red and infrared (IR), a photodetector, and low-noise signal processing. The absorption data for both IR and red light is stored in a 64-byte FIFO buffer.

It has two operating modes: heart rate only & heart rate and oxygen saturation only. 

In the heart rate mode, only the IR LED is activated, whereas in the dual mode, both the IR and red LEDs are activated. It also includes a low-pass filter with a frequency response of 60 hertz. While it can filter out power line noise, it does not take into account environmental noise or fluctuations. Red light and infrared light is transmitted through the finger by the LEDs, and the photodetector integrated within the chip detects the light absorption of the two distinct wavelengths. MAX30100 is used here for both oximetry and heart rate detection, allowing us to detect both heart rate and oxygen saturation at the same time.
As a result of having more blood, there is an increase in oxygenated blood when the heart pumps it. The volume of oxygenated blood decreases as the heart relaxes.
The pulse rate is calculated by measuring the time between the increase and decrease of oxygenated blood.
According to the findings, oxygenated blood absorbs more infrared light and passes more red light, whereas deoxygenated blood absorbs more red light and passes more infrared light.
The MAX30100's main function is to read the absorption levels for both light sources and store them in a buffer that can be read via I2C.The MAX30100 runs on 1.8V and 3.3V power supplies and can be powered down via software with negligible standby current, allowing the power supply to stay connected at all times. It's widely used in wearables, fitness assistants, and medical monitoring devices.

How to Interface 16x2 LCD with Arduino Uno ?

LCD modules are a critical component in many Arduino-based embedded systems. As a result, understanding how to attach an LCD module to an Arduino is crucial when designing embedded systems. Here you will learn how to connect an Arduino to a 16x2 LCD display. 

The JHD162A is a 16x2 LCD module based on Hitachi's HD44780 driver. The JHD162A has 16 pins and can be used in 4-bit or 8-bit mode (using only four data lines) or (using all 8 data lines) respectively. In this case, the LCD module is set to 4-bit mode.

Before going into the details of the project, let’s have a look at the JHD162A LCD module. The schematic of a JHD162A LCD pin diagram is given below.

How to Interface 16x2 LCD with Arduino Uno ?, 16x2 LCD



Pinout:

  • Pin1(Vss): Ground pin of the LCD module.
  • Pin2(Vcc): Power to LCD module (+5V supply is given to this pin)
  • Pin3(VEE): Contrast adjustment pin. This is done by connecting the ends of a 10K potentiometer to +5V and ground and then connecting the slider pin to the VEE pin. The voltage at the VEE pin defines the contrast. The normal setting is between 0.4 and 0.9V.
  • Pin4(RS): Register select pin. The JHD162A has two registers namely the command register and data register. Logic HIGH at RS pin selects data register and logic LOW at RS pin selects command register. If we make the RS pin HIGH and feed input to the data lines (DB0 to DB7), this input will be treated as data to display on the LCD screen. If we make the RS pin LOW and feed input to the data lines, then this will be treated as a command ( a command to be written to LCD controller – like positioning cursor or clear screen or scroll).
  • Pin5(R/W): Read/Write modes. This pin is used for selecting between read and write modes. Logic HIGH at this pin activates read mode and logic LOW at this pin activates write mode.
  • Pin6(E): This pin is meant for enabling the LCD module. A HIGH to LOW signal at this pin will enable the module.
  • Pin7(DB0) to Pin14(DB7):  These are data pins. The commands and data are fed to the LCD module through these pins.
  • Pin15(Backlight +): Anode of the backlight LED. When operated on 5V, a 560-ohm resistor should be connected in series to this pin. In Arduino-based projects, the backlight LED can be powered from the 3.3V source on the Arduino board.
  • Pin16(Backlight -): Cathode of the backlight LED.

Circuit Diagram

Circuit Diagram for connecting Arduino NANO, MAX30100, LCD using breadboard


After uploading the code, you can place your finger on the MAX30100 Sensor and open the serial monitor to see the values.

Arduino Code:

#include <LiquidCrystal.h>
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
 
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#define REPORTING_PERIOD_MS 1000
PulseOximeter pox;
uint32_t tsLastReport = 0;
void onBeatDetected()
{
    Serial.println("Beat!");
}
void setup()
{
    Serial.begin(115200);
    Serial.print("Initializing pulse oximeter..");
    lcd.begin(16,2);
    lcd.print("Initializing...");
    delay(3000);
    lcd.clear();
    // Initialize the PulseOximeter instance
    // Failures are generally due to an improper I2C wiring, missing power supply
    // or wrong target chip
    if (!pox.begin()) {
        Serial.println("FAILED");
        for(;;);
    } else {
        Serial.println("SUCCESS");
    }
  pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
    // Register a callback for the beat detection
    pox.setOnBeatDetectedCallback(onBeatDetected);
}
void loop()
{
    // Make sure to call update as fast as possible
    pox.update();
    if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
        Serial.print("Heart rate:");
        Serial.print(pox.getHeartRate());
        Serial.print("bpm / SpO2:");
        Serial.print(pox.getSpO2());
        Serial.println("%");
 
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("BPM : ");
        lcd.print(pox.getHeartRate());
        
        lcd.setCursor(0,1);
        lcd.print("SpO2: ");
        lcd.print(pox.getSpO2());
        lcd.print("%");
        tsLastReport = millis();
    }
}
ArduinoBpmDiyDiy kitDiy projectDiy projectsHeart rate monitorMax30100OximeterPulse oximeterSpo2

4 comments

Kapil Kumar

Kapil Kumar

@Nabab,
That’s Great Nabab

Kapil Kumar

Kapil Kumar

@Sukhdeo,
https://www.hnhcart.com/blogs/sensors-modules/a , here is the link, the blog on difference between Max30100 and Max30102 will clear your doubt.

Nabab

Nabab

I used this for personal purposes with Oled.

Sukhdeo

Sukhdeo

What is the difference between Max30100 and Max30102?

Leave a comment

All comments are moderated before being published