基于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文件包
这个好玩{:1_102:} 是还好玩,假如家里有年老体弱的病人,还可以起一定的监护作用。 楼主大大可以开源一下程序吗,最近买了一个这个模块打算拿来玩玩,移植美信的程序 数据总是不对头 Pandaz_ 发表于 2019-4-28 17:05
楼主大大可以开源一下程序吗,最近买了一个这个模块打算拿来玩玩,移植美信的程序 数据总是不对头
1楼已经开源了的,下载解压后即可编译运行,通过串口调试助手在电脑上可以看到血氧和心率数据。 hujj 发表于 2019-4-28 21:22
1楼已经开源了的,下载解压后即可编译运行,通过串口调试助手在电脑上可以看到血氧和心率数据。
<p>楼主 可以开源一下你自己后面改的程序吗?带LCD显示的程序,最近也是在搞这个血氧仪</p>
<p>应邀将我修改后的整个项目文件打包上传,供大家参考和优化。</p>
<p></p>
tangjch11 发表于 2019-6-17 15:11
楼主 可以开源一下你自己后面改的程序吗?带LCD显示的程序,最近也是在搞这个血氧仪
<p>已经上传。</p>
hujj 发表于 2019-6-17 15:29
已经上传。
<p>楼主 大神! 我是最近刚刚接触这个指尖血氧仪,因为准备做这么一个项目,不知可否加个微信或者QQ联系 便于请教! 打扰之处还请谅解</p>
本帖最后由 tangjch11 于 2019-6-22 11:44 编辑
<div class="quote">
<blockquote><span style="font-size:small"><a href="forum.php?mod=redirect&goto=findpost&pid=2878452&ptid=1074493" target="_blank"><span style="color:#999999">hujj 发表于 2019-6-17 15:29</span></a></span> 已经上传。</blockquote>
</div>
<p>我现在使用的检测方式是光电的检测方式 发射LED发射出660nm 和905nm的红光和红外光 再使用一个接收管接收透光率,接收管会输出占空比为50%不同频率的PWM 波形,我现在就是不知道这个PWM波形代表的什么意思,继而怎么这个脉宽信号转换成数字值,不然我就可以套用美信的算法了!!</p>
hujj 发表于 2019-6-17 15:29
已经上传。
<p>有许多问题还想请教了! Q 906529016</p>
<p>我只知其然,不知其所以然。对下载的程序未作任何修改,仅仅是添加了LCD5110的显示功能。</p>
hujj 发表于 2019-6-22 14:33
我只知其然,不知其所以然。对下载的程序未作任何修改,仅仅是添加了LCD5110的显示功能。
<p>了解了!多谢你的分享! 另外你LCD 显示那个心率的柱状条 是根据那个值进行实时更新显示的了?还是固定显示!</p>
<p>我使用这些算法,心率和血氧的数据始终不稳定,是怎么回事呢?哪位大神可以指点指点?谢谢!</p>
tangjch11 发表于 2019-6-22 17:13
了解了!多谢你的分享! 另外你LCD 显示那个心率的柱状条 是根据那个值进行实时更新显示的了?还是固定显 ...
<p>是根据LED的pwm值,这个值是根据心率数据计算的,这个计算是原程序就有的。</p>
不!努力 发表于 2019-8-19 15:06
我使用这些算法,心率和血氧的数据始终不稳定,是怎么回事呢?哪位大神可以指点指点?谢谢!
<p> 我是直接用下载的程序,监测和计算部分未作任何修改。从代码初步分析的结果,程序是将测得的最后500组数据加权平均得到结果,下次剔除最早的一部分数据,然后补充新获得的数据再计算加权平均数,这样就平滑了数据的波动。</p>
<p>特别是血氧一直都是错的</p>
<p> </p>
<p>发现网上找了一推,都是错的,可能硬件是源码要配对的</p>
qzc0927 发表于 2019-9-25 13:58
发现网上找了一推,都是错的,可能硬件是源码要配对的
<p> 我开始准备在GD32E230开发板上使用,但一直没能驱动I2C通讯,后来在淘宝上找到这个直接使用STM32AF103C8T6的代码,下载编译测试一次通过,我仅仅是在这个代码上添加了LCD5110显示这部分。</p>
<p>想请假一下如何用AFE4400来实现这些功能,</p>
页:
[1]
2