聚丰项目 > 老人健康监测仪
随着我国老龄化的逐步加剧,老年人的健康安全问题成为当今社会首要解决的问题,该项目主要是实现实时监测中老年人生理状态可穿戴的便捷医疗系统。其系统是以STM32作为主控芯片,功能包括:老人跌倒检测、自动报警、体温检测、心率检测,实现通过手机APP进行远程管理监测查看信息人体生理数据的采集和人体生理健康的监测。
木木_11a
分享木木_11a
团队成员
林伟 电子发烧友
1 、系统分析
本系统以STM32片机作为控制核心。对于人体跌倒监测的实现,采用MEMS传感器,通过加速度传感器将得到的信息转换成模拟电压信号,经前置放大用的仪器放大器实现差值放大。然后进行滤波等一系列中间信号处理,用A/D转换器将模拟电压信号转换成数字信号。心电及脉搏生理信号的监测为单导心电图采集模块,模拟信号输出,内部包含了前置放大电路、滤波电路、工频滤波等电路。该红外脉搏传感器是一款利用红外光透射手指指尖部位,输出反应血管末稍血容积变化的脉搏传感器,其输出电压形式的模拟信号。本装置主要任务是完成对目标群体的跌倒检测及生理健康监测。整体逻辑结构图如下图
所示,主要组成部分包括主控模块(CPU)、生理信号采集模块、姿态监测模块、数据处理模块、电源模块。通过MEMS传感器对人体姿态信息进行采集,通过数据分析完成跌倒判定,通过连续血压检测完成对使用对象的生理信号采集,并通过数据分析处理完成对跌倒的辅助判定以及健康监测,以便于对跌倒者采取相关的医疗救援。
2、硬件组成部分:
2.1、NUCLEO-F401RE 开发板
2.2、 2.2寸 220*176分辨率TFT触摸显示屏
2.3、MPU6050陀螺仪感应器
2.4、庆科EMW3080 WIFI模块
2.5、DB18B20温度传感器
2.6、pulse sensor心率传感器
2.7、TP4056电源芯片
2.8、光敏传感器
2.9、YKB1712血压传感器
1、 软件整体原理框架图:
界面使用的是EmWin,手机APP和服务器,使用的是JAVA编写。
2、 跌倒判定
由于人体跌倒时身体加速度,倾斜度会产生较大变化,故采用MEMS传感器对目标群体跌倒时产生的加速度及倾斜角度进行测量,通过数据分析完成对跌倒动作的判定。由于此装置为穿戴式设备,故安置在佩戴者的重心处,主要作用是将检测到的运动信号,包括角加速度、角速度和倾角信息,发送至主控模块,即系统CPU。又因为人体跌倒时会引起血压等众多生理因素的变化。因此,对人体血压的连续检测及分析可以完成对跌倒的辅助判定,使判定结果更加准确。
STM32 和 MPU6050 的 I2C 通信:
1、配置 STM32 (用I2C1:PB6——SCL;PB7——SDA)
1)时钟 RCC
CC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1 , ENABLE);
2)GPIO 配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //两个引脚都加 4.7K 上拉电阻
GPIO_Init(GPIOB, &GPIO_InitStructure);
3)I2C 配置
void I2C_Configuration(void)
{
2C_InitTypeDef I2C_InitStructure;
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 =0xc0;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000;
2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1, ENABLE);
}
2、初始化 MPU6050
void MPU6050_Initialize()
{
MPU6050_I2C_ByteWrite(0xd0,0x00,MPU6050_RA_PWR_MGMT_1); // 8M内部时钟源
MPU6050_I2C_ByteWrite(0xd0,0x07,MPU6050_RA_SMPLRT_DIV); //采用频率 1000
MPU6050_I2C_ByteWrite(0xd0,0x06,MPU6050_RA_CONFIG);
MPU6050_I2C_ByteWrite(0xd0,0x01,MPU6050_RA_ACCEL_CONFIG); //加速度量程 2g
MPU6050_I2C_ByteWrite(0xd0,0x18,MPU6050_RA_GYRO_CONFIG); //角速度量程 2000度/s
}
3、I2C 核心程序 ( 读/写)
1)写入寄存器
一次写操作分为几个步骤: 发送开始信号 -> 起始成功? -> 发送 MPU6050 地址、状态(写)-> 写地址成功? -> 发送 MPU6050内部某个待写寄存器地址 -> 发送成功? -> 发送要写入的内容 -> 发送成功? -> 发送结束信号
void MPU6050_I2C_ByteWrite(u8 slaveAddr, u8 pBuffer, u8 writeAddr)
{
I2C_GenerateSTART(I2C1, ENABLE); //发送开始信号
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1, slaveAddr, I2C_Direction_Transmitter); // 发送 MPU6050 地址、状态(写)
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C1, writeAddr); //发送 MPU6050内部某个待写寄存器地址
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1, pBuffer); //发送要写入的内容
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(I2C1, ENABLE); //发送结束信号
}
2)读寄存器
MPU6050_I2C_BufferRead(0xd0, receive_data, MPU6050_RA_WHO_AM_I, 1); //读 WHO_AM_I 寄存器的值(0x68)
void MPU6050_GetRawAccelGyro(s16* AccelGyro) //读加速度值 和 角速度值
{
u8 tmpBuffer[14],i;
MPU6050_I2C_BufferRead(0xd0, tmpBuffer, MPU6050_RA_ACCEL_XOUT_H, 14);
for(i=0; i<3; i++)
AccelGyro=((s16)((u16)tmpBuffer[2*i] << 8) + tmpBuffer[2*i+1]);
for(i=4; i<7; i++)
AccelGyro[i-1]=((s16)((u16)tmpBuffer[2*i] << 8) + tmpBuffer[2*i+1]);
}
注:
#define MPU6050_RA_ACCEL_XOUT_H 0x3B
#define MPU6050_RA_ACCEL_XOUT_L 0x3C
#define MPU6050_RA_ACCEL_YOUT_H 0x3D
#define MPU6050_RA_ACCEL_YOUT_L 0x3E
#define MPU6050_RA_ACCEL_ZOUT_H 0x3F
#define MPU6050_RA_ACCEL_ZOUT_L 0x40
#define MPU6050_RA_TEMP_OUT_H 0x41
#define MPU6050_RA_TEMP_OUT_L 0x42
#define MPU6050_RA_GYRO_XOUT_H 0x43
#define MPU6050_RA_GYRO_XOUT_L 0x44
#define MPU6050_RA_GYRO_YOUT_H 0x45
#define MPU6050_RA_GYRO_YOUT_L 0x46
#define MPU6050_RA_GYRO_ZOUT_H 0x47
#define MPU6050_RA_GYRO_ZOUT_L 0x48
I2C 读核心程序:
void MPU6050_I2C_BufferRead(u8 slaveAddr, u8* pBuffer, u8 readAddr, u16 NumByteToRead)
{
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1, slaveAddr, I2C_Direction_Transmitter);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_Cmd(I2C1, ENABLE);
I2C_SendData(I2C1, readAddr);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTART(I2C1, ENABLE);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1, slaveAddr, I2C_Direction_Receiver);
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
while(NumByteToRead)
{
if(NumByteToRead == 1)
{
I2C_AcknowledgeConfig(I2C1, DISABLE);
I2C_GenerateSTOP(I2C1, ENABLE);
}
if(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))
{
pBuffer++;
NumByteToRead--;
}
}
I2C_AcknowledgeConfig(I2C1, ENABLE);
}
3、心率信号采集
由于生理信号对跌倒检测及生理健康监测重要作用,对其精确检测尤为关键。故采用心电传感单导心电信号采集模块,输出电压信号供AD采样,使用时需通过红外脉搏传感器利用特定波长红外线对血管末端血液微循环产生的血液溶剂变化的敏感特性,来对由于心脏的跳动,引起血管血容积发生相应的变化进行检测。当人体发生跌倒时红外脉搏传感器能够输出经过电路调理后的反应血容积变化的完整脉搏波电压信号,进而可测量出脉率,监测脉搏波的变化。最后经过数据处理便得到使用者的心率及血压数据。同时附加温度传感器实时监测用户体温情况并予以显示。
void Time_1_Init(u16 arr,u16 psc)
{
/*端口设置*/
GPIO_Clock_Set(IOPAEN);
GPIO_Set(GPIOA,PIN8,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);//复用功能,下拉
GPIO_AF_Set(GPIOA,8,1); //PA0,AF2
/*使能时钟*/
RCC->APB2ENR |=1<<0; //使能定时器1时钟;
TIM1->PSC =psc; //预分频;
TIM1->ARR =arr; //自动重装载;
/*输入捕获设置此处M3与M4相同*/
TIM1->CCMR1 |=1<<0; //01:CC1通道配置为输入,IC1映射到TI1上
TIM1->CCMR1 &= ~((1<<3)|(1<<2)); //不分频;
TIM1->CCMR1 |=(0<<4); //fDTS/32 N=8
TIM1->CCER &=~(1<<1); //非反相上升沿触发
TIM1->CCER &= ~(1<<3);
TIM1->CCER |=(1<<0); //允许计数器值到输入捕捉寄存器中;
TIM1->EGR=1<<0;
//TIM1->DIER |=1<<0; //允许更新中断(溢出中断);
TIM1->DIER |=1<<1; //允许1捕获中断;
TIM1->SR =0;
TIM1->CR1 |=1<<0; //使能定时器1;
/*中断优先级设置*/
}
* 功能说明:定时器1比较捕获中断服务函数;
void TIM1_CC_IRQHandler(void)
{
u16 buf = TIM1->CCR1;
TIM1->CNT=0;
if((read_flag&0x01) == 0)
{
if((buf>4600)&&(buf<12000)) // 这个范围内的心跳才是有效心跳
{
hear_rising[cnt]=buf; //获取上一次心跳的计数值
cnt++;
}
else
{
cnt = 0;
}
}
if(cnt==3) //连续拿了6次数据
{read_flag|=(1<<0);cnt=0;}
TIM1->SR =0; //中断标志位清0
}
* 功能说明:读心率数据;
u8 Get_Haer_Rate(void)
{
u32 temp = 0;
u8 i;
if((read_flag&0x01) == 0x01) //读允许;
{
for(i=0;i<3;i++)
{
temp += hear_rising[i];
}
temp = temp/3;
temp=CNT_FREQUENCY/temp; //得到心率;
last_data = temp;
read_flag &= ~(1<<0);
read_flag |= (1<<1); //测量完成标志位
return temp;
}
read_flag &= ~(1<<1);
return 0; //读取三次不够,返回上一次的值
}
4、网络部分
由于大都老年人都在有WIFI覆盖的房子内活动,所以可采用庆科的EMW3080 WIFI模块,链接是使用smartlink功能,通过手机APP来进行链接的,与服务器通信部分采用的websocket协议,实现了全双工实时通信。
5、报警部分
通过对手机APP设置报警功能触发功能,一旦手表判断体征异常就会发出报警信息,当佩戴者点击确定后,手机APP端会自动报警。为了防止误判,体征异常是否发出报警信息这里需要点击确定或者取消。当佩戴者一定时间内都没有点击确认或者取消时,手表会认为佩戴者已经无法正常操作,并自动向APP发送报警信息,通知手机端。
6、体温心率血压方面部分进行实时的采样设定每隔30s进行传送。
(0.15 MB)下载
11291067: 你好,对你这个项目感兴趣,方便进一步沟通吗
回复