昉·星光系列课程7:昉·星光开发板心率传感器使用

课程7:昉·星光开发板心率传感器使用

本次课程为昉·星光开发板IoT开发系列课程的第七讲,将带领同学们在昉·星光开发板上,使用心率传感器MAX30102。
本次课程,在昉·星光开发板V1和V2上,操作步骤相同。

一、学习目标

  • 学习昉·星光开发板使用心率传感器获取心跳和血氧浓度数据

二、准备工作

在开始本次课程的实际操作之前,同学们需要做好一些准备工作,课程中涉及到的硬件如下:

  • 开发板:昉·星光开发板
  • 心率传感器: 心率传感器MAX30102
  • 杜邦线:若干

三、心率传感器使用原理

本次课程中,使用的心率传感器模块具体如下:

MAX30102是集成了脉搏血氧仪和心率监测的传感器模块,该模块集成了红光/红外光LED光源,将血管搏动时透光率变化信号转换成电信号采集。该模块使用5V供电,3.3V也可,通讯使用II2C接口通讯。

四、心率传感器使用

首先,参考下图,将心率传感器模块,连接到昉·星光开发板:

实物连接如下:

注意:
应根据实际使用的传感器,确定供电电压。本次课程中使用的心率传感器模块使用5V供电电压。

从MAX30102读取到RAW数据后,需要进行换算才能表达为实际测量的脉搏血氧含量和心率。我们可以下载第三方提供的库,来完成这些工作。

git clone git@github.com:doug-burrell/max30102.git

pip install numpy
pip install smbus

然后,编写如下的程序:

# -*- coding: utf-8 -*-
# file: ~/projects/healthy/read_max30102.py

from max30102 import MAX30102
import numpy as np
import hrcalc
import time

# 初始化MAX30102传感器
sensor = MAX30102()

# 数据缓存
ir_data = []
red_data = []
bpms = []

# 输出结果设置
print_raw = False
print_result = True

while True:
    # 读取数据
    num_bytes = sensor.get_data_present()
    if num_bytes > 0:
        # 解析数据
        while num_bytes > 0:
            red, ir = sensor.read_fifo()
            num_bytes -= 1
            ir_data.append(ir)
            red_data.append(red)
            if 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)
                bpm = np.mean(bpms)
                if (np.mean(ir_data) < 50000 and np.mean(red_data) < 50000):
                    bpm = 0
                    if print_result:
                        print("没有检测到手指")
                if print_result and bpm>0 and spo2>0:
                    print("BPM: {0}, SpO2: {1}".format(bpm, spo2))

    time.sleep(0.01)

# 关闭检测,会关闭LED,降低功耗
sensor.shutdown()

上述程序的逻辑较,先读取一定量的数据,然后将数据进行解码,最后计算得出实际的测量结果并输出。

编写完成后,运行 read_max30102.py ,待测量LED亮后,将手指放在LED上方,然后观察输出结果。

pyhon3 read_max30102.py

实际运行结果如下:
当测量启动后,MAX30102传感器上的LED灯会点亮:

将手指放到LED上,一段时间后,将会显示检测结果:
6.测量结果

上述输出记过中,BPM表示心率数据,SpO2表示血氧浓度百分比。

在实际测量中,结果值会有一定程度的漂移。
在真实场合使用时,往往需要连续读取一段时间的数据,然后使用一定的算法取得最终合理的测验结果。

五、总结

在本次课程中,我们学习了心率传感器的基本使用。
心率传感器在健康检测场合应用非常广泛,目前主流的的智能手环、智能手表,基本上都在使用心率传感器进行健康检测。

六、课后作业

  • 了解心率传感器
  • 寻找合适的过滤算法,来过滤读取到的心率数据
  • 制作一个健康检测报警器,当心率超过预设范围时,使用蜂鸣器或者LED报警

七、参考资料

3 Likes