SparkFun_MAX3010x_Sensor_Library icon indicating copy to clipboard operation
SparkFun_MAX3010x_Sensor_Library copied to clipboard

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

Open uyennguyen130599 opened this issue 3 years ago • 3 comments

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();

}

uyennguyen130599 avatar Mar 17 '21 13:03 uyennguyen130599

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();
}

}

tusharshawarma avatar Mar 22 '22 17:03 tusharshawarma