Arduino 血氧心率模块传感器数据采集

Arduino 血氧心率模块传感器数据采集,第1张

Arduino-1.8.5-windows.exe、HXDZ-30102-ACC

集成了LIS2DH12(ST的三轴加速传感器,用于记录运动数据)和MAX30102(血氧和心率检测记录)。

电路板尺寸:38*16mm

电路板厚度:2.5mm

LED峰值波长:660nm/880nm

LED供电电压:3.3v~5v

检测信号类型:光反射信号(PPG)

输出信号接口:I 2 C接口(数字接口)

通信接口电压:3~5v

工作电路:1.5mA(3.3v 输入)

心率精确度:+/- 5bpm,+/- 10bpm(动态)

分辨率: 1bpm

采样率:100Hz(STM32程序)/ 25Hz(arduino程序)

VCC:LED电源输入端,也是I 2 C总线上拉电平,可以接3.3v或者5v

GND:地线

SCL:I 2 C总线的时钟引脚

SDA:I 2 C总线的数据引脚

I_L:LIS2DH12芯片的中断引脚

I_M:MAX30102芯片的中断引脚

传统的脉搏测量方法主要有三种:

1、从心电信号中提取

2、从测量血压时压力传感器测到的波动来计算脉率

3、光电容积法

前两种会限制病人的活动,长时间使用会加重病患的心理和生理负担,而光电容积法在实际中时普遍使用的一种有效方法,其特点:方法简单、佩戴方便、可靠性高。

光电容积法基本原理:

利用人体组织在血管搏动时造成透光率不同来进行脉搏和血氧饱和度测量的。其使用的传感器由光源和光电变换器两部分组成,通过绑带或夹子固定在病患的手指、手腕或耳垂上。光源一般采用对动脉血中氧合血红蛋白(Hb0 2 )和血红蛋白(Hb)有选择性的特定波长的发光二极管(一般使用660nm附近的红光和900nm附近的红外光)。当光束透过人体外周血管,由于动脉搏动充血容积变化导致这束光的透光率发生改变,此时由光电变换器接收经人体组织反射的光线,转变为电信号并将其放大和输出。

由于脉搏是随心脏的搏动而周期性变化的信号,动脉血管容积也周期性变化,因此光电变换器的电信号变化周期就是脉搏率。同时根据血氧饱和度的定义,其表示为:

注意:

1、SaO 2 :广义上的氧饱和度,常指血液样品中的氧含量对该样品血液最大氧含量的百分比(SpO2是经皮血氧饱和度, 而SaO2是动脉血氧饱和度,二者不同,但是相关性好,绝对值十分接近)。

2、HbO 2 :氧合血红蛋白

3、Hb:还原血红蛋白

MAX30102本身集成了完整的发光LED及其驱动部分,光感应和AD转换部分,环境光干扰消除及数字滤波部分,只将数字接口留给用户,极大地减轻了用户的设计负担。用户只需要使用单片机通过硬件I 2 C或者模拟I 2 C接口来读取MAX30102本身的FIFO,就可以得到转换后的光强度数值,通过编写相应的算法就可以得到心率值和血氧饱和度。

心率和血氧饱和度算法流程图:

首先连接开发板串口,波特率需要进行必要设置,奇偶校验位无,上电后,复位MAX30102,并开始对MAX30102进行功能初始化,此时Red LED和 IR LED交替点亮来检测人体皮肤下血液的搏动和血氧含量(此时可以看到MAX30102有红光亮起,说明初始化成功)。开发板将一段时间内MAX30102采集的LED反射数据存储在内部RAM中,然后分别计算Red LED和 IR LED的直流成分(DC)和交流成分(AC),最后算出数值R并通过预先存储在两波峰之间的时间差T来确定,每分钟心跳数BPM=60/T。(具体算法原理可以参考AN6409芯片手册中29~31页说明)

red和ir是红色LED,红外LED的原始数据,HR表示心率值,HRvalid是心率是否有效标识,SPO2是血氧数值,SPO2valid是血氧首付有效标识

血氧模块与Arduino连接说明:

接口连接说明:

实际连接图:

原理图管脚说明:

初始化:

无采集状态:

数据采集状态:

ps:这里由于整体软件和硬件的标准没有像医疗设备的标准一样,所以只是验证性测试。

java是可以实现心跳的程序的。

心跳顾名思义就是每隔一段时间执行,或者轮询查询状态,可以使用timer来实现,代码如下:

定时器可以实现

//1000毫秒,固定时间,每隔1秒钟执行一次actionPerformed方法

javax.swing.Timer clock = new javax.swing.Timer(1000,new ActionListener(){

 public void actionPerformed(ActionEvent e) {

    //执行心跳方法

    /**...*/

   //调用其他方法

   /**...*/

  }

 

})

clock.start()

可以独立用个线程管理,也可以直接写在主线程中

auto 局部变量(自动储存) break无条件退出程序最内层循环 case switch语句中选择项 char单字节整型数据 const定义不可更改的常量值 continue中断本次循环,并转向下一次循环 default switch语句中的默认选择项 do 用于构成do.....while循环语句 double定义双精度浮点型数据 else构成if.....else选择程序结构 enum枚举 extern在其它程序模块中说明了全局变量 float定义单精度浮点型数据 for构成for循环语句 goto构成goto转移结构 if构成if....else选择结构 int基本整型数据 long长整型数据 registerCPU内部寄存的变量 return用于返回函数的返回值 short短整型数据 signed有符号数 sizoef计算表达式或数据类型的占用字节数 static定义静态变量 struct定义结构类型数据 switch构成switch选择结构 typedef重新定义数据类型 union联合类型数据 unsigned定义无符号数据 void定义无类型数据 volatile该变量在程序中执行中可被隐含地改变 while用于构成do...while或while循环结构


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11768838.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存