Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CAN MAX30102 DO THE SPO2, HEARTBEAT AND TEMPERATURE AT THE SAME TIME? #33

Open
uyennguyen130599 opened this issue Mar 17, 2021 · 3 comments

Comments

@uyennguyen130599
Copy link

I'm doing a project with MAX30102 to detect SPO2, heartbeat and temperature at the same time. In the example of lib if I run it separately it will run as normal, but when I combine that two example, the heartbeat always 0. Can anyone help me with this?
Here is the code:

#include <Wire.h>
#include "MAX30105.h"
#include "heartRate.h"

MAX30105 particleSensor;

const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good.
byte rates[RATE_SIZE]; //Array of heart rates
byte rateSpot = 0;
long lastBeat = 0; //Time at which the last beat occurred

float beatsPerMinute;
int beatAvg;
float temperature;

void setup()
{
Serial.begin(115200);
Serial.println("Initializing...");

// Initialize sensor
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed
{
    Serial.println("MAX30105 was not found. Please check wiring/power. ");
    while (1)
        ;
}
Serial.println("Place your index finger on the sensor with steady pressure.");

particleSensor.setup();                    //Configure sensor with default settings
particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running
particleSensor.setPulseAmplitudeGreen(0);  //Turn off Green LED

}

void loop()
{
temperature = particleSensor.readTemperature();
long irValue = particleSensor.getIR();

if (checkForBeat(irValue) == true)
{
    //We sensed a beat!
    long delta = millis() - lastBeat;
    lastBeat = millis();

    beatsPerMinute = 60 / (delta / 1000.0);

    if (beatsPerMinute < 255 && beatsPerMinute > 20)
    {
        rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array
        rateSpot %= RATE_SIZE;                    //Wrap variable

        //Take average of readings
        beatAvg = 0;
        for (byte x = 0; x < RATE_SIZE; x++)
            beatAvg += rates[x];
        beatAvg /= RATE_SIZE;
        
    }
}

Serial.print("IR=");
Serial.print(irValue);
Serial.print(", BPM=");
Serial.print(beatsPerMinute);
Serial.print(", Avg BPM=");
Serial.print(beatAvg);

Serial.print(", temperatureC=");
Serial.print(temperature);

if (irValue < 50000)
    Serial.print(" No finger?");

Serial.println();

}

@tusharshawarma
Copy link

Hi, I got this code for measuring bpm and spO2 at the same time from some youtube channel. Hope it helps you! :)
Link- https://www.youtube.com/watch?v=8SOTsR1k8-g&ab_channel=HowToElectronics
``
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"

#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..");

// 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("%");

    tsLastReport = millis();
}

}

@Okayler
Copy link

Okayler commented Oct 4, 2023

@tusharshawarma it doesnt helped. Because it was asked to read hearrate + temperature rate at the same time.... You had gave an example for heartrate + SPo2 readings ....

@luoyanpei
Copy link

I'm doing a project with MAX30102 to detect SPO2, heartbeat and temperature at the same time. In the example of lib if I run it separately it will run as normal, but when I combine that two example, the heartbeat always 0. Can anyone help me with this? Here is the code:

#include <Wire.h> #include "MAX30105.h" #include "heartRate.h"

MAX30105 particleSensor;

const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good. byte rates[RATE_SIZE]; //Array of heart rates byte rateSpot = 0; long lastBeat = 0; //Time at which the last beat occurred

float beatsPerMinute; int beatAvg; float temperature;

void setup() { Serial.begin(115200); Serial.println("Initializing...");

// Initialize sensor
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed
{
    Serial.println("MAX30105 was not found. Please check wiring/power. ");
    while (1)
        ;
}
Serial.println("Place your index finger on the sensor with steady pressure.");

particleSensor.setup();                    //Configure sensor with default settings
particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running
particleSensor.setPulseAmplitudeGreen(0);  //Turn off Green LED

}

void loop() { temperature = particleSensor.readTemperature(); long irValue = particleSensor.getIR();

if (checkForBeat(irValue) == true)
{
    //We sensed a beat!
    long delta = millis() - lastBeat;
    lastBeat = millis();

    beatsPerMinute = 60 / (delta / 1000.0);

    if (beatsPerMinute < 255 && beatsPerMinute > 20)
    {
        rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array
        rateSpot %= RATE_SIZE;                    //Wrap variable

        //Take average of readings
        beatAvg = 0;
        for (byte x = 0; x < RATE_SIZE; x++)
            beatAvg += rates[x];
        beatAvg /= RATE_SIZE;
        
    }
}

Serial.print("IR=");
Serial.print(irValue);
Serial.print(", BPM=");
Serial.print(beatsPerMinute);
Serial.print(", Avg BPM=");
Serial.print(beatAvg);

Serial.print(", temperature

I'm doing a project with MAX30102 to detect SPO2, heartbeat and temperature at the same time. In the example of lib if I run it separately it will run as normal, but when I combine that two example, the heartbeat always 0. Can anyone help me with this? Here is the code:

#include <Wire.h> #include "MAX30105.h" #include "heartRate.h"

MAX30105 particleSensor;

const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good. byte rates[RATE_SIZE]; //Array of heart rates byte rateSpot = 0; long lastBeat = 0; //Time at which the last beat occurred

float beatsPerMinute; int beatAvg; float temperature;

void setup() { Serial.begin(115200); Serial.println("Initializing...");

// Initialize sensor
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed
{
    Serial.println("MAX30105 was not found. Please check wiring/power. ");
    while (1)
        ;
}
Serial.println("Place your index finger on the sensor with steady pressure.");

particleSensor.setup();                    //Configure sensor with default settings
particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running
particleSensor.setPulseAmplitudeGreen(0);  //Turn off Green LED

}

void loop() { temperature = particleSensor.readTemperature(); long irValue = particleSensor.getIR();

if (checkForBeat(irValue) == true)
{
    //We sensed a beat!
    long delta = millis() - lastBeat;
    lastBeat = millis();

    beatsPerMinute = 60 / (delta / 1000.0);

    if (beatsPerMinute < 255 && beatsPerMinute > 20)
    {
        rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array
        rateSpot %= RATE_SIZE;                    //Wrap variable

        //Take average of readings
        beatAvg = 0;
        for (byte x = 0; x < RATE_SIZE; x++)
            beatAvg += rates[x];
        beatAvg /= RATE_SIZE;
        
    }
}

Serial.print("IR=");
Serial.print(irValue);
Serial.print(", BPM=");
Serial.print(beatsPerMinute);
Serial.print(", Avg BPM=");
Serial.print(beatAvg);

Serial.print(", temperatureC=");
Serial.print(temperature);

if (irValue < 50000)
    Serial.print(" No finger?");

Serial.println();

}

I can help you to solve this qusetion.
In the source code, the author calculates the BPM from the time difference of the board. So maybe you wrote the delay() function in your code, which caused the board time difference to be too large, and the pulse was a weak signal, so it approximated the BPM to 0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants