基于STM32的实时心率检测仪设计

一、开发环境介绍
主控芯片: stm32f103zet6
代码编程软件: keil5
心率检测模块: pulsesensor
wifi模块: esp8266 --可选的。直接使用串口有线传输给上位机也可以。
上位机: c++(qt) 设计的。 支持pc机电脑、android手机显示。
与上位机的传输协议: 支持串口传输、wifi网络传输两种。 如果是pc就可以直接连接串口传输数据,如果不方便可以直接通过wifi---tcp协议传输。
二、pulsesensor心率模块介绍
pulsesensor 是一款用于脉搏心率测量的光电反射式模拟传感器。
可以将其佩戴于手指、耳垂、手腕等处,通过杜邦线--导线将引脚连接到单片机,可将采集到的模拟信号传输给单片机,单片机配置adc用来转换为数字信号,再通过单片机简单计算后就可以得到心率数值;为了方便联动健康管理系统,也方便自己了解自己的心率,可将脉搏波形通过串口、wifi等方式上传到电脑、手机显示波形,然后根据提前配置的参数,结合算法确定是否正常。
pulsesensor 是一款开源硬件, 目前国外官网上已有其对应的单片机程序,也附带有对应的上位机processing 程序, 比较适用于心率方面的科学研究和教学演示,也非常适合用于二次开发;上位机也可以自己开发,根据自己的需求定制,达到自己想要的功能。
传感器的接口一共 3 个,
其中标有s的为模拟信号输出线
标有+的为电源输入线(中间);
标有-的为地线。
总结一下:
s → 脉搏信号输出(要接单片机 ad 接口)
+ → 5v(或 3.3v)电源输入
- → gnd 地
传感器的硬件参数介绍:
电路板直径: 16mm
电路板厚度: 1.2mm
led 峰值波长: 515nm
供电电压: 3.3~5v
检测信号类型:光反射信号(ppg)
输出信号类型:模拟信号
信号放大倍数: 330 倍
输出信号大小: 0~vcc
电流大小: ~4ma(5v 下)
传统的测量方法介绍:
传统的脉搏测量方法主要有三种:
一是从心电信号中提取;
二是从测量血压时压力传感器测到的波动来计算脉率;
三是光电容积法。前两种方法提取信号都会限制病人的活动,如果长时间使用会增加病人生理和心理上的不舒适感。而光电容积法脉搏测量作为监护测量中最普遍的方法之一,其具有方法简单、佩戴方便、可靠性高等特点。
光电容积法的基本原理是利用人体组织在血管搏动时造成透光率不同来进行脉搏测量的。其使用的传感器由光源和光电变换器两部分组成,通过绑带或夹子固定在病人的手指或耳垂上。光源一般采用对动脉血中氧和血红蛋白有选择性的一定波长(500nm~700nm)的发光二极管。当光束透过人体外周血管,由于动脉搏动充血容积变化导致这束光的透光率发生改变,此时由光电变换器接收经人体组织反射的光线,转变为电信号并将其放大和输出。由于脉搏是随心脏的搏动而周期性变化的信号,动脉血管容积也周期性变化,因此光电变换器的电信号变化周期就是脉搏率。
根据相关文献和实验结果, 560nm 波长左右的波可以反映皮肤浅部微动脉信息,适合用来提取脉搏信号。
本传感器采用了峰值波长为 515nm 的绿光 led,型号为 am2520,而光接收器采用了 apds-9008, 这是一款环境光感受器,感受峰值波长为 565nm,两者的峰值波长相近,灵敏度较高。此外,由于脉搏信号的频带一般在 0.05~200hz 之间, 信号幅度均很小,一般在毫伏级水平,容易受到各种信号干扰。在传感器后面使用了低通滤波器和由运放 mcp6001 构成的放大器,将信号放大了 330 倍,同时采用分压电阻设置直流偏置电压为电源电压的 1/2,使放大后的信号可以很好地被单片机的 ad 采集到。
整个心率传感器的结构如下图:
由于传感器使用的是固定倍数的放大器, 而人体生理信号是微弱信号,细微的差异会导致放大后的信号产生巨大的差别。 所以下图的示波器显示的波形只是理想情况下的波形,每个人的实际效果会略有区别。
​三、stm32的控制代码
stm32的采集代码比较简单,因为就只需要配置对应引脚的adc功能采集即可。
可以采集10次,去掉最大值最小值取平均值,拿到最终结果再传递给上位机显示。
3.1 adc的配置代码
/*函数功能: 初始化adc1硬件连接: pa1 --adc1的通道1配置的模式:模拟输入*/void adc1_init(void){ /*1. 配置gpio口*/ rcc->apb2enr|=1crl|=0x00000000; /*2. 配置adc相关寄存器*/ rcc->apb2enr|=1sqr3|=chsr&0x40)==0); //等待发送空 usart3->dr='+'; delayms(15); //大于串口组帧时间(10ms) while((usart3->sr&0x40)==0); //等待发送空 usart3->dr='+'; delayms(15); //大于串口组帧时间(10ms) while((usart3->sr&0x40)==0); //等待发送空 usart3->dr='+'; delayms(500); //等待500ms return esp8266_sendcmd(at\r\n,ok,20);//退出透传判断.}/*函数功能:获取esp8266模块的连接状态返 回 值:0,未连接;1,连接成功.*/u8 esp8266_constacheck(void){ u8 *p; u8 res; if(esp8266_quittrans())return 0; //退出透传 esp8266_sendcmd(at+cipstatus\r\n,:,50); //发送at+cipstatus指令,查询连接状态 p=esp8266_checkcmd(+cipstatus\r\n:); res=*p; //得到连接状态 return res;}/*函数功能:获取ip地址函数参数:ipbuf:ip地址输出缓存区*/void esp8266_getwanip(u8* ipbuf){ u8 *p,*p1; if(esp8266_sendcmd(at+cifsr\r\n,ok,50))//获取wan ip地址失败 { ipbuf[0]=0; return; } p=esp8266_checkcmd(\); p1=(u8*)strstr((const char*)(p+1),\); *p1=0; sprintf((char*)ipbuf,%s,p+1); } 四、qt设计的上位机代码
4.1 软件运行效果图
软件有两个版本: 1. 网络版本 2. 串口版本
网络版本主要是通过tcp协议传输数据显示,串口版本直接通过串口传输。

 ​4.2 widget.cpp代码
代码较多,这里就主ui的部分代码。#include widget.h


一文看懂发展工业机器人的重要性及技术难题的突破
DCS系统模拟量无线采集技术在钢铁行业的应用
为了对抗特斯拉 奔驰计划推出6款纯电动汽车
医疗产品具备满足医疗性能功能与优化企业产品概念
无锡市正式启动了车联网建设项目
基于STM32的实时心率检测仪设计
Oculus Earphones使用体验:采取夹片式设计 超强沉浸感
ADI运算放大器能整合超出的输入保护,具有70dB拒斥能力
广东移动率先商用基于OXC+POTN构建的全光网助力智慧光网迈入新时代
五分钟看懂新蒙迪欧LKA车道保持系统
调相机技术优缺点
英诺达低功耗设计EDA工具全流程解决方案
大基金二期出资参与中芯京城成立;思必驰旗下语音芯片公司完成数千万元融资
亚马逊推出控制机器人的RoboMaker程序
西门子博途:一次性升级到可用的最新类型版本
晶振的主要应用领域有哪些?
苹果8最新报价直线下跌超500 库克被打脸刚说完满意就发现热情下滑
射频同轴连接器种类划分 射频连接器型号尺寸介绍
电力行业智能化是主流趋势,边缘AI提升空间很大!
苹果12pro max和苹果13的区别是什么