这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【Let'sdo第四期-液体流量检测仪DIY】-成果展示

共2条 1/1 1 跳转至

【Let'sdo第四期-液体流量检测仪DIY】-成果展示

菜鸟
2025-01-22 22:30:44     打赏

1 前言

    非常开心参加本次的活动,活动有趣也是有实际用处的小作品。

开始的几篇帖子使用了寄存器开发,到了oled发现,寄存器好难弄,就改成了cubemx配置开发。

官方提供的cubemx工具好用,但是完全成了应用开发工程师了。

2 框架

    pc6 用于减少目标流量,pc8用于增加目标流量。

  板载的按钮用于开启关闭水泵。

oled屏幕,使用芯片的iic1接口。

pc0用于控制我们的传感器线圈,用于控制线圈的高低压电平。

pc4配置为中断,接受来自流量计的脉冲。

image.png

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

代码:OLED096-RBT6.zip


专家
2025-01-23 00:03:08     打赏
2楼

感谢分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]