由于这个项目,我想用CubaMX来做,但是对于F103这种比较老的MCU来说,CubaMx确实教程比较少,所以,中间还是遇到很多困难,好在最后也完成了。
但是整个项目还是会有没有很完善的地方,还请看帖子的大佬们加以指正。
先贴上成功视频链接,由于这个水泵真的太慢了,(我没有录完,最后拍了两张照片)
https://www.bilibili.com/video/BV14gwWe3EGQ/?vd_source=d55867111798317066d09ccf8009a9d4
这个帖子主要讲解怎么接受脉冲。
说到脉冲,就需要说到电平,高电平还是低电平。
有电平的变化,MCU就可以检测到。
这个水流量检测仪不知道是太简单了还是什么,大家好像都没有特地说明他一升水是多少个脉冲之类的数据。 我在淘宝找到了一张图。
我大概算了一下,差不多1ml就是4个点左右,所以我后面粗略的以4个点计算为1ml水
这里用到了一个TIM的回调函数
#define POINTS_PER_ML 4 // 每 1ml 对应的点数 uint16_t ml_count = 0; // 用于存储毫升数 uint16_t ml_countx = 0; // 用于存储毫升数 void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim == &htim2) { ml_countx++; // 每次捕获时增加计数 pulse_count++; // 每达到 4点时,表示 1 ml if (pulse_count >= POINTS_PER_ML) { // 增加 1ml 计数 ml_count++; // 显示当前的毫升数(例如显示到 OLED) OLED_ShowNum(48, 4, ml_count,6, 16,0); // 显示毫升数,假设从 OLED 显示坐标(48, 4)开始,3 位数字,16 字体大小 if(ml_count>=330) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 设置为高电平 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET); // 设置为高电平 } OLED_ShowNum(48, 2, ml_countx,6, 16,0); // 显示毫升数,假设从 OLED 显示坐标(48, 4)开始,3 位数字,16 字体大小 // 重置 pulse_count 为 0,开始计算下一个 1ml pulse_count = 0; } } }
并且我把一瓶水330ml写成了固定值(这是我这里没有完善的部分,按照常理来说应该是做成用按钮控制。可以编辑一个图形界面之类的,可以设置,然后设置多少ml可以自动计量然后开关继电器)
但是,这个水泵真的是水太小了,放水桶里放了几天他生锈了,感觉他快坏了,勉强完成了任务。
用cubamx就是为了配置方便,省去了太多代码了。
还有GPIO部分的设置。
继电器的Input 接PA8或者PA5,通过
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 设置为高电平 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET); // 设置为高电平
很简单的这样调用方法,就可以设置成高电平。使继电器控制水泵暂停。
本次的DIY到这就告一段落了。
期间谢谢论坛里的各位大佬发的帖子,从里面学到了很多知识,谢谢大家。