聚豐項(xiàng)目 > 老人健康監(jiān)測(cè)儀
隨著我國(guó)老齡化的逐步加劇,老年人的健康安全問(wèn)題成為當(dāng)今社會(huì)首要解決的問(wèn)題,該項(xiàng)目主要是實(shí)現(xiàn)實(shí)時(shí)監(jiān)測(cè)中老年人生理狀態(tài)可穿戴的便捷醫(yī)療系統(tǒng)。其系統(tǒng)是以STM32作為主控芯片,功能包括:老人跌倒檢測(cè)、自動(dòng)報(bào)警、體溫檢測(cè)、心率檢測(cè),實(shí)現(xiàn)通過(guò)手機(jī)APP進(jìn)行遠(yuǎn)程管理監(jiān)測(cè)查看信息人體生理數(shù)據(jù)的采集和人體生理健康的監(jiān)測(cè)。
木木_11a
木木_11a
團(tuán)隊(duì)成員
林偉 電子發(fā)燒友
1 、系統(tǒng)分析
本系統(tǒng)以STM32片機(jī)作為控制核心。對(duì)于人體跌倒監(jiān)測(cè)的實(shí)現(xiàn),采用MEMS傳感器,通過(guò)加速度傳感器將得到的信息轉(zhuǎn)換成模擬電壓信號(hào),經(jīng)前置放大用的儀器放大器實(shí)現(xiàn)差值放大。然后進(jìn)行濾波等一系列中間信號(hào)處理,用A/D轉(zhuǎn)換器將模擬電壓信號(hào)轉(zhuǎn)換成數(shù)字信號(hào)。心電及脈搏生理信號(hào)的監(jiān)測(cè)為單導(dǎo)心電圖采集模塊,模擬信號(hào)輸出,內(nèi)部包含了前置放大電路、濾波電路、工頻濾波等電路。該紅外脈搏傳感器是一款利用紅外光透射手指指尖部位,輸出反應(yīng)血管末稍血容積變化的脈搏傳感器,其輸出電壓形式的模擬信號(hào)。本裝置主要任務(wù)是完成對(duì)目標(biāo)群體的跌倒檢測(cè)及生理健康監(jiān)測(cè)。整體邏輯結(jié)構(gòu)圖如下圖
所示,主要組成部分包括主控模塊(CPU)、生理信號(hào)采集模塊、姿態(tài)監(jiān)測(cè)模塊、數(shù)據(jù)處理模塊、電源模塊。通過(guò)MEMS傳感器對(duì)人體姿態(tài)信息進(jìn)行采集,通過(guò)數(shù)據(jù)分析完成跌倒判定,通過(guò)連續(xù)血壓檢測(cè)完成對(duì)使用對(duì)象的生理信號(hào)采集,并通過(guò)數(shù)據(jù)分析處理完成對(duì)跌倒的輔助判定以及健康監(jiān)測(cè),以便于對(duì)跌倒者采取相關(guān)的醫(yī)療救援。
2、硬件組成部分:
2.1、NUCLEO-F401RE 開(kāi)發(fā)板
2.2、 2.2寸 220*176分辨率TFT觸摸顯示屏
2.3、MPU6050陀螺儀感應(yīng)器
2.4、慶科EMW3080 WIFI模塊
2.5、DB18B20溫度傳感器
2.6、pulse sensor心率傳感器
2.7、TP4056電源芯片
2.8、光敏傳感器
2.9、YKB1712血壓傳感器
1、 軟件整體原理框架圖:
界面使用的是EmWin,手機(jī)APP和服務(wù)器,使用的是JAVA編寫。
2、 跌倒判定
由于人體跌倒時(shí)身體加速度,傾斜度會(huì)產(chǎn)生較大變化,故采用MEMS傳感器對(duì)目標(biāo)群體跌倒時(shí)產(chǎn)生的加速度及傾斜角度進(jìn)行測(cè)量,通過(guò)數(shù)據(jù)分析完成對(duì)跌倒動(dòng)作的判定。由于此裝置為穿戴式設(shè)備,故安置在佩戴者的重心處,主要作用是將檢測(cè)到的運(yùn)動(dòng)信號(hào),包括角加速度、角速度和傾角信息,發(fā)送至主控模塊,即系統(tǒng)CPU。又因?yàn)槿梭w跌倒時(shí)會(huì)引起血壓等眾多生理因素的變化。因此,對(duì)人體血壓的連續(xù)檢測(cè)及分析可以完成對(duì)跌倒的輔助判定,使判定結(jié)果更加準(zhǔn)確。
STM32 和 MPU6050 的 I2C 通信:
1、配置 STM32 (用I2C1:PB6——SCL;PB7——SDA)
1)時(shí)鐘 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; //兩個(gè)引腳都加 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內(nèi)部時(shí)鐘源
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)寫入寄存器
一次寫操作分為幾個(gè)步驟: 發(fā)送開(kāi)始信號(hào) -> 起始成功? -> 發(fā)送 MPU6050 地址、狀態(tài)(寫)-> 寫地址成功? -> 發(fā)送 MPU6050內(nèi)部某個(gè)待寫寄存器地址 -> 發(fā)送成功? -> 發(fā)送要寫入的內(nèi)容 -> 發(fā)送成功? -> 發(fā)送結(jié)束信號(hào)
void MPU6050_I2C_ByteWrite(u8 slaveAddr, u8 pBuffer, u8 writeAddr)
{
I2C_GenerateSTART(I2C1, ENABLE); //發(fā)送開(kāi)始信號(hào)
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1, slaveAddr, I2C_Direction_Transmitter); // 發(fā)送 MPU6050 地址、狀態(tài)(寫)
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
I2C_SendData(I2C1, writeAddr); //發(fā)送 MPU6050內(nèi)部某個(gè)待寫寄存器地址
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1, pBuffer); //發(fā)送要寫入的內(nèi)容
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_GenerateSTOP(I2C1, ENABLE); //發(fā)送結(jié)束信號(hào)
}
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、心率信號(hào)采集
由于生理信號(hào)對(duì)跌倒檢測(cè)及生理健康監(jiān)測(cè)重要作用,對(duì)其精確檢測(cè)尤為關(guān)鍵。故采用心電傳感單導(dǎo)心電信號(hào)采集模塊,輸出電壓信號(hào)供AD采樣,使用時(shí)需通過(guò)紅外脈搏傳感器利用特定波長(zhǎng)紅外線對(duì)血管末端血液微循環(huán)產(chǎn)生的血液溶劑變化的敏感特性,來(lái)對(duì)由于心臟的跳動(dòng),引起血管血容積發(fā)生相應(yīng)的變化進(jìn)行檢測(cè)。當(dāng)人體發(fā)生跌倒時(shí)紅外脈搏傳感器能夠輸出經(jīng)過(guò)電路調(diào)理后的反應(yīng)血容積變化的完整脈搏波電壓信號(hào),進(jìn)而可測(cè)量出脈率,監(jiān)測(cè)脈搏波的變化。最后經(jīng)過(guò)數(shù)據(jù)處理便得到使用者的心率及血壓數(shù)據(jù)。同時(shí)附加溫度傳感器實(shí)時(shí)監(jiān)測(cè)用戶體溫情況并予以顯示。
void Time_1_Init(u16 arr,u16 psc)
{
/*端口設(shè)置*/
GPIO_Clock_Set(IOPAEN);
GPIO_Set(GPIOA,PIN8,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);//復(fù)用功能,下拉
GPIO_AF_Set(GPIOA,8,1); //PA0,AF2
/*使能時(shí)鐘*/
RCC->APB2ENR |=1<<0; //使能定時(shí)器1時(shí)鐘;
TIM1->PSC =psc; //預(yù)分頻;
TIM1->ARR =arr; //自動(dòng)重裝載;
/*輸入捕獲設(shè)置此處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); //非反相上升沿觸發(fā)
TIM1->CCER &= ~(1<<3);
TIM1->CCER |=(1<<0); //允許計(jì)數(shù)器值到輸入捕捉寄存器中;
TIM1->EGR=1<<0;
//TIM1->DIER |=1<<0; //允許更新中斷(溢出中斷);
TIM1->DIER |=1<<1; //允許1捕獲中斷;
TIM1->SR =0;
TIM1->CR1 |=1<<0; //使能定時(shí)器1;
/*中斷優(yōu)先級(jí)設(shè)置*/
}
* 功能說(shuō)明:定時(shí)器1比較捕獲中斷服務(wù)函數(shù);
void TIM1_CC_IRQHandler(void)
{
u16 buf = TIM1->CCR1;
TIM1->CNT=0;
if((read_flag&0x01) == 0)
{
if((buf>4600)&&(buf<12000)) // 這個(gè)范圍內(nèi)的心跳才是有效心跳
{
hear_rising[cnt]=buf; //獲取上一次心跳的計(jì)數(shù)值
cnt++;
}
else
{
cnt = 0;
}
}
if(cnt==3) //連續(xù)拿了6次數(shù)據(jù)
{read_flag|=(1<<0);cnt=0;}
TIM1->SR =0; //中斷標(biāo)志位清0
}
* 功能說(shuō)明:讀心率數(shù)據(jù);
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); //測(cè)量完成標(biāo)志位
return temp;
}
read_flag &= ~(1<<1);
return 0; //讀取三次不夠,返回上一次的值
}
4、網(wǎng)絡(luò)部分
由于大都老年人都在有WIFI覆蓋的房子內(nèi)活動(dòng),所以可采用慶科的EMW3080 WIFI模塊,鏈接是使用smartlink功能,通過(guò)手機(jī)APP來(lái)進(jìn)行鏈接的,與服務(wù)器通信部分采用的websocket協(xié)議,實(shí)現(xiàn)了全雙工實(shí)時(shí)通信。
5、報(bào)警部分
通過(guò)對(duì)手機(jī)APP設(shè)置報(bào)警功能觸發(fā)功能,一旦手表判斷體征異常就會(huì)發(fā)出報(bào)警信息,當(dāng)佩戴者點(diǎn)擊確定后,手機(jī)APP端會(huì)自動(dòng)報(bào)警。為了防止誤判,體征異常是否發(fā)出報(bào)警信息這里需要點(diǎn)擊確定或者取消。當(dāng)佩戴者一定時(shí)間內(nèi)都沒(méi)有點(diǎn)擊確認(rèn)或者取消時(shí),手表會(huì)認(rèn)為佩戴者已經(jīng)無(wú)法正常操作,并自動(dòng)向APP發(fā)送報(bào)警信息,通知手機(jī)端。
6、體溫心率血壓方面部分進(jìn)行實(shí)時(shí)的采樣設(shè)定每隔30s進(jìn)行傳送。
(0.15 MB)下載
11291067: 你好,對(duì)你這個(gè)項(xiàng)目感興趣,方便進(jìn)一步溝通嗎
回復(fù)