hujj 发表于 2019-4-13 14:27

基于STM32F103的血氧心率监测装置

春节期间正忙于会客,忽然接到一个标注为“XX国际货运代理公司”的电话,我想这骗子也太唬人了,改天我还去注册一个“宇宙开发公司”,比你的“国际代理公司”要更气派的多呢,立马挂断了电话。第二天这个电话又来了,出于礼貌我接通了电话:“您好!”对方说:“您是H先生吗?”得到我的确定并核实了我的名字后说:“您有一个从菲律宾寄来的包裹,请问你的详细住址,我们将通过XX快递寄给您。”这时我忽然想起在去年末曾经申请过一个血氧心率检测芯片的评测,之后就一直没有音讯,我还以为此事不了了之呢。不多久就接到快递送来的包裹,这是一个20多厘米见方的纸箱(见下图),箱子外边还附着几张发货装箱单,猜想大概是海关通关需要的吧。
    开箱后映入眼帘的是几个大小不一的静电包装袋。
    还有一份与箱外类似的发货装箱单,另外还有几张彩页。
从粉红色的防震包装袋里取出一个精制的硬纸盒,打开纸盒后在空空如也的海绵垫中间插了一块1厘米见方的小芯片,这就是本次评测的主角(见下图)。

    下图就是芯片的特写,是一块有8个焊盘的小PCB板,大约1厘米见方,仔细查看和分析后才知道左右两个焊盘分别是电源及地线,上下的6个焊盘是分别连通的,实际上就是芯片的中断INT引脚和I2C通讯用的SCL和SDA引脚。
    从另外一个小的静电包装袋里取出了一个用乳胶制品,开始还不知道用途,看完说明书之后才知道这是一个卡片袋,可以用来存放银行卡或身份证。
    另外还有一支精制的圆珠笔(见下图)。
    还有一个厚实的静电包装袋,我起初以为里面是开发用的器材或资料,打开后才发现是一本笔记本。不过这个笔记本也非常精制,不光有封口的松紧带和作书签用的丝带,里面印刷的不象我们常用的横格,而是横竖交错的方格,方便绘图定位。
    拆开最后一个静电包装袋,里面是十根带鳄鱼夹的测试线。在这些小礼品中,我认为这个是最实用的了。
    整个包装箱里没有找到我所需要的技术手册或使用说明等资料,好在宣传彩页上印有网址,可以去官网下载资料。
从美信官网下载的全是英文资料,这可难倒了我这个“文盲”,全靠百度翻译才勉强了解了一点皮毛,但始终没有找到对芯片引脚作用的描述和如何使用的说明。经过反复阅读程序后才知道INT引脚是芯片提供信号,以便主机开始读取I2C总线上的检测数据,SCL和SDA显然是I2C总线通讯用的。官方提供的例程主要是后缀为cpp的文件,开始我还按网上说的将其后缀名改为.c后再进行编译,后来才知道根本不用修改后缀名,完全可以正常编译的。官方提供的文件主要有:1、MAX30102.cpp(初始化芯片和读写数据);2、algorithm.cpp(算法);3、main.cpp(主函数),其他引脚设置和I2C驱动则在mbed文件夹中,在mbed里面除了头文件外都是编译过的.o文件。我开始准备用现有的GD32E230开发板的驱动,可是无法成功与检测芯片建立起I2C通讯,之后换用STM32F103最小系统板也没有成功,检测芯片的LED灯始终没有亮起,以致于我都怀疑芯片是不是已经损坏了。为了判定准备模拟I2C使用的引脚是否正常,我还用逻辑分析仪来检测相关引脚的功能,看是否能正常控制(见下图)。
后来我从网上找到一个基于STM32F103C8T6 MCU的应用,下载后由于其没有包含关键的mbed文件夹内容,编译一直通不过,而我又不知道该到哪里去找这些文件。最后又在另一个论坛里找到同样基于STM32F103C8T6的项目包,这个压缩包资料完整,解压后编译顺利通过了,不仅成功地驱动了检测芯片,而且通过串口通讯在电脑上可以得到检测数据(参见下图)。

芯片驱动成功后,我开始着手LCD显示功能,看似简单的事情,可就在固件库的选择上走了弯路。开始我使用的是标准库,编译总是出错,最后反复查看代码和文件夹中的文件才发现这个项目中使用的是HAL库,修改相应的代码后才完成了在LCD显示屏上显示数据的功能。为了测试方便,我用洞洞板焊接了一块扩展板,用鼠标线来连接扩展板与检测芯片,同时LCD屏也可以直接插在扩展板上(参见下图)。这样可以避免杜邦线的杂乱和松动引起接触不良。
为了使用方便,我找了一个塑料瓶盖,将检测芯片缝在瓶盖内,正好可以套在手指上,这样仅方便使用,检测时还可以减少杂光影响。
接下来准备在LCD上显示脉搏的动态图形,在选择数据源上又费了一番周折。开始我使用的是从检测芯片读入的数据,但显示效果不理想,后来改用驱动PWM发光管的变量。在显示方式上开始用的是曲线,因为我的LCD显示屏分辨率太低,显示效果不好,后来改为用竖线组成黑色区域显示,效果才好上一点(参见下图)。
至此,这个项目算是基本完成了。从使用的情况看,因为在程序中采用了存储500组数据后再计算,因此明显存在滞后现象,开始使用时要稳定几秒后才逐步显示正常数据,而且在检测过程中稍有活动,数据便不正常,血氧数值相对波动不大,但心率波动时最大甚至超过200次/秒。另外在使用过程中偶尔还出现过芯片死锁现象,复位单片机都无效,一定要断电重新加载才恢复正常。
下一步的测试计划是添加蓝牙模块,同时开发一个安卓APP,将检测数据发送到手机上显示,以便让心率波形显示更美观,取得更好的体验效果。
这是我从网上找到的基于STM32F103C8T6文件包



lising 发表于 2019-4-13 14:51

这个好玩{:1_102:}

hujj 发表于 2019-4-13 15:54

是还好玩,假如家里有年老体弱的病人,还可以起一定的监护作用。

Pandaz_ 发表于 2019-4-28 17:05

楼主大大可以开源一下程序吗,最近买了一个这个模块打算拿来玩玩,移植美信的程序 数据总是不对头

hujj 发表于 2019-4-28 21:22

Pandaz_ 发表于 2019-4-28 17:05
楼主大大可以开源一下程序吗,最近买了一个这个模块打算拿来玩玩,移植美信的程序 数据总是不对头

1楼已经开源了的,下载解压后即可编译运行,通过串口调试助手在电脑上可以看到血氧和心率数据。

tangjch11 发表于 2019-6-17 15:11

hujj 发表于 2019-4-28 21:22
1楼已经开源了的,下载解压后即可编译运行,通过串口调试助手在电脑上可以看到血氧和心率数据。

<p>楼主&nbsp; 可以开源一下你自己后面改的程序吗?带LCD显示的程序,最近也是在搞这个血氧仪</p>

hujj 发表于 2019-6-17 15:28

<p>应邀将我修改后的整个项目文件打包上传,供大家参考和优化。</p>

<p></p>

hujj 发表于 2019-6-17 15:29

tangjch11 发表于 2019-6-17 15:11
楼主&nbsp; 可以开源一下你自己后面改的程序吗?带LCD显示的程序,最近也是在搞这个血氧仪

<p>已经上传。</p>

tangjch11 发表于 2019-6-22 11:12

hujj 发表于 2019-6-17 15:29
已经上传。

<p>楼主&nbsp;&nbsp; 大神!&nbsp; 我是最近刚刚接触这个指尖血氧仪,因为准备做这么一个项目,不知可否加个微信或者QQ联系&nbsp;&nbsp;&nbsp;&nbsp; 便于请教! 打扰之处还请谅解</p>

tangjch11 发表于 2019-6-22 11:41

本帖最后由 tangjch11 于 2019-6-22 11:44 编辑

<div class="quote">
<blockquote><span style="font-size:small"><a href="forum.php?mod=redirect&amp;goto=findpost&amp;pid=2878452&amp;ptid=1074493" target="_blank"><span style="color:#999999">hujj 发表于 2019-6-17 15:29</span></a></span> 已经上传。</blockquote>
</div>

<p>我现在使用的检测方式是光电的检测方式&nbsp; 发射LED发射出660nm&nbsp; 和905nm的红光和红外光&nbsp;&nbsp; 再使用一个接收管接收透光率,接收管会输出占空比为50%不同频率的PWM 波形,我现在就是不知道这个PWM波形代表的什么意思,继而怎么这个脉宽信号转换成数字值,不然我就可以套用美信的算法了!!</p>

tangjch11 发表于 2019-6-22 11:55

hujj 发表于 2019-6-17 15:29
已经上传。

<p>有许多问题还想请教了! Q 906529016</p>

hujj 发表于 2019-6-22 14:33

<p>我只知其然,不知其所以然。对下载的程序未作任何修改,仅仅是添加了LCD5110的显示功能。</p>

tangjch11 发表于 2019-6-22 17:13

hujj 发表于 2019-6-22 14:33
我只知其然,不知其所以然。对下载的程序未作任何修改,仅仅是添加了LCD5110的显示功能。

<p>了解了!多谢你的分享! 另外你LCD 显示那个心率的柱状条 是根据那个值进行实时更新显示的了?还是固定显示!</p>

不!努力 发表于 2019-8-19 15:06

<p>我使用这些算法,心率和血氧的数据始终不稳定,是怎么回事呢?哪位大神可以指点指点?谢谢!</p>

hujj 发表于 2019-8-19 15:38

tangjch11 发表于 2019-6-22 17:13
了解了!多谢你的分享! 另外你LCD 显示那个心率的柱状条 是根据那个值进行实时更新显示的了?还是固定显 ...

<p>是根据LED的pwm值,这个值是根据心率数据计算的,这个计算是原程序就有的。</p>

hujj 发表于 2019-8-19 15:44

不!努力 发表于 2019-8-19 15:06
我使用这些算法,心率和血氧的数据始终不稳定,是怎么回事呢?哪位大神可以指点指点?谢谢!

<p>&nbsp; &nbsp; 我是直接用下载的程序,监测和计算部分未作任何修改。从代码初步分析的结果,程序是将测得的最后500组数据加权平均得到结果,下次剔除最早的一部分数据,然后补充新获得的数据再计算加权平均数,这样就平滑了数据的波动。</p>

不!努力 发表于 2019-8-19 16:11

<p>特别是血氧一直都是错的</p>

<p>&nbsp;</p>

qzc0927 发表于 2019-9-25 13:58

<p>发现网上找了一推,都是错的,可能硬件是源码要配对的</p>

hujj 发表于 2019-9-25 15:08

qzc0927 发表于 2019-9-25 13:58
发现网上找了一推,都是错的,可能硬件是源码要配对的

<p>&nbsp; &nbsp; 我开始准备在GD32E230开发板上使用,但一直没能驱动I2C通讯,后来在淘宝上找到这个直接使用STM32AF103C8T6的代码,下载编译测试一次通过,我仅仅是在这个代码上添加了LCD5110显示这部分。</p>

卖狗肉的狗 发表于 2019-11-15 14:37

<p>想请假一下如何用AFE4400来实现这些功能,</p>
页: [1] 2
查看完整版本: 基于STM32F103的血氧心率监测装置