STM32智能饮水机设计
HX711称重式水量检测+DS18B20温控+ESP8266远程监控,物联网改造一台传统饮水机
公司楼道那台老饮水机,水温全靠猜、水桶换没换没人知道、下班忘关电烧一整晚——这篇基于 STM32 的智能饮水机就是冲着这些痛点去的:DS18B20 实时测温自动加热、HX711+称重传感器"称"出水量自动补水、OLED 显示水温水量、ESP8266 上网手机远程控制加水加热。方案怎么定、器件怎么选、电路怎么连、程序怎么写、整机怎么调,一次讲透,给传统家电做物联网改造提供一个完整参考。
一、系统功能拆解
一句话总结:温度重量双参数采集 → 阈值闭环控制(加热/补水)→ 本地显示 + WiFi 远程监控。
| 功能 | 实现方式 | 对应硬件 |
|---|---|---|
| 水温检测 | 单总线数字温度传感器 | DS18B20 |
| 自动加热 | 水温低于阈值 → 继电器开加热器 | 继电器 + 加热模块 |
| 水量检测 | 称重传感器测重换算水量(非接触式) | HX711 + 电阻应变式称重传感器 |
| 自动补水 | 重量低于阈值自动加水,到最大水量停 | 继电器 + 水泵/电磁阀 |
| 阈值设定 | 按键设定水温、水量阈值 | 独立按键 |
| 手动控制 | 加水/加热按键直接开关 | 独立按键 |
| 数据显示 | 水温、水量、状态实时刷新 | OLED12864(SSD1306) |
| 远程监控 | WiFi 透传 TCP 服务器,APP 查看+控制 | ESP8266-01S |
亮点在水量检测方式:不插电极、不泡浮子,整个水桶坐在称重传感器上"称重算水量"——非接触、不怕水垢、不怕腐蚀,比电极式水位检测干净一个档次。
二、器件选型:每个模块都对比过
| 器件 | 选型结果 | 淘汰方案 | 核心理由 |
|---|---|---|---|
| 主控 | STM32F103C8T6 | nRF52840 | 性价比高、生态成熟,功能够用不浪费 |
| 温度 | DS18B20 | LM35 | 数字输出免 ADC、单总线抗干扰 |
| 重量 | HX711 称重模块 | FSR402 力敏电阻 | 24位 ADC 精度高、稳定性好 |
| 无线 | ESP8266-01S | nRF905 | 直连 WiFi 上互联网,社区资源多 |
| 显示 | OLED12864 | ST7735 彩屏 | 自发光低功耗、广视角对比度高 |
几个关键选型理由展开讲:
- HX711 vs FSR402:力敏电阻薄、响应快,但它是模拟输出且线性度差,做"大概压多重"可以,做"还剩几升水"就抓瞎;HX711 是专为称重设计的 24 位 A/D 转换器,配桥式称重传感器直接输出高精度数字量,配合去皮和校准系数,水量误差能控制在很小范围。
- ESP8266 vs nRF905:nRF905 是 433MHz 私有协议,传输远但要自建接收端,到不了"手机随时看";ESP8266 直连家里/办公室路由器走 TCP,天然入互联网,远程监控的语义它才真正满足。
- DS18B20 vs LM35:老生常谈但每次都值得说——模拟输出的 LM35 在加热器继电器频繁开关的电磁环境里太容易被干扰,数字输出的 DS18B20 一根线出数据,可靠性不在一个量级。
整套物料成本约 80~100 元(含称重传感器),比多数水位方案贵一点点,但换来的是免维护的水量检测。
三、电路设计:接线表 + 关键要点
主控最小系统:3.3V 供电,8MHz 主晶振 + 32.768kHz RTC 晶振(带备用电池),复位电路 NRST + 上拉电阻 + 去耦电容。
| 模块 | 接口方式 | 连接引脚(参考) | 备注 |
|---|---|---|---|
| DS18B20 | 单总线 | PB8 | 4.7kΩ 上拉到 3.3V |
| HX711 | 双线时序 | SCK→PB12,DOUT→PB13 | 5V 供电,桥式传感器接 E+/E-/A+/A- |
| ESP8266-01S | UART2 | PA2(TX)/PA3(RX),RST→PA4 | 3.3V 供电,CH_PD 拉高 |
| OLED12864 | IIC | PB6(SCL)/PB7(SDA) | 3.3V |
| 继电器×2 | GPIO 输出 | PA0(加热)、PA1(补水) | 独立控制 |
| 按键 | GPIO 输入 | PB0/PB1/PB14/PB15 | 阈值设定 + 手动加水/加热 |
接线四个坑:
- ESP8266 供电是重灾区:WiFi 发射瞬间峰值电流 300mA+,直接从 STM32 板载 3.3V 取电十有八九联网时复位,独立 LDO 或大电容(470µF)必须安排。
- HX711 与传感器接线别接反:称重传感器四线(E+、E-、A+、A-)接错读数是满量程乱跳,上电后先空秤去皮验证。
- 称重传感器安装要"悬空受力":水桶必须完全压在传感器上、且底座不能有其他支撑点擦碰,任何机械干涉都会让"水量"变成玄学。
- 继电器走线远离 HX711 信号线:水泵继电器吸合的干扰脉冲耦合进称重信号线,水量读数会瞬间跳变,信号线用屏蔽线或远离强电布线。
四、软件设计
4.1 主程序框架
int main(void)
{
SystemInit();
delay_init();
KEY_Init(); // 阈值设定/手动控制
DS18B20_Init(); // 水温
HX711_Init(); // 称重
Maopi = HX711_Read(); // 上电去皮:记录空桶皮重
OLED_Init();
USART2_Init(115200); // ESP8266
ESP8266_Connect(); // STA 连 WiFi → 透传 → TCP 服务器
Relay_Init();
while (1)
{
temp = DS18B20_GetTemp();
weight = Get_Weight(); // 净重 = 总重 - 皮重
water = weight / G_PER_LITER; // 重量换算水量(1L水≈1000g)
/* 自动加热:水温低于阈值开加热,到阈值停 */
if (auto_mode && temp < temp_th) Relay_Heat(ON);
else if (temp >= temp_th) Relay_Heat(OFF);
/* 自动补水:水量低于阈值开泵,到最大水量停 */
if (auto_mode && water < water_th) Relay_Pump(ON);
else if (water >= water_max) Relay_Pump(OFF);
key_scan(); // 手动加水/加热:按一下开、再按一下关
OLED_Show(temp, water, status);
WiFi_Report(temp, water); // 上传 APP
Handle_WiFi_Cmd(); // 远程加水/加热指令解析
}
}
4.2 HX711 称重读取:24 位数据 + 去皮换算
HX711 的读取时序:DOUT 为高、SCK 为低就绪 → SCK 逐脉冲拉高拉低读 24 位 → 数据与 0x800000 异或处理符号位:
u32 HX711_Read(void)
{
u32 val = 0;
u8 i;
while (DOUT_READ() == 1); // 等待转换完成(DOUT 拉低)
for (i = 0; i < 24; i++) // 逐位读 24bit
{
SCK_HIGH();
val = val << 1;
if (DOUT_READ()) val++;
SCK_LOW();
}
SCK_HIGH(); // 第25个脉冲:下一次通道A/增益128
val = val ^ 0x800000; // 符号位处理:输出补码
SCK_LOW();
return val;
}
/* 净重换算:先去皮,再除以校准系数 */
float Get_Weight(void)
{
float net = HX711_Read() - Maopi; // 总重 - 空秤皮重
if (net < 0) net = 0;
return net / 415.0f; // 校准系数:每 g 对应的 AD 值,需实测标定
}
校准方法:空秤记一次读数(皮重),放已知重量的砝码(或 500ml 水)再读一次,系数 = (两次读数差) / 已知克数,换算成水量时 1L 水按 1000g 计。
4.3 DS18B20 水温读取
单总线四步:复位(拉低 480µs)→ 等响应(60~240µs)→ 发 0x44 转换(等 750ms)→ 发 0xBE 读两字节,温度 = ((高<<8)|低) × 0.0625。注意 DQ 引脚在发送时设输出、读取时切输入,上拉电阻 4.7kΩ 不能省,否则读出 85°C 假值。
4.4 ESP8266 联网流程
AT 复位 → 等 "ready"
AT+CWMODE=1 → STA 客户端模式
AT+CWJAP="SSID","PWD" → 连接 WiFi,等 "OK"
AT+CIPMUX=0 → 关闭多路连接
AT+CIPMODE=1 + AT+CIPSTART → 透传模式连 TCP 服务器
之后串口收发即网络收发:单片机定时上报 T:xx;W:xx 格式数据,APP 下发的加水/加热指令经透传直达串口中断,按指令规则解析执行。波特率 115200,RST 引脚由 PA4 控制可软件重启模块。
五、整机调试:按功能逐项验证
调试环境 Keil + ST-Link,关键函数(温度读取、重量计算、无线收发)设断点单步,寄存器和变量窗口实时观察。
| 测试项 | 操作 | 预期结果 |
|---|---|---|
| 温度采集 | 对比温度计 + 手捂传感器 | OLED 显示一致,变化响应及时 |
| 温控 | 水温降到阈值以下 | 继电器吸合加热,到温自动断 |
| 称重校准 | 空桶去皮 → 倒入 500ml 水 | 水量显示 +0.5L 左右 |
| 自动补水 | 把水放掉到阈值以下 | 水泵启动,到最大水量精确停止 |
| 手动控制 | 按加水/加热键 | 按一下开、再按关,显示同步 |
| WiFi 联网 | 模块复位→连路由 | “ready”/“OK”/“CONNECT” 逐级确认 |
| 远程控制 | APP 下发加水/加热指令 | 指令执行 + 状态回传 |
| 断网自恢复 | 断开路由再恢复 | 通信自动恢复,控制功能正常 |
六、常见坑汇总
- 称重读数漂移:先查传感器安装是否受力单一(见接线坑 3),再查供电——HX711 对电源纹波敏感,5V 要干净;软件上每次读数做 3~5 次均值滤波。
- 校准系数直接抄别人的:415 这种系数只对特定传感器和模组有效,自己标定(见 4.2),抄来的系数水量能差出 30%。
- ESP8266 断网死等:AT 指令等待要有超时退出,否则 WiFi 一断整个主循环卡死,温度控制也跟着失灵——远程功能绝不能拖垮本地控制。
- 补水判断要防抖:水泵抽水瞬间机器振动会让重量读数抖动,补水启停判断加 2~3 秒的确认窗口,否则泵会频繁启停。
- 85°C 假值:DS18B20 老问题,上拉电阻 + 转换等待时间(750ms)到位就不出。
七、可扩展方向
- 加 TDS 水质传感器,水量水质一把抓,滤芯寿命提醒顺带做了;
- 接入 MQTT + 云平台(OneNET/阿里云),做历史用水曲线和饮水量统计;
- 加峰谷电价时段加热调度,把"智能"落在节能账单上。
八、资料内容完整工程资料(原理图、PCB、代码、元件清单)

九、资料获取方式

更多推荐


所有评论(0)