课题要求:基于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
组织的活动 ,感谢论坛里面一些同学给的建议。