功能介绍:采用stm32单片机作为主控CPU,采用MAX30102模块采集心率和血氧,采用MSP20血压传感器采集血压,OLED显示相关数据,并且通过蓝牙模块HC-05上传到手机APP,当心率低于50或者血氧低于90%,蜂鸣器进行报警,文末有资料分享:
27-基于stm32单片机心率血氧血压检测报警系统(程序+原理图+元件清单全套资料)
程序部分展示,有中文注释,新手容易看懂
struct
{
float Hp ; //血红蛋白
float HpO2; //氧合血红蛋白
}g_BloodWave;//血液波形数据
BloodData g_blooddata = {0}; //血液数据存储
#define CORRECTED_VALUE 47 //标定血液氧气含量
/*funcation start ------------------------------------------------------------*/
//血液检测信息更新
void blood_data_update(void)
{
//标志位被使能时 读取FIFO
g_fft_index=0;
while(g_fft_index < FFT_N)
{
while(MAX30102_INTPin_Read()==0)
{
//读取FIFO
max30102_read_fifo(); //read from MAX30102 FIFO2
//将数据写入fft输入并清除输出
if(g_fft_index < FFT_N)
{
//将数据写入fft输入并清除输出
s1[g_fft_index].real = fifo_red;
s1[g_fft_index].imag= 0;
s2[g_fft_index].real = fifo_ir;
s2[g_fft_index].imag= 0;
g_fft_index++;
}
}
}
}
//血液信息转换
void blood_data_translate(void)
{
float n_denom;
uint16_t i;
// 4 pt Moving Average
// printf("****************red******************************************************************\r\n");
// for(i = 0;i < FFT_N;i++)
// {
// printf("%f\r\n",s1[i].real);
// }
// printf("***************** ir*****************************************************************\r\n");
// for(i = 0;i < FFT_N;i++)
// {
// printf("%f\r\n",s2[i].real);
// }
//直流滤波
float dc_red =0;
float dc_ir =0;
float ac_red =0;
float ac_ir =0;
for (i=0 ; i<FFT_N ; i++ )
{
dc_red += s1[i].real ;
dc_ir += s2[i].real ;
}
dc_red =dc_red/FFT_N ;
dc_ir =dc_ir/FFT_N ;
for (i=0 ; i<FFT_N ; i++ )
{
s1[i].real = s1[i].real - dc_red ;
s2[i].real = s2[i].real - dc_ir ;
}
//移动平均滤波
//printf("***********8 pt Moving Average red******************************************************\r\n");
for(i = 1;i < FFT_N-1;i++)
{
n_denom= ( s1[i-1].real + 2*s1[i].real + s1[i+1].real);
s1[i].real= n_denom/4.00;
n_denom= ( s2[i-1].real + 2*s2[i].real + s2[i+1].real);
s2[i].real= n_denom/4.00;
}
//八点平均滤波
for(i = 0;i < FFT_N-8;i++)
{
n_denom= ( s1[i].real+s1[i+1].real+ s1[i+2].real+ s1[i+3].real+ s1[i+4].real+ s1[i+5].real+ s1[i+6].real+ s1[i+7].real);
s1[i].real= n_denom/8.00;
n_denom= ( s2[i].real+s2[i+1].real+ s2[i+2].real+ s2[i+3].real+ s2[i+4].real+ s2[i+5].real+ s2[i+6].real+ s2[i+7].real);
s2[i].real= n_denom/8.00;
// printf("%f\r\n",s1[i].real);
}
//printf("************8 pt Moving Average ir*************************************************************\r\n");
// for(i = 0;i < FFT_N;i++)
// {
// // printf("%f\r\n",s2[i].real);
// }
//printf("**************************************************************************************************\r\n");
//开始变换显示
g_fft_index = 0;
//快速傅里叶变换
FFT(s1);
FFT(s2);
下面是原理图文件展示: