stm32 + ads1292心率检测报警设置上下限
这个项目是在做心率检测的时候一个小伙伴提出来的,今年五一的时候提出来的想法,五一假期的时候没时间,也没心情做这个,就把这个事情搁置了,在月中做工作计划的时候,就把这个小项目排进来了,五一前做了硬件,程序一直没时间调试。正好其他项目做的不顺利,就搞一搞这种小玩意。
项目需求: 1、ads1292检测心率,在tft屏幕上显示波形和心率数值。
2、通过三个按键来设置心率范围,并在tft屏幕上显示
3、心率范围超过设置范围,蜂鸣器发生警报。
硬件: 1、单片机:stm32f103c8
2、ads1292 心率检测模块
3、心电信号发生器
单片机底板自己做的板子,ads1292模块和心电信号发生器均为芯科电子的。
ads1292检测模块:ads1292模块
心电发生器:心电信号发生器
整体效果
整体程序写起来并不难,但断断续续也花了一天时间,按键逻辑和检测逻辑不难,反而是TFT显示部分的逻辑混乱了,该清屏的时候没有清掉,按键逻辑跟清屏逻辑冲突,导致按对应的按键显示的跟预期不一样。
设置界面
黄色字体部分为设置参数,分别设置心率的最大和最小值,通过最大最小值来改变检测范围。
设置界面主要是三个按键,一个设置按键,一个数值增加,一个数值减小。
程序中通过轮询来不断检测按键状态,就可以判断对应的电平。
这是设置按键的处理函数,其他按键处理方式相同,只需要改成对应按键即可。
// 检测SET_KEY上升沿(从低到高)if(set_key_state && !set_key_last_state){// 延时消抖delay_ms(20);if(SET_KEY){// 处理SET_KEY按下事件if(current_mode == NORMAL_MODE){// 从正常模式进入设置模式(设置上限)Enter_SetMode();}else if(current_mode == SET_UPPER_MODE){// 从设置上限模式切换到设置下限模式current_mode = SET_LOWER_MODE;flash_flag = 1; Update_SetDisplay();}else if(current_mode == SET_LOWER_MODE){// 从设置下限模式保存设置并返回正常模式Save_Setting();current_mode = NORMAL_MODE;Update_SetDisplay();}}}
报警部分
报警部分主要是硬件电路,就是一个蜂鸣器,软件上主要是结合检测部分,做电平反转就可以了。
这部分主要是体现在检测心率的函数里
void Check_HeartRate(void)
{if(heart_rate > 0) // 确保心率值有效{if(heart_rate < hr_lower_limit || heart_rate > hr_upper_limit){// 心率超出范围,触发报警if(!alarm_triggered){alarm_triggered = 1;buzz_tick = sys_tick;buzz_state = 1;BUZZER = 1;}}else{// 心率在正常范围内,解除报警if(alarm_triggered){alarm_triggered = 0;BUZZER = 0;// 清除报警信息LCD_Fill(10,190,100,214,BLACK);}}}
}
调试的时候用的是心电信号发生器,这个发生器心率范围可以在60-120bpm之间任意设置,就可以在心率心率范围外进行心率测试,当心率超过设置范围,蜂鸣器就会发生警报报警。