单片机设计:TI杯大学生电子设计竞赛A题–无线运动传感节点(ads1292传感器+lmt70温度模块+mpu6050模块+OLED+WiFi模块+手机app)

一、主要功能:

1.ads1292模块检测老人的心率,mpu6050模块进行计步,lmt70检测人体温度

2.oled屏幕、手机app显示当前检测的数据

3..纯手工焊接或者pcb

当然也可以添加其他功能

~ 定制可赠送资料:

1.实物

2.源码以及手机app

3.原理图

4.售后线上服务(代码讲解)

二、实物图:

三、部分源码:

主函数源码:

int main(void)
{
  /* USER CODE BEGIN 1 */
    arm_fir_instance_f32 S1;
    arm_fir_instance_f32 S2;
    
    uint32_t p_num=0;          // 用于刷新最大值和最小值
    uint32_t min[2]={0xFFFFFFFF,0xFFFFFFFF};
    uint32_t max[2]={0,0};
    uint32_t Peak;                    // 峰峰值
    uint32_t BPM_LH[3];        // 用于判断波峰
    float BPM;                // 心率
    
    flog=0;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  MX_TIM2_Init();
  MX_ADC1_Init();
  MX_SPI1_Init();
  /* USER CODE BEGIN 2 */
  
  
    OLED_Init(); // oled初始化
    OLED_ShowChinese(32,16,0,16,1);//初
    OLED_ShowChinese(48,16,1,16,1);//始
    OLED_ShowChinese(64,16,2,16,1);//化
    OLED_ShowChinese(80,16,3,16,1);//中
    OLED_ShowString(0,0,(uint8_t *)"      WIFI    ",16,1);
    OLED_Refresh();//刷新OLED
    
    HAL_UART_Receive_DMA(&huart1, UART_RX_BUF, UART_RX_LEN);       
    __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); 
    HAL_Delay(1000);
    
    Wifi_Init();                  //wifi初始化函数
//    HAL_Delay(1000);

//    sprintf(buf,"buf:%s ",UART_RX_BUF);//温度数据转换
    
    OLED_ShowString(0,32,(uint8_t *)"wifiwc",16,1);//显示当前状态

    OLED_Refresh();//刷新OLED

    MPU_Init();            //MPU6050初始化
    mpu_dmp_init();        //dmp初始化
    
    OLED_ShowString(0,32,(uint8_t *)"MPUwc",16,1);//显示当前状态

    OLED_Refresh();//刷新OLED
    ADX922_PowerOnInit();
    OLED_ShowString(0,48,(uint8_t *)"ADSwc",16,1);//显示当前状态

    OLED_Refresh();//刷新OLED
    HAL_TIM_Base_Start_IT(&htim2);//  发心跳包
    HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&AD_Value,2);
//    HAL_ADCEx_Calibration_Start(&hadc1);    //AD校准

//HAL_UART_Transmit(&huart2,(uint8_t *)xtb, 2, 200);//发送心跳包
    
    // 初始化结构体S1
    arm_fir_init_f32(&S1, NumTaps, (float32_t *)LPF_2Hz, firState1, blockSize);
    // 初始化结构体S2
    arm_fir_init_f32(&S2, NumTaps, (float32_t *)BPF_5Hz_40Hz, firState2, blockSize);
    
    CS_L;
    Delay_1us(10);
    SPI1_ReadWriteByte(RDATAC);        // 发送启动连续读取数据命令
    Delay_1us(10);
    CS_H;                        
    START_H;                 // 启动转换
    CS_L;

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
          if(UART_RX_STA & 0x8000)//接收到APP发送的数据
        {
        
            if(UART_RX_BUF[0] == 0x30)
            {
                Data_Processing((uint8_t* )UART_RX_BUF);//进行数据处理
                
            }
            UART_RX_STA = 0;//将标志为清0
        }

//    OLED_ShowString(0,0,(uint8_t *)"      end  ",16,1);//显示当前状态
//    OLED_Refresh();//刷新OLED
        
        if(flog==1)
        {
            Input_data1=(float32_t)(ch1_data^0x800000);
            // 实现FIR滤波
            arm_fir_f32(&S1, &Input_data1, &Output_data1, blockSize);
            Input_data2=(float32_t)(ch2_data^0x800000);
//            // 实现FIR滤波
            arm_fir_f32(&S2, &Input_data2, &Output_data2, blockSize);
            // 比较大小
//            if(min[1]>Output_data2)
//                min[1]=Output_data2;
//            if(max[1]<Output_data2)
//                max[1]=Output_data2;
            
            if(min[1]>Output_data2) min[1]=Output_data2;
                
            if(max[1]<Output_data2) max[1]=Output_data2;
                
            BPM_LH[0]=BPM_LH[1];
            BPM_LH[1]=BPM_LH [2];
            BPM_LH[2]=Input_data2;
            if((BPM_LH[0]<BPM_LH[1])&&(BPM_LH[1]>max[0]-Peak/3)&&(BPM_LH[2]<BPM_LH[1]))
            {
                BPM=(float)(60000.0/(point_cnt*4)+50.221);
                point_cnt=0;
//                if(BPM<200)
//                {
//                    sprintf(Heart_rate,"%.3f",BPM);
//                    
                    sprintf(Input1,"%.3f",Input_data2);
                        LCD_WriteString(124, 200, LCD_COLOR_BLACK, LCD_COLOR_WHITE, (uint8_t *)but);
//                    Release((char*)"Heart_rate",(char*)Heart_rate);    //发布                

                    OLED_ShowString(0,48,(uint8_t *)"hr:   ",16,1);//显示当前状态
                    OLED_ShowString(48,48,(uint8_t *)Heart_rate,16,1);//显示当前状态
                    OLED_ShowString(48,32,(uint8_t *)Input1,16,1);//显示当前状态
                    OLED_Refresh();//刷新OLED
//                    
//                }
            }
            
            // 每隔2000个点重新测量一次最大最小值
            p_num++;;
            if(p_num>2000)
            {
                min[0]=min[1];            
                max[0]=max[1];
                min[1]=0xFFFFFFFF;
                max[1]=0;
                Peak=max[0]-min[0];
                p_num=0;
            }
            // 数据:呼吸波、心电信号、心率
//            printf("B: %8d",(u32)Output_data1);
//            printf("A: %8d",((u32)Output_data2));
//            printf("C: %6.2f",(BPM));
            sprintf(Heart_rate,"%.3f",BPM);
            OLED_ShowString(0,48,(uint8_t *)"hr:   ",16,1);//显示当前状态
            OLED_ShowString(48,48,(uint8_t *)Heart_rate,16,1);//显示当前状态
            OLED_Refresh();//刷新OLED

            flog=0;
        }
        
        HAL_Delay (500);
//        HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&AD_Value,1);
//        Voltage=(double)AD_Value[0]*(3.3/4096)*1000;//换算实际电压 之内3.3V
//        temp=204.6398-(7.857923E-06*Voltage*Voltage)-(1.777501E-1*Voltage);//温度计算 拟合二阶传递函数  具体计算方法可参考芯片手册11-14页
        
        while(mpu_dmp_get_data(&pitch, &roll, &yaw));    //必须要用while等待,才能读取成功
//        mpu_dmp_get_data(&pitch, &roll, &yaw);
        MPU_Get_Accelerometer(&aacx,&aacy, &aacz);        //得到加速度传感器数据
        MPU_Get_Gyroscope(&gyrox, &gyroy, &gyroz);        //得到陀螺仪数据
        step(&pitch, &roll, &yaw);                        //计算步数
        dis = MPU_count*20;
        
        sprintf(Distance,"%dcm",dis);//距离数据转换
        sprintf(MPU_step,"%d",MPU_count);//步数数据转换
        sprintf(Temp,"%2d.%02dC ",(uint16_t)temp,(uint16_t)(fabs(temp)*100)%100);//温度数据转换
        
        
        OLED_ShowString(0,0,(uint8_t *)"dis:        ",16,1);//显示当前状态
        OLED_ShowString(48,0,(uint8_t *)Distance,16,1);//显示当前状态

        OLED_ShowString(0,16,(uint8_t *)"step:        ",16,1);//显示当前状态
        OLED_ShowString(64,16,(uint8_t *)MPU_step,16,1);//显示当前状态
        
        OLED_ShowString(0,32,(uint8_t *)"temp:        ",16,1);//显示当前状态
        OLED_ShowString(64,32,(uint8_t *)Temp,16,1);//显示当前状态

        OLED_Refresh();//刷新OLED
        
        Release((char*)"MPU_step",(char*)MPU_step);
        Release((char*)"Heart_rate",(char*)Heart_rate);    //发布        
  }
  /* USER CODE END 3 */
}

四、原理图:

        以下是整个工程各个模块的原理图:

 

 五、更多:

如果想要更加详细的了解整个工程的话可以去b站看这个视频演示,下面为视频链接:

单片机设计:20年电赛A题–无线运动传感节点(ads1292传感器+lmt70温度模块+mpu6050模块+OLED+WiFi模块+手机app)_哔哩哔哩_bilibili

给个免费的三连哦!!!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐