Table of Contents

Pulse Monitor System

Author: Ana-Maria Cretan
Master: AAC

Project description

The goal of this project is to create a real-time pulse and oxygen level monitor platform using an ESP32 board and MAX30100 sensor. The data provided by the sensor will be displayed in the Adafuit IO interface and interpreted either by a flag indicator or an email alert. The indicator aims to translate the values of the pulse and oxygen level into a simple good(green)/bad(red) lamp indication. If the registered values for the pulse monitor are out of the normal range, an e-mail alert will be sent to the user/user`s contacts.

Hardware implementation

In the hardware diagram we used the following components:

Hardware schematic:

Work flow

The implementation consists of three connections:

The main functionality of the code is displayed by the following diagram. The setup() function is executed first and is used to enable the wi-fi connection, connect to the MQTT client, and config the pulse sensor.

In the setup section of the code, the Wi-Fi connection is established, followed by the MQTT connection for the web application and the configuration of the pulse sensor. During the loop section, the connection to the MQTT client is checked first along with the switch state from the application. The data published to the web display can be stopped at any time (while connected) by turning the switch block off.

Software implementation

The code is developed using Arduino IDE,and the following libraries:

Library Description
stdint.h for intermediary variables and calculus
Wire.h for the pulse sensor connection
WiFi.h to establish the WiFi connection of the ESP32 board
Adafruit_MQTT.h used for connection with the web interface
Adafruit_MQTT_Client.h to establish the client connection for data publish
MAX30100_PulseOximeter.h for interfering with the pulse sensor

The sensor data read and the publish to the MQTT client are split into tasks.For the sensor read, we use update() from the Max30100 library and getHeartRate()/pox.getSpO2 to obtain the actual values. Before they are published we test if the recorded values are in the normal range:

    if (BPM == 0){                              //Asystole: flat linig
      BPMState_ns = "Asystole";
    }else if(BPM != 0 && BPM <= 40){            //Idioventricular Rhythm: Heart rate between 20 - 40 BPM
      BPMState_ns = "Idioventricular Rhythm";
    } else if(BPM > 40 && BPM <= 60){            //Junctional Escape Rhythm: Heart rate 40 - 60 BPM
      BPMState_ns = "Junctional Escape Rhythm";
    } else if(BPM > 60 && BPM <= 120){            //Normal: Heart rate 60 - 100 BPM
      BPMState_ns = "Normal";
    } else if(BPM >= 121){                       //Tachycardia: Heart rate >= 100  BPM
      BPMState_ns = "Tachycardia";
    };

* for the Oxigen level the interpretation is into the interface block
For the email alert we used the following format, including the medical term of the non regular range (BPMState_ps)

client.print(String("POST ") + URL + API_KEY + " HTTP/1.1\r\n" +
                         "Host: " + HOST + "\r\n" + 
                         "Content-Type: application/x-www-form-urlencoded\r\n" + 
                         "Content-Length: 13\r\n\r\n" +
                         "value1=" + BPMState_ps + "\r\n");
        }  

Source code link: GitHub Repo

Software Interface

The interface consists of four blocks:

Demo

In the video, we can see a normal reading of the sensor data and its interpretation, along with a simulation without the pulse sensor, using random data published to the interface. The random data simulation has only a testing purpose.

Resources