单片机设计:TI杯大学生电子设计竞赛A题–无线运动传感节点(ads1292传感器+lmt70温度模块+mpu6050模块+OLED+WiFi模块+手机app)
单片机设计:TI杯大学生电子设计竞赛A题–无线运动传感节点(ads1292传感器+lmt70温度模块+mpu6050模块+OLED+WiFi模块+手机app)
单片机设计: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();//刷新OLEDflog=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
给个免费的三连哦!!!
更多推荐
所有评论(0)