How can I change a code for Pulse Oximeter Max30100 to be compatible with Max30102?

I'm new in using arduino IDE and I have a code for Pulse Oximeter Max30100, NodeMCU ESP8266 and OLED screen, but I have Pulse Oximeter Max30102 -it was available is market- instead of Max30100.
When I changed the library, some members doesn't work.

this is the code:

#include <Wire.h>
//#include "MAX30100_PulseOximeter.h"  // this was the previous library
#include "MAX30102.h"           // this is the library I added instead of the above one 
#define  BLYNK_PRINT Serial
#include <Blynk.h>
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
 
#include "Wire.h"
#include "Adafruit_GFX.h"
#include "OakOLED.h"
 
#define REPORTING_PERIOD_MS 1000
OakOLED oled;
 
char auth[] = "Iewd2gc7QynNOsT_3ZMAnWo8sU9uffU9";             // You should get Auth Token in the Blynk App.
char ssid[] = "*****";                                     // Your WiFi credentials.
char pass[] = "*********";
 
   // Connections : SCL PIN - D1 , SDA PIN - D2 , INT PIN - D0
//PulseOximeter pox; // and this also was the original line for the next line 
MAX30102 pox;  // this is the line I've added
 
float BPM, SpO2;
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 Detected!");
    oled.drawBitmap( 60, 20, bitmap, 28, 28, 1);
    oled.display();
}

void setup() {
      Serial.begin(115200);
    oled.begin();
    oled.clearDisplay();
    oled.setTextSize(1);
    oled.setTextColor(1);
    oled.setCursor(0, 0);
 
    oled.println("Initializing pulse oximeter..");
    oled.display();
    
    pinMode(16, OUTPUT);
    Blynk.begin(auth, ssid, pass);
 
    Serial.print("Initializing Pulse Oximeter..");
 
    if (!pox.begin())
    {
      Serial.println("FAILED");
         oled.clearDisplay();
         oled.setTextSize(1);
         oled.setTextColor(1);
         oled.setCursor(0, 0);
         oled.println("FAILED");
         oled.display();
         for(;;);
    }
    else
    {
         oled.clearDisplay();
         oled.setTextSize(1);
         oled.setTextColor(1);
         oled.setCursor(0, 0);
         oled.println("SUCCESS");
         oled.display();
         Serial.println("SUCCESS");
         pox.setOnBeatDetectedCallback(onBeatDetected);
    }
}

void loop() {
  // put your main code here, to run repeatedly:
  
      pox.update();
    Blynk.run();
 
    BPM = pox.getHeartRate();
    SpO2 = pox.getSpO2();
    if (millis() - tsLastReport > REPORTING_PERIOD_MS)
    {
        Serial.print("Heart rate:");
        Serial.print(BPM);
        Serial.print(" bpm / SpO2:");
        Serial.print(SpO2);
        Serial.println(" %");
 
        Blynk.virtualWrite(V2, BPM);
        Blynk.virtualWrite(V3, SpO2);
        
        oled.clearDisplay();
        oled.setTextSize(1);
        oled.setTextColor(1);
        oled.setCursor(0,16);
        oled.println(pox.getHeartRate());
 
        oled.setTextSize(1);
        oled.setTextColor(1);
        oled.setCursor(0, 0);
        oled.println("Heart BPM");
 
        oled.setTextSize(1);
        oled.setTextColor(1);
        oled.setCursor(0, 30);
        oled.println("Spo2");
 
        oled.setTextSize(1);
        oled.setTextColor(1);
        oled.setCursor(0,45);
        oled.println(pox.getSpO2());
        oled.display();
 
        tsLastReport = millis();
    }

}

and the error appeared:

C:\Users\TOSHIBA\Desktop\Final Project\Doc\doc2\Final 2\Project code\sketch_jul25b_ma\sketch_jul25b_ma.ino: In function 'void setup()':
sketch_jul25b_ma:81:14: error: 'class MAX30102' has no member named 'setOnBeatDetectedCallback'
81 | pox.setOnBeatDetectedCallback(onBeatDetected);
| ^~~~~~~~~~~~~~~~~~~~~~~~~
C:\Users\TOSHIBA\Desktop\Final Project\Doc\doc2\Final 2\Project code\sketch_jul25b_ma\sketch_jul25b_ma.ino: In function 'void loop()':
sketch_jul25b_ma:88:11: error: 'class MAX30102' has no member named 'update'
88 | pox.update();
| ^~~~~~
sketch_jul25b_ma:91:15: error: 'class MAX30102' has no member named 'getHeartRate'
91 | BPM = pox.getHeartRate();
| ^~~~~~~~~~~~
sketch_jul25b_ma:92:16: error: 'class MAX30102' has no member named 'getSpO2'
92 | SpO2 = pox.getSpO2();
| ^~~~~~~
sketch_jul25b_ma:108:26: error: 'class MAX30102' has no member named 'getHeartRate'
108 | oled.println(pox.getHeartRate());
| ^~~~~~~~~~~~
sketch_jul25b_ma:123:26: error: 'class MAX30102' has no member named 'getSpO2'
123 | oled.println(pox.getSpO2());
| ^~~~~~~
exit status 1
'class MAX30102' has no member named 'setOnBeatDetectedCallback'

Please help me fixing this I have to fix it cause it's my graduation project
Please help me :pleading_face:

1 Like

From where did you get this library (link) ?
Where is the original library MAX30100_PulseOximeter.h (link) ?
Did you copy both parts (.h and .cpp files) into the same folder as your main program (sketch) ?
Do you know what the differences are between the two devices MAX30102 and MAX30100 are and is it possible that the MAX30100 library functions with the MAX30102 hardware ?

The MAX30100 library link is this:

and the MAX30102 library someone sent to me a zip file of it.
Processing: MAX30102Library.zip...

I don't know about (.h and .cpp files), but I added the libraries from ( include Library --> add .ZIP library).

I know there is difference in the two devices functions but I don't know what is it though :worried:

Can you attach the zip file to a post in this thread ? If the library is completely different to the one for the earlier version of the chip, it may be better to start with a simple example sketch from the new library (if there is one).

Usually, if a zip file has been installed via the library manager, then instead of the library being included in the program/sketch like this:

#include "MAX30102.h"

it is included like this:

#include <MAX30102.h> // note the chevrons!

However, you did not appear to get an error message that the library is missing so something is odd here because the quote format (") is used when the library is in the sketch folder.

I don't know how to post the .zip file, but the one sent me the .zip file downloaded it from this YouTube video:

there is a link in the description of this video to download the library and code of his project.

Processing: 30102 library .zip...

when I tried to attach the file, it says "sorry new users can not upload attachment" :frowning:

what to do?

There appears to be a lot of Arduino projects using either the MAX30102 or MAX30100 device.
Can you find (technical) data sheets for both devices and post a link.

You will probably have most success following a complete project which uses the MAX30102 which you have purchased. In any case, to get familaiar with the device, you should start with something which works, even if it does not offer all the functionality you appear to want (integration with Blynk, graphic screen etc.). Then work out a strategy for adding the missing functionality

You may have difficulties if you try to mix an application written for a MAX30100 with a library for a MAX30102 as you have experienced.

If the differences between the 2 devices are not large, you may be able to alter the MAX30100 Library to work with the MAX30102 such that you can use a ready written MAX30100 application with the MAX30102 device.

I'm not sure when a new user here gains the ability to post files on this forum. Probably after a few posts and maybe the passage of a few days. Hopefully users get an information message which makes the rules clear.

I found these links:

for max30100

for max30102

For those who do not want to suffer the horror of grinding through alldatasheet.com "exploded format" data sheet:
https://datasheets.maximintegrated.com/en/ds/MAX30100.pdf
https://datasheets.maximintegrated.com/en/ds/MAX30102.pdf

Tip: manufacturers' data sheets are always preferable

When you want to get the heart rate and oxygen saturation reading with max 30100 they write this

pox.getHeartRate() \\ for getting heart rate
pox.getSpO2() \\ for getting oxygen saturation

but I want to know what is the function for Max30102

This looks like the github repository for the MAX30100 code which you have found.

This looks like the github repository for the MAX30102 code which you have found.

It does appear that the MAX30100 library has a much clearer structure than the MAX30102 library.
There is a sample code: Arduino-MAX30100/MAX30100_Minimal.ino at master · oxullo/Arduino-MAX30100 · GitHub
which gets exactly what you require:

pox.getHeartRate() \\ for getting heart rate
pox.getSpO2() \\ for getting oxygen saturation

In the MAX30102 library there are no such clear methods for directly obtaining these parameters. The sample sketch nanoPulsePPG.ino, which uses the library, is also not well structured mixing display logic with data indirectly obtained and processed from the MAX30102.

From your examination of the MAX30102 video, does it appear that the data you want is displayed somehow ? If it is there, I will attempt to see how you could extract it.

Which breakout board for the MAX30102 have you purchased (link)?

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.