1 前言
非常开心参加本次的活动,活动有趣也是有实际用处的小作品。
开始的几篇帖子使用了寄存器开发,到了oled发现,寄存器好难弄,就改成了cubemx配置开发。
官方提供的cubemx工具好用,但是完全成了应用开发工程师了。
2 框架
pc6 用于减少目标流量,pc8用于增加目标流量。
板载的按钮用于开启关闭水泵。
oled屏幕,使用芯片的iic1接口。
pc0用于控制我们的传感器线圈,用于控制线圈的高低压电平。
pc4配置为中断,接受来自流量计的脉冲。
3 代码
接受中断的处理函数,用于处理开启水泵,上调或者减少目标流量。计算流量计的脉冲并计算,如果达到目标脉冲值,则关闭水泵,并刷新oled屏幕。
if(GPIO_Pin == GPIO_PIN_13) { printf("111--ONOROFFcount[%d]\r\n",count); flagint |= ONOROFF; onoff = 1; }else if(GPIO_Pin == GPIO_PIN_6){ printf("222--ADDFLOW count[%d]\r\n",count); if(!onoff)flagint |= ADDFLOW; }else if(GPIO_Pin == GPIO_PIN_8){ printf("333--DELFLOW count[%d]\r\n",count); if(!onoff)flagint |= DELFLOW; }else if(GPIO_PIN_4 == GPIO_Pin){ printf("++++Pulse++\r\n"); waterFlowPulseCnt++; //flagint |= WATERFLOWCPLUSE; if(goalFlowPulse <= waterFlowPulseCnt || (goalFlowPulse <= 0)){ //printf("pulse val[%d/%d]\r\n",waterFlowPulseCnt,goalFlowPulse); sprintf(&TwoStr[7], "%d ml", goalFlowcount); sprintf(&ThStr[7], "%d ", waterFlowPulseCnt); update1Line(); HAL_GPIO_WritePin(ctrl_relay_GPIO_Port, ctrl_relay_Pin,GPIO_PIN_RESET); waterFlowPulseCnt = 0; }
上调或者减少目标流量的实际处理逻辑,也是消抖的处理代码。计算流量后,同时刷新oled屏幕
}else if(flagint & ADDFLOW){ HAL_Delay(150); goalFlowcount+=100; goalFlowPulse = goalFlowcount*xishu/100; sprintf(&OneStr[7], "%d ml", goalFlowcount); sprintf(&TwoStr[7], "%d ml", 0); sprintf(&ThStr[7], "%d ", 0); update1Line(); flagint &= ~ADDFLOW; }else if(flagint & DELFLOW){ HAL_Delay(150); goalFlowcount = 100 <= goalFlowcount?goalFlowcount-100:0; goalFlowPulse = goalFlowcount*xishu/100; sprintf(&OneStr[7], "%d ml", goalFlowcount); sprintf(&TwoStr[7], "%d ml", 0); sprintf(&ThStr[7], "%d ", 0); update1Line(); flagint &= ~DELFLOW;
oled屏幕的显示,只更新三行数据,并刷新到屏幕上去。
void update1Line() { OLED_NewFrame(); OLED_PrintString(3, 5, OneStr, &font16x16, OLED_COLOR_NORMAL); OLED_PrintString(3, 25, TwoStr, &font16x16, OLED_COLOR_NORMAL); OLED_PrintString(3, 45, ThStr, &font16x16, OLED_COLOR_NORMAL); OLED_ShowFrame(); }
4 疑难杂症
本次活动遇到中断异常的问题。首先读取引脚的时候,stm32芯片非常非常容易被电磁干扰。搜索解决方案的时候,这是一个众所周知的问题,并且一直没改正。即使配置为输入模式,通过快速的定时器中断来读取脉冲值,也是失败的。
也许对于电磁感应电压时间很短,伏值较高,stm32较敏感,能够检测到,通过硬件上设计一个较大的电容,可以吸收这种短快的干扰,但是本次项目时间来不及,后去打个测试板子,试试看,是否能够吸收干扰电压。
5 总结
Let's do系列活动作为一个集结了众多参与者、充满创意与活力的平台,每一期都带给人们新的启发和思考。感谢eepw和得捷为Let's do第4期活动提供的平台,也祝愿未来的活动能够越办越好,为更多人带来收获与成长。在本次活动参与感很足,很充实,学到了很多东西,下次活动还会参加。
哔哩哔哩视频地址:Let'sDo第4期【液体流量检测仪】_哔哩哔哩_bilibili