ESP32 实战教程:用 HX711 做一台可标定的电子秤

本文按“先跑通、再测量、最后工程化”的顺序整理。不同开发板、模块批次和库版本可能存在差异,请以手中硬件的丝印、数据手册与实际串口日志为准。

ESP32 实战教程:用 HX711 做一台可标定的电子秤 系统架构

一、为什么值得做

称重传感器的输出只有很小的差分电压,ESP32 自带 ADC 并不适合直接读取。HX711 把仪表放大器和高分辨率 ADC 放在一起,专门负责把这点微弱变化放大并数字化。项目真正有意思的地方不只是显示一个数字,而是把机械安装、零点漂移、砝码标定和稳定判断串成完整流程。否则桌上多放一支笔,秤就开始思考人生。

这次不追求把所有功能一次堆满。先完成一个最小闭环:硬件能初始化、原始数据有变化、异常时能明确报错;随后再加入标定、滤波和状态机;最后才连接网页、MQTT 或本地存储。这个顺序看起来慢一点,实际会少掉很多“到底是线错了、库错了,还是页面错了”的集体猜谜。

二、硬件清单与接线重点

准备 ESP32、HX711 模块、四线制称重传感器、稳定秤台和一个已知重量的砝码。传感器常见线色并不绝对可靠,应结合标签或万用表确认激励端与信号端。秤台必须让传感器按设计方向受力,固定端和受力端不能同时被外壳夹死。HX711 的 DT、SCK 接普通 GPIO,供电和逻辑电平按模块规格选择。

第一次接线建议使用短线,在断电状态下逐根核对,并记录开发板型号、GPIO 编号、模块供电电压和接口地址。不要只写“接到 SDA”,因为换一块板后默认 SDA 可能不同。电机、舵机、风扇和继电器等负载应使用合适的独立电源,GPIO 只负责信号,不能兼职当小型发电站。

三、工作原理

传感器内部是惠斯通电桥,受力后桥臂电阻发生细微变化,输出与载荷近似成比例的差分信号。HX711 对信号放大后输出原始计数。去皮就是记录空载零点,标定就是用已知重量求出“每克对应多少计数”。最终重量等于原始值减零点,再除以标定系数。这个公式简单,但前提是机械结构没有晃动、线材没有被拉扯、温度变化在可接受范围内。

ESP32 实战教程:用 HX711 做一台可标定的电子秤 数据流程

把系统分成五层会更容易排错:电气连接、驱动通信、原始数据、业务换算、显示与联网。每层都留一个可观察点,例如电源电压、初始化返回值、原始帧、换算结果和页面状态。上层失败时先确认下层证据,不要页面上没有数字就立刻换三套库。

四、第一次实验与标定

先让秤空载静置,连续读取几十次并求平均,保存为零点。然后放上接近常用量程的标准砝码,等待读数稳定,计算标定系数。不要用手按一下就宣布标定完成,手的力量既不标准,也很容易给传感器留下超载纪念。建议分别测试量程的 10%、50% 和 90%,检查线性;再重复放置同一砝码,观察重复性。

标定数据应与设备配置一起保存,并记录时间、参考物、环境和固件版本。更换模块、改变机械结构或升级算法后应重新验证。只记一个最终系数而不记原始数据,下一次发现偏差时很难判断是传感器老化、结构变化,还是当初计算时手滑。

五、最小可运行代码

下面的代码用于验证关键链路。安装对应库后,根据自己的开发板修改引脚、地址和参数:

#include <HX711.h>

HX711 scale;
const int DOUT_PIN = 32;
const int SCK_PIN = 33;
float calibration = -7050.0f; // 必须用自己的砝码重新计算

void setup() {
  Serial.begin(115200);
  scale.begin(DOUT_PIN, SCK_PIN);
  scale.set_scale(calibration);
  scale.tare(20);
}

void loop() {
  if (!scale.is_ready()) {
    Serial.println("HX711 not ready");
    delay(500);
    return;
  }
  float grams = scale.get_units(10) * 1000.0f;
  Serial.printf("weight=%.1f g\n", grams);
  delay(300);
}

示例故意保留串口输出,因为学习阶段最重要的是能看到系统正在做什么。代码跑通后再逐步拆分模块,不能因为最终产品没有串口窗口,就在开发阶段也把所有线索关掉。

六、数据处理与状态设计

显示重量前可以维护一个长度为 7 的滑动窗口,去掉最大值和最小值后求平均。只有连续几轮变化小于阈值,才标记为“稳定”。去皮按钮也应该只在读数稳定、没有超载时生效。日志至少保存原始计数、零点、标定系数、克数和稳定状态;只保存最终重量,会让后续排查失去证据。

建议为设备统一设计四种状态:INIT 表示初始化,RUNNING 表示数据有效,DEGRADED 表示部分功能仍可用,ERROR 表示需要人工处理。每次状态变化记录原因和时间。错误恢复要有间隔,不能每个循环都重新初始化外设,否则日志会被刷满,设备也只是在高频重复同一个错误。

七、常见问题与排错顺序

读数乱跳时先查机械固定、共地、电源和传感器接线,不要急着把平均次数加到几百。数值方向相反可以调整信号线或标定系数符号。开机后零点缓慢变化可能来自温漂和结构应力,应预热一段时间再去皮。量程超限时要立即提示,软件不能替传感器承受过载。

排错时按以下顺序进行:先测供电和地线,再确认引脚与接口参数;然后只运行最小示例,打印原始数据;最后才恢复网页和自动控制。每次只改一个变量,并保留失败时的原始输出。最怕的是接线、库版本和业务代码同时修改,最终虽然偶然成功,却不知道是哪一步真正起了作用。

八、从演示变成长期运行设备

把零点、标定系数、最大量程和稳定阈值存入 NVS,并给配置增加版本号与校验。生产使用还需要防偏载结构、过载限位、温度补偿和周期复检。若通过网页远程去皮,要增加权限与现场确认,避免有人隔着网络把一袋物料悄悄定义成零。

程序结构上,可以把驱动、数据模型、业务状态机、网络和存储拆开。采样任务只负责产生带时间戳的有效数据,网页负责读取快照,日志任务负责批量落盘。任何网络故障都不应阻止本地采样,任何页面刷新也不应改变控制周期。配置保存在 NVS 时加入默认值、范围检查和版本迁移。

九、建议完成的测试清单

  1. 冷启动、复位和断电重启后,设备能否进入明确状态;
  2. 外设拔掉、接错或返回异常值时,程序是否会卡死;
  3. 连续运行两小时,内存、温度、供电和日志是否稳定;
  4. 阈值附近反复变化时,输出是否存在抖动或频繁动作;
  5. 更换同型号模块后,原标定是否仍然适用;
  6. Wi-Fi 断开、网页关闭或存储满时,本地核心功能是否继续工作;
  7. 对涉及人体、机械运动和大电流的项目,保护措施是否独立于软件存在。

建议建立实验表,至少记录原始值、处理值、单位、采样周期、错误次数、供电方式和测试结论。遇到偶发问题时,再增加启动次数和运行时长。工程经验常常不是来自“成功一次”,而是来自知道失败出现在哪个边界。

十、还能怎么扩展

可以扩展为咖啡秤、宠物食盆余量监测、气瓶重量提醒或仓储货架节点。进一步加入时间戳和流量计算,就能显示每秒重量变化;多点称重则需要考虑多个传感器的受力分配与分别标定。

扩展功能时仍然遵循一次增加一层的原则。先证明新模块独立工作,再接入现有状态机;先保存原始值,再绘制漂亮曲线。这样教程不仅能展示结果,也能给读者留下一条可以照着走的排错路线。

十一、总结

本项目的重点不是某一行库函数,而是把硬件、数据、状态和异常组合成一个可解释的小系统。能读取只是起点,能标定、能发现错误、能恢复、能留下日志,才算真正完成。实际制作后,建议继续补充接线照片、串口截图和一次真实失败记录,这些往往比“运行成功”四个字更有参考价值。

参考资料

打赏

如果这篇学习记录对你有帮助,欢迎扫码支持后续整理。

打赏码

打赏支持:王庆岩

posted on 2026-10-06 00:30  潇洒石头  阅读(26)  评论(0)    收藏  举报

导航