Heart Rate & Spo2 Monitor System Using MAX30100 & NodeMCU ESP8266.

Heart Rate & Spo2 Monitor System Using MAX30100 & NodeMCU ESP8266.

In this project we will build a device that can measure Blood Oxygen Concentration & Heart Rate using MAX30100 Pulse Oximeter & NodeMCU. The blood Oxygen Concentration termed as SpO2 is measured in Percentage and Heart Beat/Pulse Rate is measured in BPM. The MAX30100 is a Pulse Oximetry and heart rate monitor sensor solution.We will display the SpO2 and BPM value in 0.96″ OLED Display. With each beat, the display value is changed in the OLED screen. 

BPM are the “beats per minute” and they are around 65-75 while resting for a normal person, 

athletics may have lower than that, and the SpO2 is the Oxygen saturation level, and for a normal person it’s above 95%.

Components Requried.

Schematics.

Connect the NodeMCU , OLED display & MAX30100 module as shown in the schematic below.

Prototype PCB.

I want to turn my breadboard circuits into real boards and make my project look more professional, so I decided to Design my own coustom PCB for this project.

Designing the PCB

To design the circuit and PCB, we used EasyEDA which is a browser based software to design PCBs.

Designing the circuit works like in any other circuit software tool, you place some components and you wire them together. Then, you assign each component to a footprint.

Having the parts assigned, place each component. When you’re happy with the layout, make all the connections and route your PCB.

Save your project and export the Gerber files.

Ordering the PCBs at PCBWay.

This project is sponsored by PCBWay. PCBWay is a full feature Printed Circuit Board manufacturing service.

Turn your DIY breadboard circuits into professional PCBs – get 10 boards for approximately $5 + shipping (which will vary depending on your country).

Once you have your Gerber files, you can order the PCB. Follow the next steps.

1. Download the Gerber files – click here to download the .zip file.

2. Go to PCBWay website and open the PCB Instant Quote page. 

3. PCBWay can grab all the PCB details and automatically fills them for you. Use the “Quick-order PCB (Autofill parameters)”.

4. Press the “+ Add Gerber file” button to upload the provided Gerber files.

After approximately one week using the DHL shipping method, I received the PCBs at my place.As usual, everything comes well packed, and the PCBs are really high-quality. 

The letters on the silkscreen are really well-printed and easy to read. Additionally, the solder sticks easily to the pads.

PCBWay Year End Big Sale and Christmas Shopping Festival 2021.

PCBWay are now offering different sales offers and coupons at Christmas Festival 2021. I hope you will not miss the opportunity and avail of these offers as soon as possible. Since limited days are remaining. 

So let’s get started with PCBWay Year End Big Sale & Christmas Shopping Festival 2021.

The PCBWay is PCB producing company based in China and offers numerous services such as PCB with different types such as single layer PCB, double Layer PCB, multilayer PCB, etc, with that PCB prototyping services and PCBA.

Now regard Christmas they are providing different offers through using them you can get Free Christmas Coupons and Up to 52% Off for 3D Printing & CNC Machining.

Special Sales in PCBWay Store!

PCBWay has providing special sales in their store, using them you can get Up to 50% Off on different electronic modules like ESP32, ARDUINO BOARDS , IPS touch screen display, Robotic Arm etc

Lucky Draw.

With all these offers here & Coupons, One lucky draw is also conducted. To take part in this lucky draw the last date is December 31, 2021.

                                                            Rules.

1.Each PCBWayer (who had PCBWay shopping experience before) has TWO chances to draw the lottery. And ONE extra chance will be given if you place any order during December.

2.The beans would be automatically added into your account. You can use it to redeem modules in PCBWay store.

3.If you have any questions about how to redeem modules, please contact anson@pcbway.com.

Code.

Copy the following code to your Arduino IDE and upload it to your Arduino board.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "MAX30100_PulseOximeter.h"
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define NUMFLAKES     10 // Number of snowflakes in the animation example

#define LOGO_HEIGHT   16
#define LOGO_WIDTH    16
#define REPORTING_PERIOD_MS 1000
PulseOximeter pox;
 
uint32_t tsLastReport = 0;
 
const unsigned char bitmap [] PROGMEM=
{
0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x18, 0x00, 0x0f, 0xe0, 0x7f, 0x00, 0x3f, 0xf9, 0xff, 0xc0,
0x7f, 0xf9, 0xff, 0xc0, 0x7f, 0xff, 0xff, 0xe0, 0x7f, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xf0,
0xff, 0xf7, 0xff, 0xf0, 0xff, 0xe7, 0xff, 0xf0, 0xff, 0xe7, 0xff, 0xf0, 0x7f, 0xdb, 0xff, 0xe0,
0x7f, 0x9b, 0xff, 0xe0, 0x00, 0x3b, 0xc0, 0x00, 0x3f, 0xf9, 0x9f, 0xc0, 0x3f, 0xfd, 0xbf, 0xc0,
0x1f, 0xfd, 0xbf, 0x80, 0x0f, 0xfd, 0x7f, 0x00, 0x07, 0xfe, 0x7e, 0x00, 0x03, 0xfe, 0xfc, 0x00,
0x01, 0xff, 0xf8, 0x00, 0x00, 0xff, 0xf0, 0x00, 0x00, 0x7f, 0xe0, 0x00, 0x00, 0x3f, 0xc0, 0x00,
0x00, 0x0f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
void onBeatDetected()
{
  Serial.println("Beat!");
  display.drawBitmap( 60, 20, bitmap, 28, 28, 1);
  display.display();
}
void setup() {
  Serial.begin(9600);

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

  // Show initial display buffer contents on the screen --
  // the library initializes this with an Adafruit splash screen.
  display.display();
  delay(2000); // Pause for 2 seconds

  // Clear the buffer
  display.clearDisplay();
  
  display.setTextSize(1);
  display.setTextColor(1);
  display.setCursor(0, 0);
 
  display.println("Initializing pulse oximeter..");
   display.display();
  Serial.print("Initializing pulse oximeter..");
 
  if (!pox.begin()) {
  Serial.println("FAILED");
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(1);
  display.setCursor(0, 0);
  display.println("FAILED");
  display.display();
  for(;;);
  } else {
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(1);
  display.setCursor(0, 0);
  display.println("SUCCESS");
  display.display();
  Serial.println("SUCCESS");
  }
  pox.setOnBeatDetectedCallback(onBeatDetected); 
}

void loop() {
  pox.update();
 
    if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
  Serial.print("Heart BPM:");
  Serial.print(pox.getHeartRate());
  Serial.print("-----");
  Serial.print("Oxygen Percent:");
  Serial.print(pox.getSpO2());
  Serial.println("\n");
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(1);
  display.setCursor(0,16);
  display.println(pox.getHeartRate());
 
  display.setTextSize(1);
  display.setTextColor(1);
  display.setCursor(0, 0);
  display.println("Heart BPM");
 
  display.setTextSize(1);
  display.setTextColor(1);
  display.setCursor(0, 30);
  display.println("Spo2");
 
  display.setTextSize(1);
  display.setTextColor(1);
  display.setCursor(0,45);
  display.println(pox.getSpO2());
  display.display();
tsLastReport = millis();
}
}

Video Tutorial.

Thank you for Reading!!

Leave a Reply

Your email address will not be published.