问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32心率血氧手环项目详解:硬件设计与软件编程

创作时间:
作者:
@小白创作中心

STM32心率血氧手环项目详解:硬件设计与软件编程

引用
CSDN
1.
https://blog.csdn.net/qq_44016222/article/details/139711321

本文分享了一个基于STM32的心率血氧手环项目,详细介绍了项目的功能、硬件设计、软件编程以及实验效果。项目集成了心率血氧监测、计步、时间显示、温度监测、蓝牙控制等多种功能,具有较高的实用性和技术参考价值。

一、前言

项目成品图片:

二、项目简介

1.功能详解

基于STM32的心率血氧手环(可报警)。功能如下:

  1. 心率血氧采集:MAX30102采集人体心率和血氧
  2. 计步:ADXL345三轴加速传感器记录人行走步数
  3. 时间显示:外部DS1302时钟模块读取和保存当前实时时间(支持掉电保存)
  4. 温度采集:DS18B20温度传感器采集人体体温
  5. OLED显示:显示当前时间、体温、心率、血氧和步数信息
  6. 按键控制:调整时间和日期,为心率、血氧和体温设置正常阈值范围
  7. 异常报警:当心率、血氧和体温在阈值范围外时触发声光报警(蜂鸣器报警、指示灯闪烁)
  8. 蓝牙APP控制:手机端蓝牙app显示心率、血氧、体温和步数信息,并可设置阈值上下限和控制步数清零
  9. 跌倒检测:板子倾斜90°持续5秒以上触发跌倒监测报警

2.主要器件

  • STM32F103C8T6最小系统板
  • OLED显示屏(4针I2C协议)
  • MAX30302心率血氧传感器
  • ADXL345加速度传感器
  • DS18B20温度传感器
  • 蓝牙模块(BT04-A)
  • 蜂鸣器
  • LED灯

三、原理图设计

四、PCB硬件设计

1.PCB图

2.PCB板打样焊接图

五、程序设计

int main(void)
{
    unsigned char i;
    DelayInit();
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    I2C_Configuration(); //IIC初始化
    OLED_Init(); //OLED初始化
    KEY_Init(); //按键初始化
    DelayMs(200);
    CheckNewMcu();
  OLED_CLS();//清屏
    DS18B20_Init();
    DS1302_Init(&SysDate); 
    DelayMs(100);
    for(i=0;i<8;i++)OLED_ShowCN(i*16,2,i+8,0);//测试显示中文:欢迎使用使能手环
    DelayMs(1000);
    OLED_CLS();//清屏
    DS1302_DateRead(&SysDate);//读时间
    OLED_CLS();//清屏
    for(i=0;i<2;i++)OLED_ShowCN(i*16,4,i+16,1);//测试显示中文:心率
    for(i=0;i<2;i++)OLED_ShowCN(i*16+48,4,i+18,1);//测试显示中文:血氧
    for(i=0;i<2;i++)OLED_ShowCN(i*16+95,4,i+20,1);//测试显示中文:步数
    OLED_ShowCentigrade(112, 2);    //℃
    IIC_init();//IIC初始化
    uart1_Init(9600);
    adxl345_init();//ADXL345初始化
    Init_MAX30102();//MAX30102初始化
    TIM2_Init(99,719);   //定时器初始化,定时1ms
    //Tout = ((arr+1)*(psc+1))/Tclk ; 
    //Tclk:定时器输入频率(单位MHZ)
    //Tout:定时器溢出时间(单位us)
    while(1)
    {
          shanshuo=!shanshuo;
          KeySettings();
        DisplayTime();
          if(setn == 0)//不在设置状态下,读取相关数据
            {
                    DisplayTemperature();
                    GetSteps();
                    GetHeartRateSpO2();
                  if(fallTime==0)
                    {
                            if(displayfall==0)
                            {
                                    displayfall=1;
                                  OLED_CLS();//清屏
                                  for(i=0;i<3;i++)OLED_ShowCN(i*16+48,2,i+64,0);//测试显示中文:跌倒
                                  UsartSendReceiveData();
                                  DelayMs(1000);DelayMs(1000);
                                  OLED_CLS();//清屏
                                    for(i=0;i<2;i++)OLED_ShowCN(i*16,4,i+16,1);//测试显示中文:心率
                                    for(i=0;i<2;i++)OLED_ShowCN(i*16+48,4,i+18,1);//测试显示中文:血氧
                                    for(i=0;i<2;i++)OLED_ShowCN(i*16+95,4,i+20,1);//测试显示中文:步数
                                    OLED_ShowCentigrade(112, 2);    //℃
                            }
                    }
            }
            UsartSendReceiveData();
            DelayMs(10);
    }
}
void TIM2_IRQHandler(void)//定时器2中断服务程序,用于记录时间
{ 
      static u16 timeCount1 = 0;
      static u16 timeCount3 = 0;
      if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
        { 
            TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除中断标志位  
            timeCount1 ++;
            if(timeCount1 >= 800)  
            {
                timeCount1 = 0;
                sendFlag = 1;
                if(tiltFlag)
                {
                    if(fallTime>0)fallTime--;  //跌倒时间倒计时
                }
            }
            timeCount3 ++;
            if(timeCount3 >= 100) 
            {
                timeCount3=0;
                if(fallTime==0){        //跌倒蜂鸣器报警
                BEEP=1;
                } 
                else
                {
                    if(((hrAvg!=0)&&(hrAvg>=xinlvMax||hrAvg<=xinlvMin))||((spo2Avg!=0)&&(spo2Avg<=spo2Min))||(temperature>=tempMax||temperature<=tempMin))//不在范围蜂鸣器报警
                    {
                        BEEP=~BEEP;
                        beepFlag|=0x01;	
                    }else
                    {	
                        beepFlag&=0xFE;
                        BEEP=0;
                    }
                }
            }
        }
}
  

六、实验效果

七、资料内容

项目分享

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号