心率脉搏测量传感器
-
- 一、传感器介绍
- 二、接线图
- 四、完整代码
- 五、实验过程及结论
- 六、推荐的测量方法
一、传感器介绍
XD-58C PulseSensor 光电反射模拟传感器用于脉搏心率测量。该传感器集成了放大电路和噪声消除电路。脉搏测量可以用人体组织在血管搏动过程中造成不同透光率的手指接触传感器的白色区域。传感器滤波放大光电信号,最终输出模拟电压值。利用Core的AD该功能将收集到的模拟信号值转换为数字信号,然后通过相应的算法获得心率值BPM脉搏时间间隔IBI。
传感器内部原理如下图所示:
二、接线图
四、完整代码
--配置Core的USB口以虚拟串口模式工作print()输出的内容可以显示在计算机串口终端上 LIB_UsbConfig("CDC") --配置AD电压采集功能(最大采样值4096对应3.6V输入电压) --配置为当通道收集满50个点时缓存满,每个点的采集时间间隔为2000us(2ms) --这样,每次配置都可以50*2=100ms获取50个的传感器AD收集原始数据,即可在一秒钟内收集500个原始数据 --心率传感器算法所需的数据也是500Hz的频率 LIB_ADConfig(50,2000) --为PulseSensor心率脉搏传感器算法准备工作环境 LIB_HrAlgorithmConfig() --开始大循环 while(GC(1) == true) do --查询A0通道是否转换完成 --开发人员也可以接收传感器A1-A3中的任何通道也可以连接多个传感器,用法与下面相同 A0_full_flag, A0_buf = LIB_ADCheckBufFull("A0") if A0_full_flag == 1 then --已在100ms内采集满50传感器原始数据 --将A0_buf[]数组中的50将原始数据逐个喂入算法,并查询算法输出结果 for i, v in ipairs(A0_buf) do --将原始数据喂入传感器v,查询是否分析了有效的心率数据 flag,BPM,IBI = LIB_HrGetBpmIbi(v) if flag == 1 then --算法分析了有效心率结果 --将解析到的BPM(每分钟心跳
)、
IBI
(心率间隔R
-R,单位:毫秒
)值打印输出
print
(string
.
format
(
"BPM:%d IBI:%d "
, BPM
, IBI
)
) end end end end
代码中的算法函数LIB_HrGetBpmIbi()内部的具体实现参考了Github上的知名开源项目1.5.0版本,https://github.com/WorldFamousElectronics/PulseSensor_Amped_Arduino.git,如果需要了解算法的细节可以去此处了解。当然如果您有更好的算法,完全可以用Lua代码实现后替换掉代码中的LIB_HrGetBpmIbi()函数。
五、实验过程及结论
避免手指和传感器背面接触。 按压的力度不要过大,否则阻碍血液流动会导致读不到脉搏信号,但也不要太轻。 传感器和手指之间接触需保持稳定,按压力度的轻微变化都对测量结果有影响。 结论: 通过上面实验可以看出,当传感器测量稳定下来时,测量结果还是相对准确的。但是传感器对于手指的轻微变化也会导致测量结果的扰动。
下面是对测量中出现的异常情况时的推荐对策:
六、推荐的测量方法
通过手指按压的测量方法,需要测量者保持高度的静态下才能测出稳定的值,但借助胶带或其他固定装置将传感器固定手指指腹上可以让测量结果更稳定,数据更准确。