1.MAX30102心率和血氧浓度值连接图
2.MAX30102工作原理
工作原理
MAX30102采用PPG光电容积脉搏波描记法(PhotoPlethysmoGraphy)测量数据,微控制器对这些数据进行处理运算过后得到心率血氧数值,再通过I2C或UART接口输出,大大降低了传感器的使用难度和对主控的资源占用。同时该传感器还配备有对应的上位机,可通过电脑直接读取数据。
心率测量
含氧血红蛋白(HbO2)具有吸收红外光的特性,血液越红,吸收的红外光就越多。当心脏跳动时,血液被泵入和泵出,其反射光的强弱会发生变化(吸收红外光的量会变化),光电探测器接收透过皮肤的光线,将其转化为电信号,产生变化的波形。通过测量这些电信号的变化,可以计算出心率。
所以,只要得到的PPG信号比较理想,就能够较为准确的算出心率。但是,由于测量时总会出现某些干扰,所以我们需要进行滤波处理。然后得到在一段时间内的波峰数量即可计算出心率。
例如:在时间T秒内,有N个波峰。
Heart rate=(N/T)*60 = 60N / T (单位:次/min)
血氧测量
血液中有含氧血红蛋白(HbO2)和脱氧血红蛋白(Hb),这两个血红蛋白的吸收光谱不一样。脱氧血红蛋白(Hb)吸收更多的红光,而含氧血红蛋白(HbO2)吸收更多的红外光。而MAX30102能够同时发射红光和红外光,通过光电检测器检测反射光量,可以判断出红光、红外光被吸收的多少,从而推断出含氧血红蛋白(HbO2)和脱氧血红蛋白(Hb)所占的比例。最后,可以计算出血压中的氧含量。
R = (ACred / DCred) / (ACired / DCired)
=((ir_max+ir_min)(red_max-red_min) )/ ((red_max+red_min)(irmax-ir_min))
SpO2 = -45.060 * R * R+ 30.354 * R + 94.845
SpO2即血氧浓度值,BPM是心率
3.源代码
heartrate_monitor.py
from max30102 import MAX30102
import hrcalc
import threading
import time
import numpy as np
class HeartRateMonitor(object):
"""
A class that encapsulates the max30102 device into a thread
"""
LOOP_TIME = 0.01
def __init__(self, print_raw=False, print_result=False):
self.bpm = 0
if print_raw is True:
print('IR, Red')
self.print_raw = print_raw
self.print_result = print_result
def run_sensor(self):
sensor = MAX30102()
ir_data = []
red_data = []
bpms = []
# data for show
self.spos = []
self.bpms = []
# run until told to stop
while not self._thread.stopped:
# check if any data is available
num_bytes = sensor.get_data_present()
if num_bytes > 0:
# grab all the data and stash it into arrays
while num_bytes > 0:
red, ir = sensor.read_fifo()
num_bytes -= 1
ir_data.append(ir)
red_data.append(red)
if self.print_raw:
print("{0}, {1}".format(ir, red))
while len(ir_data) > 100:
ir_data.pop(0)
red_data.pop(0)
if len(ir_data) == 100:
bpm, valid_bpm, spo2, valid_spo2 = hrcalc.calc_hr_and_spo2(ir_data, red_data)
if valid_bpm:
bpms.append(bpm)
while len(bpms) > 4:
bpms.pop(0)
self.bpm = np.mean(bpms)
if (np.mean(ir_data) < 50000 and np.mean(red_data) < 50000):
self.bpm = 0
if self.print_result:
print("Finger not detected")
if self.print_result:
print("BPM: {0}, SpO2: {1}".format(self.bpm, spo2))
if spo2 > 0:
self.bpms.appen