В этом проекте мы будем использовать 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%
На этом пока всё. Увидимся на новых интересных проектах.
23 мая 2020 в 17:55
Норма сатурации 97-98%, датчик значит плохой?