聚豐項目 > 老人健康監測儀
隨著我國老齡化的逐步加劇,老年人的健康安全問題成為當今社會首要解決的問題,該項目主要是實現實時監測中老年人生理狀態可穿戴的便捷醫療系統。其系統是以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: 你好,對你這個項目感興趣,方便進一步溝通嗎
回復