1. 项目背景与核心功能解析
这个基于STM32的水位检测自动控制系统,本质上解决的是工业和生活场景中液体储罐的智能化管理问题。我在去年参与过一个化工厂的溶剂储罐改造项目,当时老旧的浮球式液位计频繁卡死导致多次溢罐事故,这让我深刻认识到可靠水位检测的重要性。
系统采用STM32F103C8T6作为主控芯片(蓝色pill开发板的核心型号),通过HC-SR04超声波模块实现非接触式测距,配合DS18B20数字温度传感器进行温度补偿。实际测试中,在2米深的储水箱上安装时,常温下测距误差可控制在±3mm以内,但在高温蒸汽环境中会出现10-15mm的漂移,这正是需要温度补偿的原因。
关键设计要点:超声波模块的测量盲区(约2-3cm)决定了最低水位不能设置得过低,我在电路设计中特意将探头安装位置下移了5cm来规避这个问题。
2. 硬件架构设计与元器件选型
2.1 主控电路设计
采用经典的STM32最小系统设计:
- 主芯片:STM32F103C8T6(72MHz Cortex-M3内核)
- 供电方案:AMS1117-3.3V稳压芯片,支持5-12V宽电压输入
- 调试接口:SWD四线制(比JTAG节省引脚)
- 外扩存储:SPI Flash(W25Q16)用于记录历史数据
特别要注意的是,在PCB布局时:
- 稳压芯片要加装散热片
- 晶振电路尽量靠近MCU
- 所有数字电源引脚必须放置0.1μF去耦电容
2.2 传感器接口电路
超声波模块接口设计要点:
- 触发信号(Trig)需10μs以上的高电平脉冲
- 回波信号(Echo)通过定时器输入捕获测量
- 信号线上串联100Ω电阻防止振铃
DS18B20的硬件注意事项:
- 单总线需要4.7K上拉电阻
- 长距离传输时要改用屏蔽线
- 多个传感器并联时需要ROM匹配
3. 软件算法实现细节
3.1 超声波测距算法优化
原始距离计算公式:
code复制距离(cm) = (回波时间(μs) × 声速(340m/s)) / 2
实际代码中需要加入温度补偿:
c复制float get_corrected_distance(float raw_distance, float temp) {
float sound_speed = 331.4 + (0.606 * temp); // 声速温度补偿公式
return raw_distance * 340 / sound_speed;
}
我在项目中发现,每隔5次测量取中值滤波的效果最好,既能消除偶然误差,又不会像均值滤波那样滞后严重。
3.2 水位控制逻辑实现
采用三段式控制策略:
- 低水位区间(<30%):启动进水阀,关闭排水
- 安全水位区间(30%-80%):维持现状
- 高水位区间(>80%):开启报警并启动排水
通过状态机实现可避免频繁切换:
c复制typedef enum {
STATE_FILLING,
STATE_NORMAL,
STATE_DRAINING
} WaterState;
void update_control_state(float level) {
static WaterState current_state = STATE_FILLING;
switch(current_state) {
case STATE_FILLING:
if(level > 30) current_state = STATE_NORMAL;
break;
// 其他状态转换逻辑...
}
}
4. 系统调试与性能优化
4.1 超声波模块校准
使用标准量具实测发现的问题:
- 近距离(<20cm)测量值偏大
- 远距离(>1.5m)测量值偏小
通过分段线性补偿解决:
c复制float calibrate_distance(float raw) {
if(raw < 20) return raw * 0.95;
else if(raw > 150) return raw * 1.03;
else return raw;
}
4.2 抗干扰措施
在工业现场遇到的典型干扰:
- 变频器导致超声波回波失真
- 电机启停造成电源波动
采取的解决方案:
- 为超声波模块单独供电
- 在电源入口加装π型滤波器
- 软件上增加异常值剔除机制
5. 扩展功能实现方案
5.1 无线数据传输
通过ESP-01S模块实现WiFi上传:
- 配置AT指令模式
- 建立TCP连接至服务器
- 定时发送JSON格式数据:
json复制{
"device_id": "WT_001",
"water_level": 65.2,
"temperature": 28.7,
"timestamp": 1654321000
}
5.2 历史数据存储
利用片内Flash模拟EEPROM:
- 定义专门的数据页(Page 60-63)
- 采用环形缓冲存储结构
- 每个记录包含:
- 水位值(float)
- 时间戳(uint32_t)
- 状态标志(uint8_t)
写入前需要先擦除整个页:
c复制void flash_erase_page(uint32_t page_addr) {
FLASH_Unlock();
FLASH_ErasePage(page_addr);
FLASH_Lock();
}
6. 常见问题排查指南
6.1 超声波模块无响应
排查步骤:
- 检查VCC电压(5V±0.5V)
- 用示波器观察Trig信号
- 测量Echo引脚是否保持高电平
- 尝试更换探头(可能晶振损坏)
6.2 DS18B20读取失败
典型错误代码及含义:
- 0x00:总线短路
- 0xFF:设备未响应
- 其他值:CRC校验失败
复位时序要严格满足:
- 480μs低电平复位脉冲
- 等待60μs后检测应答
- 总计时序误差不超过15μs
7. 项目进阶改进方向
在现有基础上可以扩展:
- 增加LoRa远传功能(适合无网络场景)
- 实现PID控制算法优化进水速度
- 添加TFT触摸屏进行本地设置
- 开发微信小程序远程监控
一个实用的改进案例:通过检测水位变化速率,可以提前发现管道泄漏——当单位时间内水位下降超过设定阈值时触发泄漏报警,这个功能在某净水厂项目中成功预防了多次管路破裂事故。
