1. 称重系统选型与HX711的核心定位
1.1 为什么称重项目绕不开HX711这颗芯片
做过电子秤、配料机、拉力测试台或者智能货架的朋友,大概率都接触过HX711。这颗芯片在称重圈子里的地位,有点像Arduino在创客圈的地位——便宜、够用、资料多、上手快。它本质上是一个24位高精度模数转换器,专门为桥式传感器设计,内部集成了稳压电源、时钟电路和片内低噪声放大器,外围只需要几个电容电阻就能工作。
称重传感器输出的信号非常微弱。以常见的1kg量程、1mV/V灵敏度的电阻应变片传感器为例,满量程输出只有1mV,而我们要分辨1g的变化,对应信号只有1微伏左右。这个量级如果直接送进Arduino Uno的10位ADC,根本分辨不出来——Uno的参考电压5V,10位分辨率下每个LSB就是4.88mV,比整个满量程信号还大。所以必须有一个高增益、低噪声的前置放大加高精度ADC,HX711就是干这个的。它的可编程增益有32、64、128三档,对应通道A的增益128时,输入信号被放大128倍再送进24位ADC,等效分辨率能做到纳伏级别,这才让克级甚至毫克级称重成为可能。
1.2 常见称重方案横向对比
在动手之前,先把可选方案摆出来对比一下,避免选错路线浪费时间。
| 方案 | 分辨率 | 成本 | 开发难度 | 适用场景 |
|---|---|---|---|---|
| Arduino内置ADC + 运放 | 约10位有效 | 低 | 中 | 对精度要求极低的粗略检测 |
| HX711 + 应变片传感器 | 24位(有效约16-18位) | 很低 | 低 | 电子秤、配料、拉力检测 |
| ADS1232 | 24位 | 中 | 中 | 工业级高精度称重 |
| NAU7802 | 24位 | 低 | 中 | 替代HX711的低功耗方案 |
| INA226 + 分流 | 电流检测 | 低 | 低 | 电流功率监测,非称重 |
从表格能看出来,HX711在成本和开发难度上优势明显,精度对于绝大多数民用和轻工业场景完全够用。我实测过用HX711配5kg传感器,稳定分辨到0.5g没有问题,做厨房秤、快递秤、宠物秤都绰绰有余。如果你的项目需要更高采样率或者更低功耗,可以考虑NAU7802,但生态和资料丰富度还是HX711更胜一筹。
1.3 本文适合谁看
这篇内容面向三类人:第一类是刚接触Arduino和传感器的初学者,想做一个能用的电子秤;第二类是有一定基础但被HX711的读数漂移、接线干扰、校准问题困扰的开发者;第三类是想把称重功能集成到更大系统里(比如配料控制、物联网称重终端)的工程师。我会从接线、库的使用、校准、滤波、多平台适配几个维度展开,把踩过的坑和验证过的方案都摊开讲。
2. 硬件接线与多平台适配细节
2.1 称重传感器与HX711的接线逻辑
电阻应变片称重传感器一般是四线制:红(E+)、黑(E-)、白(A-)、绿(A+),也有部分厂家用其他颜色,比如黄代替绿。这里的关键是E+和E-是给传感器桥路供电的,A+和A-是差分信号输出。接反了不会烧,但读数会反向或者异常。
HX711模块上通常标着E+、E-、A+、A-、B+、B-,其中B通道增益固定为32,一般用于第二路传感器或者温度补偿。我们做单路称重只用A通道。接线对应关系:
- 传感器红线 → HX711 E+
- 传感器黑线 → HX711 E-
- 传感器白线 → HX711 A-
- 传感器绿线 → HX711 A+
注意:不同厂家的传感器线色定义可能不同,拿到手先用万用表测一下。E+和E-之间电阻通常在350Ω到1kΩ之间,A+和A-之间电阻也是类似量级,E和A之间应该是开路或高阻。如果测出来E+和E-短路,传感器基本废了。
2.2 HX711与Arduino Uno/Nano的接线
HX711模块和Arduino之间只需要两根信号线加电源:
| HX711引脚 | Arduino Uno/Nano | 说明 |
|---|---|---|
| VCC | 5V | 模块供电,3.3V版本接3.3V |
| GND | GND | 共地 |
| DT (DOUT) | D3 | 数据输出,可改其他数字脚 |
| SCK | D2 | 时钟输入,可改其他数字脚 |
这里DT和SCK可以接任意数字引脚,库初始化时指定就行。我习惯用D2和D3,因为这两个脚支持外部中断,虽然HX711库默认用轮询,但留着以后扩展方便。
2.3 HX711与ESP32的接线差异
ESP32的IO电平是3.3V,而市面上大部分HX711模块是5V供电的。这里有个关键点:HX711的DT和SCK是数字接口,5V模块的输出高电平接近5V,直接接ESP32的IO有风险。实测有些模块能扛住,但长期用不推荐。稳妥做法有两种:一是选3.3V版本的HX711模块,二是加电平转换。我一般直接买3.3V模块,省事。
ESP32接线:
| HX711引脚 | ESP32 | 说明 |
|---|---|---|
| VCC | 3.3V | 必须3.3V |
| GND | GND | 共地 |
| DT | GPIO4 | 任意可用IO |
| SCK | GPIO5 | 任意可用IO |
提示:ESP32的GPIO34-39是输入专用,没有内部上拉,用作DT可以,但SCK必须用普通IO。我踩过一次坑,把SCK接到GPIO35,结果死活读不出数,换到GPIO5就好了。
2.4 HX711与STM32的接线要点
STM32的IO是3.3V,同样建议用3.3V模块。接线逻辑和ESP32一样,选两个普通GPIO即可。需要注意的是STM32的HAL库延时精度和Arduino不同,如果用现成的HX711库,可能需要调整时钟延时。我一般用软件模拟时序,在STM32上跑HX711,SCK高电平持续时间要大于0.2微秒,低电平大于0.2微秒,用HAL_Delay或者DWT延时都能满足。
2.5 多平台接线图汇总
把上面几种平台的接线整理成一张速查表,方便对照:
| 平台 | VCC | GND | DT | SCK | 电平注意 |
|---|---|---|---|---|---|
| Uno/Nano | 5V | GND | D3 | D2 | 5V模块直连 |
| ESP32 | 3.3V | GND | GPIO4 | GPIO5 | 必须3.3V模块 |
| STM32 | 3.3V | GND | PA0 | PA1 | 必须3.3V模块 |
| 树莓派 | 3.3V | GND | GPIO17 | GPIO27 | 必须3.3V模块 |
树莓派用Python的hx711库也能读,但实时性不如单片机,适合对采样率要求不高的场景。
3. 库的选型与核心代码实现
3.1 HX711库的选择与安装
Arduino生态里HX711库有好几个版本,最常用的是bogde写的HX711库,在库管理器里搜"HX711"就能找到。安装方式:Arduino IDE → 工具 → 管理库 → 搜索HX711 → 安装。如果你用的是PlatformIO,在platformio.ini里加bogde/HX711即可。
这个库的核心API就几个:
HX711 scale(DOUT, SCK);初始化scale.set_scale(calibration_factor);设置校准系数scale.tare();去皮归零scale.get_units(times);读取重量,times是平均次数scale.read();读原始值scale.read_average(times);读多次平均
3.2 最小可用代码框架
先上一个能跑起来的最小代码,把读数打印到串口:
#include "HX711.h" const int LOADCELL_DOUT_PIN = 3; const int LOADCELL_SCK_PIN = 2; HX711 scale; void setup() { Serial.begin(9600); scale.begin(LOADCELL_DOUT_PIN, LOADCELL_SCK_PIN); scale.set_scale(); // 先用默认系数 scale.tare(); // 去皮 } void loop() { Serial.print("原始值: "); Serial.print(scale.read_average(10)); Serial.print(" 重量: "); Serial.println(scale.get_units(10), 2); delay(500); }烧进去之后打开串口监视器,应该能看到原始值在变化。用手压传感器,数值会明显变动。如果数值一直是0或者不变,先检查接线。
3.3 校准系数的计算与实测
校准是HX711项目里最关键的一步。库里的set_scale()参数决定了原始值到重量的换算关系。校准方法:
- 先
set_scale()不传参,tare()去皮。 - 放一个已知重量的物体,比如500g砝码。
- 读原始值,假设是
raw。 - 校准系数 = raw / 实际重量。
举个例子,我手上这个5kg传感器,放500g砝码时读到的原始值是215000,那么系数就是215000 / 500 = 430。scale.set_scale(430);之后再读get_units(),显示的就是克数。
注意:校准系数和传感器、HX711模块、供电电压都有关,换一个模块系数就变了,必须重新校准。另外温度变化也会影响系数,高精度场景需要做温度补偿。
3.4 去皮与零点漂移处理
tare()的作用是把当前读数设为0,适合放容器后归零。但HX711的零点会随时间缓慢漂移,尤其是温度变化时。我的做法是:开机后先预热几分钟,然后tare(),之后每隔一段时间或者检测到空载时重新tare。如果做长期监测,可以在代码里加一个自动零点跟踪:当读数在零点附近波动且持续一段时间,就认为空载,缓慢调整零点偏移。
3.5 数据滤波与稳定读数
HX711原始读数有噪声,直接显示会跳。库里的get_units(10)是取10次平均,能压一部分噪声。但如果你要更稳,可以上滑动平均或者中值滤波。我常用的是滑动平均窗口10,再加一个一阶低通滤波:
float filtered = 0; float alpha = 0.2; void loop() { float raw = scale.get_units(5); filtered = alpha * raw + (1 - alpha) * filtered; Serial.println(filtered, 2); delay(100); }alpha越小越平滑但响应越慢,0.1到0.3之间比较合适。做配料秤需要快速响应就用0.3,做静态称重用0.1。
4. 常见问题排查与避坑指南
4.1 读数一直为0或不变
这是新手最常遇到的问题。排查顺序:
- 检查VCC和GND是否接好,用万用表量HX711的VCC对GND电压。
- 检查DT和SCK是否接反,很多人把DT和SCK搞混。
- 检查传感器四根线是否接对,特别是E+和E-。
- 用万用表测传感器E+和E-之间电阻,正常在350Ω到1kΩ,如果开路说明传感器线断了。
- 如果以上都正常,换一个HX711模块试试,模块本身坏的也有。
4.2 读数跳变严重
读数跳变通常来自几个方面:电源噪声、接线松动、传感器质量、机械结构。我遇到最多的是电源问题——用USB供电时,电脑的开关电源噪声会串进来。换成电池供电或者加LC滤波,跳变会明显改善。另外传感器固定不牢,受力面有侧向力,也会导致读数不稳。机械上要保证传感器只受正压力,不要有扭矩。
4.3 校准后线性度差
线性度差表现为小重量准、大重量偏,或者反过来。原因可能是传感器本身非线性,或者HX711增益档位不合适。HX711的A通道增益128适合小信号,如果传感器灵敏度高(比如2mV/V),满量程信号大,可能饱和。这时候可以改用B通道(增益32),或者换低灵敏度传感器。另外校准点最好选在量程的50%到80%之间,不要用满量程点校准。
4.4 ESP32上读数异常
ESP32上最常见的问题是电平不匹配和引脚选择错误。前面说过,5V模块接ESP32,DT输出5V可能损坏IO。另外ESP32的WiFi工作时会产生射频噪声,影响HX711读数。我的做法是:称重采样时暂时关闭WiFi,或者把HX711的线尽量短,远离天线区域。还有一点,ESP32的ADC2在WiFi开启时不能用,但HX711是数字接口,不受这个限制。
4.5 常见问题速查表
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 读数恒为0 | 接线错误、模块坏 | 检查VCC/GND/DT/SCK,换模块 |
| 读数恒为最大值 | 传感器接反、增益饱和 | 调换A+/A-,改B通道 |
| 读数跳变 | 电源噪声、接触不良 | 电池供电、加滤波、紧固接线 |
| 校准后不准 | 系数错误、非线性 | 重新校准,选合适校准点 |
| ESP32读数异常 | 电平不匹配、WiFi干扰 | 用3.3V模块、远离天线 |
| 长时间漂移 | 温漂、零点漂移 | 预热、自动零点跟踪 |
5. 进阶应用与系统集成思路
5.1 多路称重与通道扩展
一个HX711只有两个通道,A和B。如果需要四路称重,可以用两个HX711,共用SCK,DT分别接不同IO。库本身不支持多实例共享SCK,但可以自己写时序,或者用两个库实例分别指定不同SCK。我做过一个四路配料系统,用两个HX711,SCK分开接,代码里轮流读取,采样率降到10Hz左右,但配料够用。
5.2 称重数据的上位机传输
称重数据传到电脑或者云端,常用方式有串口、蓝牙、WiFi。串口最简单,Arduino直接Serial.print,上位机用Python的pyserial读。蓝牙用HC-06,接线简单,但速率低。WiFi用ESP32自带,可以走MQTT或者HTTP。我一般用ESP32 + MQTT,称重数据实时推到服务器,手机端就能看。
5.3 称重与执行机构的联动
称重经常要和电机、舵机、继电器联动,比如配料到量就停。这里的关键是采样速度和执行延迟。HX711默认采样率10Hz或80Hz,10Hz下每次采样100ms,配料时如果流速快,100ms可能已经超量了。解决办法是提高采样率到80Hz,或者用预测算法提前关阀。我做过一个颗粒配料项目,用80Hz采样,加上提前量补偿,精度能做到±2g。
5.4 低功耗称重终端设计
电池供电的称重终端,功耗主要在HX711和MCU。HX711工作电流约1.5mA,待机可以降到微安级。做法是:不称重时让HX711进入power_down模式,MCU进入休眠,定时唤醒采样。Arduino上用scale.power_down()和scale.power_up(),ESP32上用深度睡眠。这样一节18650电池能撑几个月。
5.5 标定数据的掉电保存
校准系数如果每次上电都重新算,太麻烦。可以把系数存到EEPROM或者Flash里。Arduino Uno用EEPROM.put(),ESP32用Preferences库。上电时读出来,直接set_scale()。这样换电池或者重启都不用重新校准。
6. 实操心得与经验总结
6.1 传感器安装的机械要点
称重传感器是精密器件,安装方式直接影响精度。我踩过的坑:把传感器直接用螺丝拧在亚克力板上,结果板子变形导致读数漂移。正确做法是传感器一端固定,另一端悬空受力,受力方向要和传感器标注的一致。如果是悬臂梁式传感器,固定端要足够刚性,受力端要保证力垂直向下。另外传感器不要承受超过量程的力,一次过载就可能永久损坏。
6.2 电源与接地的处理技巧
HX711对电源噪声敏感,尤其是和电机、继电器共用电源时。我的做法是:HX711单独用一路LDO供电,或者加π型滤波。接地方面,模拟地和数字地分开走,最后单点共地。如果做PCB,HX711下面铺地,信号线尽量短。这些细节在面包板上体现不明显,但做成品时差别很大。
6.3 校准的实操经验
校准砝码最好用标准砝码,如果没有,可以用已知重量的物品,比如500ml矿泉水约500g。但要注意,矿泉水瓶本身重量和水的密度随温度变化,精度要求高时不能用。我一般用厨房秤称过的物品做参考,误差在1%以内。校准点选两个:一个零点,一个接近满量程的点,做两点校准比单点准。如果要求更高,做多点分段校准。
6.4 代码层面的稳定性优化
除了滤波,还有几个技巧:一是读HX711时关中断,避免时序被打断;二是用read_average而不是单次读;三是加超时判断,HX711没响应时不要死等。库里的is_ready()可以判断数据是否准备好,配合超时用更稳。另外,如果读数出现异常大或者异常小的值,直接丢弃,不要参与平均。
6.5 不同场景的参数推荐
| 场景 | 采样率 | 滤波窗口 | 校准点 | 备注 |
|---|---|---|---|---|
| 厨房秤 | 10Hz | 10 | 单点 | 响应快,精度要求一般 |
| 快递秤 | 10Hz | 20 | 两点 | 量程大,线性要求高 |
| 配料秤 | 80Hz | 5 | 多点 | 响应快,精度高 |
| 长期监测 | 1Hz | 50 | 两点 | 低功耗,稳定性优先 |
这些参数是我实际项目里调出来的,你可以根据自己情况微调。核心原则是:响应速度和稳定性是矛盾的,看你的场景更看重哪个。
6.6 后续扩展方向
称重系统做完基础功能后,可以往几个方向扩展:一是加显示屏,本地显示重量;二是加按键,做去皮、切换单位;三是加报警,超重或欠重时蜂鸣器响;四是联网,数据上云做统计分析。我最近在做一个智能货架项目,每个货架层用HX711称重,实时监测库存,缺货自动提醒,效果不错。HX711的性价比在这个场景里体现得很充分,一个模块几块钱,精度够用,开发也快。
如果你刚开始接触,建议先按最小系统搭起来,把读数跑通,再逐步加功能。不要一上来就搞复杂系统,容易卡在某个细节上。称重项目最花时间的往往是机械结构和校准,电路和代码反而简单。把传感器固定好,电源处理好,校准做准,基本就成功了一大半。