基于STM32的流量计智能流速流量监测、水泵报警系统(串口输 1100028-基于STM32的...

张开发
2026/4/3 11:43:21 15 分钟阅读
基于STM32的流量计智能流速流量监测、水泵报警系统(串口输 1100028-基于STM32的...
基于STM32的流量计智能流速流量监测、水泵报警系统串口输 1100028-基于STM32的流量计智能流速流量监测、水泵报警系统串口输出、泵启动、阈值设置、LCD1602、超阈值报警、proteus 功能描述 基于STM32F103C8单片机实现的智能流速、流量流量计设计。 实现的功能是通过信号发生器模拟齿轮传感器检测流量的大小同时计算流过液体的总容量。 可以设置最大流过的总容量当超过设定值后通过蜂鸣器与LED灯指示。 当没有超过则启动水泵控制电路带动液体流动。 数据将通过串口传输出来可以模拟出无线传输的功能如Wi-Fi、蓝牙等或RS232、RS485的功能。 1、流速检测 2、流量统计 3、阈值显示与设置通过按键实现阈值的调节或清零 4、水泵启动 5、超阈值报警 6、串口数据输出 有哪些资料 1、仿真工程文件 2、PCB工程文件 3、原理图工程文件 4、源代码最近在折腾一个基于STM32的流量监测项目挺有意思的。这个系统不仅能实时测流速流量还能自动控制水泵超标了还会亮灯叫唤特别适合用在自动化灌溉或者工业循环水系统里。咱们今天就来拆解看看这玩意儿是怎么跑起来的。先说说硬件配置STM32F103C8当大脑信号发生器模拟齿轮传感器实际用霍尔传感器也OKLCD1602显示数据按键调阈值蜂鸣器LED组队当警笛外加水泵控制电路。整个系统在Proteus里跑仿真完全没问题实测代码烧进板子也能流畅运行。核心代码里有个特别重要的中断服务程序专门处理传感器脉冲。这里用TIM2的输入捕获模式抓信号每来一个脉冲就触发一次中断。我简化了部分代码关键部分长这样volatile uint32_t pulse_count 0; // 脉冲计数器 void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2, TIM_IT_CC1) ! RESET) { pulse_count; TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); } }这个中断服务程序就像个尽职的门卫每次齿轮转过齿槽产生的脉冲都被它精准计数。实际使用中发现防抖很重要后来在硬件上加了RC滤波软件里做了10ms延时判断效果立竿见影。基于STM32的流量计智能流速流量监测、水泵报警系统串口输 1100028-基于STM32的流量计智能流速流量监测、水泵报警系统串口输出、泵启动、阈值设置、LCD1602、超阈值报警、proteus 功能描述 基于STM32F103C8单片机实现的智能流速、流量流量计设计。 实现的功能是通过信号发生器模拟齿轮传感器检测流量的大小同时计算流过液体的总容量。 可以设置最大流过的总容量当超过设定值后通过蜂鸣器与LED灯指示。 当没有超过则启动水泵控制电路带动液体流动。 数据将通过串口传输出来可以模拟出无线传输的功能如Wi-Fi、蓝牙等或RS232、RS485的功能。 1、流速检测 2、流量统计 3、阈值显示与设置通过按键实现阈值的调节或清零 4、水泵启动 5、超阈值报警 6、串口数据输出 有哪些资料 1、仿真工程文件 2、PCB工程文件 3、原理图工程文件 4、源代码流量计算才是重头戏。根据齿轮流量计的特性每个脉冲对应固定体积的液体流过。假设我们用的传感器每升50个脉冲计算逻辑是这样的float calculate_flow(uint32_t pulses) { const float LITER_PER_PULSE 0.02; // 每脉冲0.02升 static uint32_t last_pulse 0; float flow_rate (pulses - last_pulse) * LITER_PER_PULSE / SAMPLING_TIME; last_pulse pulses; return flow_rate; // 返回升/秒 }阈值设置功能全靠按键驱动。长按SET键进入设置模式加减键调整数值。这里用状态机处理按键逻辑比直接判断电平可靠得多typedef enum {NORMAL_MODE, SET_MODE} SystemMode; SystemMode current_mode NORMAL_MODE; void KEY_Handler(void) { if(KEY_SET_PRESSED()) { current_mode (current_mode NORMAL_MODE) ? SET_MODE : NORMAL_MODE; // 切模式时刷新LCD显示 LCD_ShowSettingMode(current_mode SET_MODE); } // 在设置模式下处理加减操作 if(current_mode SET_MODE) { if(KEY_UP_PRESSED()) threshold 0.5; if(KEY_DOWN_PRESSED()) threshold - 0.5; } }水泵控制逻辑贼简单但管用——流量低于阈值开水泵超标就关泵报警。注意这里用了滞回比较防止在阈值临界点频繁开关void Pump_Control(float current_flow) { static uint8_t pump_status OFF; if(current_flow (threshold - HYSTERESIS)) { PUMP_ON(); pump_status ON; } else if(current_flow (threshold HYSTERESIS)) { PUMP_OFF(); pump_status OFF; trigger_alarm(); // 触发报警 } }串口输出这块玩了个花活用printf重定向到USART1数据格式特意做成兼容JSON的样式方便后期接Wi-Fi模块。调试时建议把波特率调到115200抓包工具看得更爽// 重定向printf int fputc(int ch, FILE *f) { USART_SendData(USART1, (uint8_t) ch); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) RESET); return ch; } // 数据上报格式 void report_data(void) { printf({\flow\:%.2f,\total\:%.2f,\thres\:%.2f}\n, current_flow, total_volume, threshold); }实际调试时踩过几个坑1. 流量突增时容易误触发报警后来加了滑动窗口滤波2. LCD在强光下看不清换成高对比度屏解决3. 水泵继电器在开关瞬间会产生电压毛刺并联个续流二极管立马消停。这个项目的精髓在于各个模块的协同工作——传感器采集、核心计算、人机交互、执行机构各司其职。代码里大量使用状态机代替延时函数确保系统实时性。后续想升级的话可以加个ESP8266搞物联网远程监控或者用PID算法让水泵控制更丝滑。工程文件里有个隐藏彩蛋PCB设计时在电源部分留了钽电容位置实测接上后系统稳定性提升明显。源码中的注释比代码还多看来开发者是个强迫症晚期笑。总之这套方案拿来二次开发或者毕设都够用毕竟流量监测的套路都差不多改改参数就能适配不同场景。

更多文章