Соединяем монитор частоты сердечных сокращений max30100 с Ардуино

В этом проекте мы будем использовать MAX30100 и Arduino для считывания частоты сердечных сокращений или пульсовой оксиметрии.

Что такое MAX30100

MAX30100 представляет собой интегрированную пульсоксиметрию и датчик для измерения сердечного ритма. Он сочетает в себе два светодиода, фотоприемник, оптимизированную оптику и малошумную аналоговую обработку сигналов для обнаружения пульсовой оксиметрии и сигналов сердечного ритма.

MAX30100 работает от источников питания 1,8 В и 3,3 В и может быть отключен через программное обеспечение с незначительным током в режиме ожидания, что позволяет вернуться к постоянному подключению к источнику питания.

Характеристики MAX30100

  • Потребляет очень низкую мощность (работает от 1,8 В и 3,3 В)
  • Ультранизкий ток выключения (0,7 мкА)
  • Возможность быстрого вывода данных
  • Полный импульсный оксиметр и датчик сердечного ритма
  • Интегрированные светодиоды, фотодатчик и высокопроизводительный аналоговый интерфейс
  • Маленькая (5.6мм x 2.8мм x 1.2мм) 14-контактная оптически улучшенная система в упаковке
  • Работа с ультранизким энергопотреблением увеличивает срок службы батареи
  • Программируемая частота дискретизации и светодиодный ток для экономии электроэнергии
  • Улучшенная функциональность повышает производительность измерений

Требуемые компоненты для проекта

Для нашего проекта нужно совсем немного деталей:

  • Плата Arduino
  • MAX301001 монитор частоты сердечных сокращений
  • Провода перемычки
  • Макетная плата

Схема подключения

Итак, переходим к принципиальной схема соединения Ардуино и max30100 монитора частоты сердечных сокращений. Воспользуйтесь картинкой выше.

Arduino → MAX30100
3V3 → VIN
GND → GND
A4 → SDA
A5 → SCL

Код для Ардуино и MAX30100

Для того чтобы всё полноценно работало нужно ниже скачать и установить библиотеку для монитора и скетч для Ардуино, который вы можете скопировать или скачать .ino файл.

#include <MAX30100.h>
#include <MAX30100_BeatDetector.h>
#include <MAX30100_Filters.h>
#include <MAX30100_PulseOximeter.h>
#include <MAX30100_Registers.h>
#include <MAX30100_SpO2Calculator.h>
#include <Wire.h>

#define REPORTING_PERIOD_MS     500

PulseOximeter pox;

const int numReadings=10;
float filterweight=0.5;
uint32_t tsLastReport = 0;
uint32_t last_beat=0;
int readIndex=0;
int average_beat=0;
int average_SpO2=0;
bool calculation_complete=false;
bool calculating=false;
bool initialized=false;
byte beat=0;


void onBeatDetected() //Calls back when pulse is detected
{
  viewBeat();
  last_beat=millis();
}

void viewBeat() 
{

  if (beat==0) {
   Serial.print("_");
    beat=1;
  } 
  else
  {
   Serial.print("^");
    beat=0;
  }
}

void initial_display() 
{
  if (not initialized) 
  {
    viewBeat();
  Serial.print(" MAX30100 Pulse Oximeter Test");
  Serial.println("******************************************");
    Serial.println("Place place your finger on the sensor");
  Serial.println("********************************************");  
    initialized=true;
  }
}

void display_calculating(int j){

  viewBeat();
  Serial.println("Measuring"); 
  for (int i=0;i<=j;i++) {
    Serial.print(". ");
  }
}

void display_values()
{
  Serial.print(average_beat);
  Serial.print("| Bpm ");
  Serial.print("| SpO2 ");
  Serial.print(average_SpO2);
  Serial.print("%"); 
}

void calculate_average(int beat, int SpO2) 
{
  if (readIndex==numReadings) {
    calculation_complete=true;
    calculating=false;
    initialized=false;
    readIndex=0;
    display_values();
  }
  
  if (not calculation_complete and beat>30 and beat<220 and SpO2>50) {
    average_beat = filterweight * (beat) + (1 - filterweight ) * average_beat;
    average_SpO2 = filterweight * (SpO2) + (1 - filterweight ) * average_SpO2;
    readIndex++;
    display_calculating(readIndex);
  }
}

void setup()
{
    Serial.begin(115200);
    pox.begin();
    pox.setOnBeatDetectedCallback(onBeatDetected);
}


void loop()
{
    
    pox.update(); 
    if ((millis() - tsLastReport > REPORTING_PERIOD_MS) and (not calculation_complete)) {
        calculate_average(pox.getHeartRate(),pox.getSpO2());
        tsLastReport = millis();
    }
    if ((millis()-last_beat>10000)) {
      calculation_complete=false;
      average_beat=0;
      average_SpO2=0;
      initial_display();
    }
}

Что на выходе

Откройте последовательный монитор, и вы увидите что-то подобное, если коснуться датчика:

Частота сердечных сокращений: 39.42bpm / SpO2: 93%
Beat!
Beat!
Частота сердечных сокращений: 62,35bpm / SpO2: 93%
Beat!
Частота сердечных сокращений: 64,70bpm / SpO2: 93%
Beat!
Частота сердечных сокращений: 72.40bpm / SpO2: 93%
Beat!
Частота сердечных сокращений: 68,71bpm / SpO2: 93%
Beat!
Частота сердечных сокращений: 76,62bpm / SpO2: 93%
Beat!
Частота сердечных сокращений: 54,73bpm / SpO2: 93%

На этом пока всё. Увидимся на новых интересных проектах.

Ардуино+