课题要求:基于STM32F103RB开发板,结合流量传感器和OLED显示屏,打造了一套可设定目标水量(100ml/200ml)的智能流量控制系统,精度误差小于5%
### 硬件全家福
组件 型号 关键参数
主控模块 STM32F103RB 72MHz Cortex-M3,128KB Flash
流量传感器 YF-S401 1-30L/min,4.5mL/脉冲
OLED显示屏 SSD1305 128x64像素,I2C接口
继电器模块 DFR0017 10A/250VAC,光耦隔离
辅助组件水管、水泵、12V电源等
连接图:

硬件连接
PA1 - YF-S401信号输出PB8 - SSD1305 SCLPB9 - SSD1305 SDAPA5 - DFR0017控制引脚VCC - 5V电源GND - 接地
软件设计
1. 主控模块通过I2C接口与OLED显示屏通信,显示当前水量,当前瞬时流量。
2. 主控模块通过定时器中断控制流量传感器,计算当前流量。
3. 主控模块通过GPIO控制继电器模块,控制水泵的开关。
4. 主控模块通过按键输入,设置目标水量。
系统架构

关键代码
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim == (&htim1))
{
pluse_count = __HAL_TIM_GET_COUNTER(&htim2); // read 1s liuliang
__HAL_TIM_SET_COUNTER(&htim2,0); //TIM2????
Flow_read();
// received =1;
}
}流量计数
void Flow_read(void)
{
// ?? Flow_Model ?????????
if(pluse_count > 0)
{
accLiuliang += (pluse_count*1000 / pulseCntValue); //mL pulseCntValue = 5300
pluse1L+=pluse_count;
flow_inst =pluse_count / flowKValue; //??(L/min)
// if(pluse_count >= 1000000)
// {
// pluse_count = 0;
// }
}
else
{
flow_inst = 0;
}
if(TARGET100ML)
{
RELAY_OFF();
}
else if(TARGET200ML)
RELAY_OFF();
received = 0; //?????????
pluse_count = 0; //?????
}点击板子上蓝色的按钮,可以切换目标水量为100ml或200ml。
调试经验分享
防抖处理:在中断服务中添加10ms软件延时,有效消除水流波动导致的误触发
校准技巧:
实测3次100ml水流得到脉冲数:4800,5200 5880次
取平均值:5300
继电器保护:在水泵电源端并联1N4007续流二极管,防止反向电动势损坏电路

成果展示:
100ml 水量

200mL水量

由于年底,时间较为冲忙,很多功能做的不是很完善,还有许多要学习的地方,这里感谢EEPW 与 Digikey
组织的活动 ,感谢论坛里面一些同学给的建议。
我要赚赏金
