HX711称重式水量检测+DS18B20温控+ESP8266远程监控,物联网改造一台传统饮水机

公司楼道那台老饮水机,水温全靠猜、水桶换没换没人知道、下班忘关电烧一整晚——这篇基于 STM32 的智能饮水机就是冲着这些痛点去的:DS18B20 实时测温自动加热、HX711+称重传感器"称"出水量自动补水、OLED 显示水温水量、ESP8266 上网手机远程控制加水加热。方案怎么定、器件怎么选、电路怎么连、程序怎么写、整机怎么调,一次讲透,给传统家电做物联网改造提供一个完整参考。

一、系统功能拆解

一句话总结:温度重量双参数采集 → 阈值闭环控制(加热/补水)→ 本地显示 + WiFi 远程监控。

功能实现方式对应硬件
水温检测单总线数字温度传感器DS18B20
自动加热水温低于阈值 → 继电器开加热器继电器 + 加热模块
水量检测称重传感器测重换算水量(非接触式)HX711 + 电阻应变式称重传感器
自动补水重量低于阈值自动加水,到最大水量停继电器 + 水泵/电磁阀
阈值设定按键设定水温、水量阈值独立按键
手动控制加水/加热按键直接开关独立按键
数据显示水温、水量、状态实时刷新OLED12864(SSD1306)
远程监控WiFi 透传 TCP 服务器,APP 查看+控制ESP8266-01S

亮点在水量检测方式:不插电极、不泡浮子,整个水桶坐在称重传感器上"称重算水量"——非接触、不怕水垢、不怕腐蚀,比电极式水位检测干净一个档次。

二、器件选型:每个模块都对比过

器件选型结果淘汰方案核心理由
主控STM32F103C8T6nRF52840性价比高、生态成熟,功能够用不浪费
温度DS18B20LM35数字输出免 ADC、单总线抗干扰
重量HX711 称重模块FSR402 力敏电阻24位 ADC 精度高、稳定性好
无线ESP8266-01SnRF905直连 WiFi 上互联网,社区资源多
显示OLED12864ST7735 彩屏自发光低功耗、广视角对比度高

几个关键选型理由展开讲:

  • 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单总线PB84.7kΩ 上拉到 3.3V
HX711双线时序SCK→PB12,DOUT→PB135V 供电,桥式传感器接 E+/E-/A+/A-
ESP8266-01SUART2PA2(TX)/PA3(RX),RST→PA43.3V 供电,CH_PD 拉高
OLED12864IICPB6(SCL)/PB7(SDA)3.3V
继电器×2GPIO 输出PA0(加热)、PA1(补水)独立控制
按键GPIO 输入PB0/PB1/PB14/PB15阈值设定 + 手动加水/加热

接线四个坑:

  1. ESP8266 供电是重灾区:WiFi 发射瞬间峰值电流 300mA+,直接从 STM32 板载 3.3V 取电十有八九联网时复位,独立 LDO 或大电容(470µF)必须安排。
  2. HX711 与传感器接线别接反:称重传感器四线(E+、E-、A+、A-)接错读数是满量程乱跳,上电后先空秤去皮验证。
  3. 称重传感器安装要"悬空受力":水桶必须完全压在传感器上、且底座不能有其他支撑点擦碰,任何机械干涉都会让"水量"变成玄学。
  4. 继电器走线远离 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 下发加水/加热指令指令执行 + 状态回传
断网自恢复断开路由再恢复通信自动恢复,控制功能正常

六、常见坑汇总

  1. 称重读数漂移:先查传感器安装是否受力单一(见接线坑 3),再查供电——HX711 对电源纹波敏感,5V 要干净;软件上每次读数做 3~5 次均值滤波。
  2. 校准系数直接抄别人的:415 这种系数只对特定传感器和模组有效,自己标定(见 4.2),抄来的系数水量能差出 30%。
  3. ESP8266 断网死等:AT 指令等待要有超时退出,否则 WiFi 一断整个主循环卡死,温度控制也跟着失灵——远程功能绝不能拖垮本地控制。
  4. 补水判断要防抖:水泵抽水瞬间机器振动会让重量读数抖动,补水启停判断加 2~3 秒的确认窗口,否则泵会频繁启停。
  5. 85°C 假值:DS18B20 老问题,上拉电阻 + 转换等待时间(750ms)到位就不出。

七、可扩展方向

  • 加 TDS 水质传感器,水量水质一把抓,滤芯寿命提醒顺带做了;
  • 接入 MQTT + 云平台(OneNET/阿里云),做历史用水曲线和饮水量统计;
  • 加峰谷电价时段加热调度,把"智能"落在节能账单上。

八、资料内容完整工程资料(原理图、PCB、代码、元件清单)


九、资料获取方式

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐