0% found this document useful (0 votes)
21 views3 pages

1 1125537458

Uploaded by

Tita Fifi
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
21 views3 pages

1 1125537458

Uploaded by

Tita Fifi
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 3

/*

Hardware Connections (Breakoutboard to Arduino):


-5V = 5V (3.3V is allowed)
-GND = GND
-SDA = A4 (or SDA)
-SCL = A5 (or SCL)
-INT = Not connected

The MAX30105 Breakout can handle 5V or 3.3V I2C logic. We recommend powering the
board with 5V
but it will also run at 3.3V.
*/

#include <Wire.h>
#include "MAX30105.h"
#include "spo2_algorithm.h"
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"

MAX30105 particleSensor;
SSD1306AsciiWire oled;

#define MAX_BRIGHTNESS 255

#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)


//Arduino Uno doesn't have enough SRAM to store 50 samples of IR led data and red
led data in 32-bit format
//To solve this problem, 16-bit MSB of the sampled data will be truncated. Samples
become 16-bit data.
uint16_t irBuffer[50]; //infrared LED sensor data
uint16_t redBuffer[50]; //red LED sensor data
#else
uint32_t irBuffer[50]; //infrared LED sensor data
uint32_t redBuffer[50]; //red LED sensor data
#endif

int32_t spo2; //SPO2 value


int8_t validSPO2; //indicator to show if the SPO2 calculation is valid
int32_t heartRate; //heart rate value
int8_t validHeartRate; //indicator to show if the heart rate calculation is valid

void setup()
{
Serial.begin(115200); // initialize serial communication at 115200 bits per
second:

oled.begin(&Adafruit128x64, 0x3C);
oled.setFont(Arial14);

// Initialize sensor
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz
speed
{
Serial.println(F("MAX30105 was not found. Please check wiring/power."));
while (1);
}

particleSensor.setup(55, 4, 2, 200, 411, 4096); //Configure sensor with these


settings
}

void loop()
{

//read the first 50 samples, and determine the signal range


for (byte i = 0 ; i < 50 ; i++)
{
while (particleSensor.available() == false) //do we have new data?
particleSensor.check(); //Check the sensor for new data

redBuffer[i] = particleSensor.getRed();
irBuffer[i] = particleSensor.getIR();
particleSensor.nextSample(); //We're finished with this sample so move to next
sample
Serial.print(F("red="));
Serial.print(redBuffer[i], DEC);
Serial.print(F(", ir="));
Serial.println(irBuffer[i], DEC);
}

//calculate heart rate and SpO2 after first 50 samples (first 4 seconds of
samples)
maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2,
&validSPO2, &heartRate, &validHeartRate);

//Continuously taking samples from MAX30102. Heart rate and SpO2 are calculated
every 1 second
while (1)
{
//dumping the first 25 sets of samples in the memory and shift the last 25 sets
of samples to the top
for (byte i = 25; i < 50; i++)
{
redBuffer[i - 25] = redBuffer[i];
irBuffer[i - 25] = irBuffer[i];
}

//take 25 sets of samples before calculating the heart rate.


for (byte i = 25; i < 50; i++)
{
while (particleSensor.available() == false) //do we have new data?
particleSensor.check(); //Check the sensor for new data

redBuffer[i] = particleSensor.getRed();
irBuffer[i] = particleSensor.getIR();
particleSensor.nextSample(); //We're finished with this sample so move to
next sample
Serial.print(F("red="));
Serial.print(redBuffer[i], DEC);
Serial.print(F(", ir="));
Serial.print(irBuffer[i], DEC);

Serial.print(F(", HR="));
Serial.print(heartRate, DEC);

Serial.print(F(", HRvalid="));
Serial.print(validHeartRate, DEC);
Serial.print(F(", SPO2="));
Serial.print(spo2, DEC);

Serial.print(F(", SPO2Valid="));
Serial.println(validSPO2, DEC);

//After gathering 25 new samples recalculate HR and SP02


maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2,
&validSPO2, &heartRate, &validHeartRate);
printToScreen();
}
}

void printToScreen() {
oled.clear();
oled.setCursor(0,0);
if(validSPO2 && validHeartRate) {
oled.print(F("HR: ")); oled.println(heartRate, DEC);
oled.print(F("SPO2: ")); oled.println(spo2, DEC);
} else {
oled.print(F("Not valid"));
}
}

You might also like