1. 项目背景与需求分析
作为一名在工业自动化领域摸爬滚打多年的工程师,我最近完成了一个特别有意思的物联网项目——智能玻璃水加注机。这个看似简单的设备,实际上融合了机械设计、电子控制和物联网技术的完整解决方案。今天我就把这个项目的完整实现过程拆解给大家,希望能给想做类似项目的朋友一些参考。
玻璃水加注机这个需求来源于洗车行业的实际痛点。传统洗车店需要人工检查并补充玻璃水,既费时又容易遗漏。而高端洗车设备集成的加注系统价格昂贵,中小型洗车店难以承受。我们的目标就是开发一套成本可控、稳定可靠的自动化解决方案。
这个项目最核心的需求可以归纳为三点:
- 精确控制加注量(误差±5ml)
- 实时监测液位并预警
- 远程监控和管理功能
2. 系统架构设计
2.1 硬件选型与配置
经过多次方案对比,我们最终确定的硬件配置如下:
- 主控单元:ESP32-WROOM-32D
- 选择理由:双核240MHz主频,内置WiFi和蓝牙,丰富的外设接口,性价比极高
- 液位传感器:US-100超声波模块
- 实测精度±3mm,完全满足5ml的精度要求
- 流量计:霍尔式水流量传感器
- 型号:YF-S201,每升脉冲数450±10%
- 执行机构:12V直流电磁阀
- 响应时间<1s,寿命10万次以上
- 电源模块:12V/5A开关电源
- 为整个系统提供稳定电力
提示:电磁阀选型时要特别注意介质兼容性,普通电磁阀的橡胶密封件可能被玻璃水腐蚀。
2.2 机械结构设计
机械部分采用模块化设计,主要包含以下组件:
- 储液罐:20L食品级PE材质
- 顶部预留安装孔位用于传感器固定
- 管路系统:
- 进液管:Φ8mm硅胶管
- 出液管:Φ6mm耐压PU管
- 安装支架:
- 2mm厚304不锈钢折弯成型
- 集成传感器固定座
特别要注意的是管路走向设计,必须确保无死弯,且电磁阀安装位置要低于储液罐底部,利用重力自流提高响应速度。
3. 核心电路设计
3.1 主控电路
ESP32的最小系统电路包括:
- 电源滤波:10μF+0.1μF MLCC组合
- 复位电路:10k上拉+100nF电容
- 下载接口:CP2102 USB转串口
特别注意:ESP32的3.3V电源要单独稳压,不能直接使用开发板上的LDO,工业环境下的电流需求可能超出其承载能力。
3.2 传感器接口电路
超声波传感器接口:
cpp复制// 硬件连接
#define TRIG_PIN 12
#define ECHO_PIN 13
// 初始化
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
流量计信号处理电路:
- 上拉电阻:10kΩ
- 滤波电容:100nF
- 施密特触发器:74HC14
3.3 功率驱动电路
电磁阀驱动采用MOSFET方案:
- 型号:IRLZ44N
- 栅极电阻:100Ω
- 续流二极管:1N4007
重要:电磁阀必须并联续流二极管,否则关断时的反电动势可能损坏MOSFET。
4. 嵌入式软件开发
4.1 主程序框架
采用FreeRTOS实现多任务管理,主要任务包括:
- 传感器数据采集(优先级3)
- 网络通信(优先级2)
- 用户交互(优先级1)
- 设备控制(优先级4)
任务间通过队列传递消息,确保实时性要求最高的传感器采集任务不会被阻塞。
4.2 液位测量算法
超声波测距需要经过温度补偿:
cpp复制float getDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
float distance = duration * 0.034 / 2; // 声速340m/s
// 温度补偿
float temp = readTemperature();
distance *= sqrt(1 + temp/273.15);
return distance;
}
4.3 流量累计计算
基于霍尔流量计的脉冲计数:
cpp复制volatile int pulseCount = 0;
void IRAM_ATTR pulseCounter() {
pulseCount++;
}
void setup() {
attachInterrupt(digitalPinToInterrupt(FLOW_PIN), pulseCounter, FALLING);
}
float getVolume() {
noInterrupts();
int pulses = pulseCount;
pulseCount = 0;
interrupts();
return pulses / 450.0; // 450 pulses per liter
}
5. 物联网平台对接
5.1 MQTT通信实现
使用PubSubClient库连接阿里云IoT平台:
cpp复制#include <PubSubClient.h>
#include <WiFi.h>
WiFiClient espClient;
PubSubClient client(espClient);
void reconnect() {
while (!client.connected()) {
if (client.connect("device01", "your-username", "your-password")) {
client.subscribe("glasswater/control");
} else {
delay(5000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
// 处理控制指令
}
5.2 数据上报格式设计
采用JSON格式上报设备状态:
json复制{
"deviceId": "GW001",
"timestamp": 1634567890,
"volume": 15.2,
"level": 65.5,
"status": "normal",
"alarm": null
}
6. 实际部署与调试
6.1 安装注意事项
- 储液罐要安装在高于加注口的位置
- 所有电气连接必须做好防水处理
- 流量计安装要保证满管状态
- 超声波传感器与液面保持垂直
6.2 校准流程
- 空罐校准:记录超声波测距最大值
- 满罐校准:加入已知体积液体,记录距离值
- 流量校准:使用量杯收集实际出液量,调整脉冲系数
6.3 常见问题排查
问题1:流量计读数不稳定
- 检查管路是否有气泡
- 确认安装方向正确(箭头指示流向)
- 检查电源是否稳定
问题2:电磁阀无法关闭
- 测量线圈电阻(正常值约50Ω)
- 检查续流二极管是否击穿
- 确认MOSFET栅极驱动电压
问题3:WiFi频繁断开
- 调整天线位置
- 修改路由器信道避开干扰
- 增加看门狗复位机制
7. 项目优化与扩展
在实际运行三个月后,我们针对用户反馈做了以下改进:
-
增加预约加注功能
- 通过APP设置加注时间
- 支持循环任务(如每天9:00自动检查)
-
改进液位检测算法
- 增加移动平均滤波
- 异常值剔除
-
电源管理优化
- 增加UPS备用电源
- 低功耗模式设计
这个项目从构思到最终落地用了近两个月时间,期间遇到了不少挑战,但最终实现的系统稳定运行了一年多,得到了客户的高度认可。最关键的经验是:工业环境下的物联网设备,可靠性永远是第一位的。下一篇文章我会详细介绍这个项目的云端管理平台开发过程。