1. 项目概述:STM32水位检测自动控制系统设计
这个项目用STM32单片机搭建了一套完整的水位检测与自动控制系统,核心功能是通过超声波模块实时监测水位高度,结合DS18B20温度传感器进行环境温度补偿,实现高精度水位测量。系统支持自动控制水泵或阀门,当水位低于设定阈值时自动补水,高于阈值时停止供水,整个过程无需人工干预。
我在工业自动化领域做过多个类似项目,发现这种方案特别适合水箱管理、农业灌溉、地下室积水预警等场景。相比传统机械式浮球开关,超声波检测没有机械磨损,寿命更长;加上温度补偿后,测量精度能控制在±1cm以内,远超市面上大多数民用级水位控制器。
整套系统硬件成本可以控制在200元以内(不含执行机构),核心部件包括:
- STM32F103C8T6最小系统板(蓝色药丸板)
- HC-SR04超声波模块
- DS18B20防水型温度传感器
- 继电器模块(驱动水泵/电磁阀)
- 自定义设计的PCB电路板
关键提示:选择STM32F103C8T6是因为其内置的定时器资源非常适合超声波测距的脉冲计时,同时72MHz主频能轻松处理温度补偿算法,性价比远超51单片机。
2. 硬件设计详解
2.1 核心传感器选型
HC-SR04超声波模块的工作电压为5V,包含发射与接收两部分。其测距原理是:
- 触发引脚输入10μs以上高电平
- 模块自动发送8个40kHz超声波脉冲
- 接收到回波后,回声引脚输出高电平
- 高电平持续时间与距离成正比(每58μs对应1cm)
实际使用中发现两个关键点:
- 测量周期建议≥60ms,避免前次回波干扰
- 水面波动会导致读数跳变,需要软件滤波
DS18B20采用单总线协议,防水封装可直接浸入液体。其特点包括:
- 测量范围-55℃~+125℃
- ±0.5℃精度(-10℃~85℃范围内)
- 无需外部元件,寄生供电模式下仅需3.0~5.5V
避坑经验:DS18B20的时序要求严格,建议使用STM32的硬件定时器生成1μs基准延时,软件模拟时序容易因中断干扰导致读取失败。
2.2 STM32外围电路设计
原理图设计要点(完整原理图见附录):
- 超声波模块的Trig引脚接PA0(TIM2_CH1)
- Echo引脚接PA1(TIM2_CH2)用于输入捕获
- DS18B20数据线接PA2,加上拉电阻4.7KΩ
- 继电器控制接PA4,通过S8050三极管驱动
- 预留USART1(PA9/PA10)用于调试输出
电源部分特别注意:
c复制// 典型接线方案
+5V ──┬── HC-SR04.VCC
├── DS18B20.VDD
└── LM1117-3.3 ── STM32.VDD
3. 软件实现关键代码
3.1 超声波测距实现
使用TIM2的输入捕获功能测量高电平时间:
c复制// TIM2初始化(72MHz主频)
void TIM2_Init(void) {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
TIM_TimeBaseStructure.TIM_Prescaler = 71; // 1MHz计数频率
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_Cmd(TIM2, ENABLE);
}
// 获取距离(单位:cm)
float Get_Distance(void) {
GPIO_SetBits(GPIOA, GPIO_Pin_0); // Trig高电平
delay_us(20);
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)); // 等待回波
TIM_SetCounter(TIM2, 0);
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)); // 测量高电平时间
uint16_t pulse = TIM_GetCounter(TIM2);
return pulse / 58.0; // 换算为厘米
}
3.2 温度补偿算法
超声波在空气中的传播速度随温度变化:
code复制v = 331.4 + 0.6 * T (T为摄氏温度)
实现代码:
c复制float Temperature_Compensation(float raw_distance, float temperature) {
float sound_speed = 331.4 + 0.6 * temperature;
return raw_distance * 343.0 / sound_speed; // 343为20℃时声速
}
3.3 主控制逻辑
采用状态机实现智能控制:
c复制typedef enum {
STATE_IDLE,
STATE_LOW_LEVEL,
STATE_HIGH_LEVEL,
STATE_EMERGENCY
} SystemState;
void Control_Task(void) {
static SystemState state = STATE_IDLE;
float distance = Get_CompensatedDistance();
switch(state) {
case STATE_IDLE:
if(distance > HIGH_LEVEL_THRESHOLD) {
Pump_Off();
state = STATE_HIGH_LEVEL;
} else if(distance < LOW_LEVEL_THRESHOLD) {
Pump_On();
state = STATE_LOW_LEVEL;
}
break;
case STATE_LOW_LEVEL:
if(distance > (LOW_LEVEL_THRESHOLD + HYSTERESIS)) {
Pump_Off();
state = STATE_IDLE;
}
break;
case STATE_HIGH_LEVEL:
if(distance < (HIGH_LEVEL_THRESHOLD - HYSTERESIS)) {
state = STATE_IDLE;
}
break;
case STATE_EMERGENCY: // 水位异常处理
Pump_Off();
Alarm_On();
break;
}
}
4. 系统优化与问题排查
4.1 测量精度提升技巧
-
多次采样取中值:连续测量5次,去掉最大最小值后取平均
c复制#define SAMPLE_TIMES 5 float samples[SAMPLE_TIMES]; for(int i=0; i<SAMPLE_TIMES; i++) { samples[i] = Get_CompensatedDistance(); delay_ms(10); } qsort(samples, SAMPLE_TIMES, sizeof(float), compare_float); float valid_distance = (samples[1]+samples[2]+samples[3])/3; -
动态温度补偿:DS18B20每10秒读取一次温度,避免频繁访问单总线
-
水面波动滤波:采用一阶滞后滤波算法
c复制#define FILTER_GAIN 0.2f float filtered_distance = last_distance * (1-FILTER_GAIN) + new_distance * FILTER_GAIN;
4.2 常见故障排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 超声波一直返回0 | 接线错误/模块损坏 | 检查VCC/GND,更换模块 |
| 测量值波动大 | 水面剧烈波动 | 增加软件滤波,安装导波管 |
| DS18B20读取失败 | 时序不准确/上拉电阻过大 | 使用硬件定时器,电阻换4.7KΩ |
| 继电器不动作 | 驱动三极管损坏 | 检查BE结电压,更换S8050 |
4.3 PCB设计注意事项
- 超声波模块远离MCU的晶振区域
- DS18B20数据线走线尽量短(<20cm)
- 继电器线圈并联续流二极管(1N4007)
- 电源部分增加100μF电解电容滤波
5. 项目扩展方向
- 无线传输功能:添加ESP8266模块,通过MQTT协议上报数据到云平台
- 历史数据记录:外接SPI Flash存储水位变化曲线
- 多级水位控制:设置多个阈值实现分级报警
- 手机APP控制:开发蓝牙或WiFi控制界面
实际部署时发现,在露天环境安装超声波模块需要加装防晒罩,避免阳光直射导致温度漂移。我曾在一个农场灌溉项目中,用PVC管制作了简易导波筒,使测量稳定性提升了60%以上。
