
#define CH1 0
#define CH2 1
#define CH3 2
#define CH4 4
#define CH5 6
unsigned long P[6] //定义PWM值存储数组
unsigned long T[6] //定义临时时间存储数组
bool L[6] //定义状态存储数组
void setup()
{
int i
Serial.begin(9600) //初始化串口
pinMode(CH1, INPUT) //设置管脚输入状态
pinMode(CH2, INPUT)
pinMode(CH3, INPUT)
pinMode(CH4, INPUT)
pinMode(CH5, INPUT)
for(i=1i<=5i++)
{
P[i] = 0 //初始化PWM值为0
T[i] = 0 //初始化临时时间值为0
L[i] = false //初始化状态为假
}
}
void loop()
{
int i
CHK_PWM_TIME(CH1,1) //判断并采集各个通道
CHK_PWM_TIME(CH2,2)
CHK_PWM_TIME(CH3,3)
CHK_PWM_TIME(CH4,4)
CHK_PWM_TIME(CH5,5)
for(i=1i<=5i++) //输出采集结果
{
Serial.print(P[i])
Serial.print(",")
}
Serial.println(" CH1,...,CH5")
}
void CHK_PWM_TIME(int Pin , int CH) //通道脉宽采集函数
{
int puls //电平高低状态
puls = digitalRead(Pin) //读Pin电平高低状态
if (puls == HIGH && L[CH] == false) //如果高电平,但状态为假 则
{
T[CH] = micros() //记录临时时间
L[CH] = true //标记状态为真
}
else if (puls == LOW && L[CH] == true) //如果电平为低,但状态为真 则
{
P[CH] = micros() - T[CH] //脉冲捕捉结束,脉宽值为当前时间 - 记录时间
L[CH] = false // 标记记录状态为假
}
}
以上在Arduino IDE环境中调试无错,具体的运行效果,要根据您的具体的硬件连接来调试。
建议不要使用数字管脚的0和1,有一些Arduino的板子,数字管脚的0和1可能与串口是复用的,在输入数据,同时还要进行串口通信的时候,有可能会干扰您的采集准确或导致无法串口通信。
1、首先设置LED灯引脚,定义变量存储串口数据,如图所示。
2、然后打开串行通信接口并设置通信波特率,将LED管脚模式初始化为输出模式,如图所示。
3、然后检查是否有数据,并且发出控制指令,如图所示。
4、然后读取串口数据,如图所示。
5、然后测试传输值是否等于K,如图所示。
6、最后测试传输值是否等于G,如图所示。
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:这里由于整体软件和硬件的标准没有像医疗设备的标准一样,所以只是验证性测试。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)