
用HX711模块攒电子秤几乎是每个做单片机、做物联网、做智能家居的人绕不开的小项目。淘宝上十几块钱一块模块配一个几十块的称重传感器半天时间就能搭出一台能用的电子秤再配合ESP32或者Arduino就能做远程称重、自动喂食器、物料检测这些有意思的应用。但我在社群和留言里看到最多的求助不是接线不是程序编译而是同一个词校准。读数越用越偏、开机和关机数值不一样、同一个杯子放上去两次能差出十几克这些现象绝大多数都和接线无关根子全在校准环节。这篇指南不打算再复制一遍官方接线图而是按我实际踩坑的顺序把HX711电子秤DIY里最常见的5个校准错误拆开讲清楚。每个错误都会说明它长什么样子、背后的原理是什么、怎么解决最后给出一套可以直接照抄的完整校准流程以及一份故障排查速查表。无论你是第一次做电子秤的新手还是已经攒过好几个项目的老手这套思路都值得留着备用。1. 先搞懂HX711电子秤的原理再谈校准1.1 从应变片到数字读数的完整链路很多人一上来就把HX711当作“称重专用芯片”接好线就完事其实它本质上是一个专门为桥式传感器设计的24位高精度ADC模数转换器。称重传感器内部通常有四个应变片组合成一个惠斯通电桥。当秤盘上有重量时弹性体发生微小形变贴在弹性体上的应变片电阻值跟着变化电桥失去平衡输出一对只有毫伏级别的差分电压信号。整个过程非常微弱所以HX711模块内部集成了可编程增益放大器先把这对差分信号放大然后再做24位模数转换最终通过DOUT和SCK两根引脚把数字结果发给单片机。这里有个关键参数需要理解传感器灵敏度。常见的1kg量程传感器满量程输出大约在1mV/V左右意思是每1V激励电压下满量程时输出1mV差分信号。如果给传感器供5V激励满量程时也只有大约5mV。这个信号经过HX711增益128倍放大后变成大约640mV再和ADC的基准电压比较转换成24位数字量。听起来24位分辨率很高但实际上有效精度会被噪声、温漂、机械结构等因素拉低这也是为什么校准很重要。1.2 为什么DIY电子秤绕不开校准这个坎三个字就解释完了个体差。传感器和传感器之间的贴片工艺、弹性体材料、出厂标定都不同HX711芯片本身也存在放大失调和基准差异再加上你用手头的螺丝、木板、3D打印件把它们组装起来每个结构的受力路径也都不一样。这些因素叠加起来导致每个传感器在相同重量下输出的原始数值都不一样甚至同一个传感器拆下来重装一次数值也会变。所以说校准的本质就是找到从ADC原始读数到实际重量之间的映射关系。日常DIY里一般用线性模型就够了重量 (原始读数 - 零点偏移) × 比例系数这里有两个需要确定的参数一个是“零点偏移”空载时的ADC原始值另一个是“比例系数”每增加1克读数变化多少计数。整个校准过程本质上就是把这俩参数测准。1.3 校准不是“按一下按钮”那么简单HX711库里面确实有个tare()函数一个键就能归零很多教程也就在setup里调一下好像这事就结束了。但仔细想想归零和校准是两个完全不同的动作。归零只是把当前状态记录为“0克”如果这时候秤上放了东西、传感器还没稳定、或者结构受力不对那么“当前状态”本身就不是一个可靠的参考点。校准则是要在已知重量输入的条件下计算读数和重量之间的关系它要求整个测量链路处于稳定、正常、可重复的状态。所以你会看到很多人校完了当时能用过两天再上电就傻了。不是HX711坏了而是校准的前提条件没有满足。下面这5个错误每一个我都在真实项目里遇到过有的来自我自己有的来自帮我排错的读者。2. HX711校准中最常见的5个错误2.1 错误一上电不归零、不预热直接进入标定这个错误隐藏得很深因为代码看起来是正常跑通的。很多入门代码是这样写的scale.set_scale(); scale.tare(10); // 归零取10次平均 scale.set_scale(22800); // 直接把网上抄来的校准系数填进去问题出在后面这个22800根本不是你这套硬件的系数而且tare(10)取10次平均之后立刻就去设置系数此时传感器和壳体根本还没稳定。HX711模块连着传感器一起上电的头几分钟芯片自身会发热传感器金属弹性体的温度也在变化叠加在应变片上的热应力会改变电桥的平衡点。表现就是空载读数缓慢漂移开机半小时后零点偏了上百个计数换算成克数可能就有几克。解决办法不复杂但需要你多花一点耐心上电后先等1到2分钟让电路板和传感器完成热稳定。然后在空载状态下连续读取30次到50次ADC原始值做平均并把波动范围打出来看看。只有当空载平均值的上下波动小于目标重量的0.1%时才可以进行下一步校准。比如你想做一台精度到0.1克的电子秤那么零点波动必须远小于0.1克对应的ADC计数。我在实际调试时会把“零点漂移检测”写成一个独立函数上电后进入校准模式串口每隔一秒打印一次当前零点值人可以先去做别的事看到数值稳定再回来继续。这比盯着屏幕干等效率高得多。2.2 错误二只用一个砝码校一遍就认定全程线性这是最典型的“能出数但不准”的场景。做法很常见放一个100克砝码读一个ADC值算出比例系数然后写死进代码收工。如果这秤只用在一个固定重量附近比如每次只称3克猫粮那问题不大。但一旦量程跨度大比如既要称5克又要称300克单点校准的误差就会非常明显。原因在于应变片和弹性体本身存在非线性误差标称满量程非线性度通常在0.02%到0.05%之间但还要叠加机械安装产生的非线性、传感器受载不均、秤盘变形等因素实际加在一起可能更高。单点校准只能保证该点附近相对准确离开这个点越远误差就越大。正确做法是至少做两点校准一个轻载点取满量程的10%左右一个重载点取满量程的80%到100%。计算比例系数时用两个加载点的读数差去除重量差k (m₂ - m₁) / (r₂ - r₁)其中m₁、m₂是两个砝码的重量r₁、r₂是对应的ADC原始值。两个校准点跨度拉得越大读数噪声对斜率的影响就越小而零点偏移则单独用空载平均值来确定。如果对精度有更高要求可以再做第三点校准中间重量和两端各一点然后程序里做分段线性插值。对大多数DIY场景两点校准加零点标定已经够用没必要一上来就上曲线拟合。2.3 错误三把原始值、增益、单位搅成一锅粥HX711的原始读数是有符号整数大致范围在±8000000左右实际有效范围取决于增益和满量程。很多人看网上的代码直接写weight (hx711.read() - offset) / scale;然后scale用了一个在网上抄来的数比如2260但完全不知道这个数的含义。一旦换一个传感器、换一块模块、或者改了增益这个数就废了秤自然就不准。这里有个很容易搞混的点HX711有两个输入通道CH A支持增益128和64CH B支持增益32。你用128增益校准得到的系数不能直接套到64增益上因为同样一个重量下ADC原始值会翻倍变化。如果程序里某处不小心改了set_gain()之前的校准全部作废。再有一点是单位混乱。有人用克有人用盎司还有人用斤代码里“校准系数”四个字看着通用实际背后跟着的物理单位完全不同。我的习惯是全部统一用克并且注释里写清楚比例系数的单位是“计数/克”还是“克/计数”这样以后回看代码不会自己坑自己。还要提醒一个细节校准时如果用手指扶着传感器、把秤压到桌面边缘、或者线缆拉扯传感器读到的原始值就不是真实受力条件下的值。测量条件和后续使用条件不一致校准结果自然不可靠。2.4 错误四供电和地线处理不当校准值像坐过山车HX711虽然提供50Hz/60Hz工频抑制、内置稳压但它毕竟是对微伏级信号做测量对外围供电质量还是有要求的。在DIY项目里最常见的几个坑直接和Arduino开发板共用一个USB口供电电脑USB电源噪声大而且不稳。HX711的AVDD、传感器激励线、地线走线过长杜邦线又长又细像一根天线在收集干扰。电路里同时驱动电机、舵机、继电器负载一动作电源电压就毛刺不断HX711读数立刻开始跳。这里有个概念要讲清楚HX711是比例式测量它的ADC基准取自AVDD传感器激励也取自AVDD所以理论上AVDD慢慢变化时ADC读数和实际重量的比例保持不变这是它作为桥式传感器专用芯片的优势。但这不代表供电就可以乱来。比例测量只能抵消共模的、缓慢的电压变化对付不了高频噪声、地弹、ESD带来的瞬时干扰。这些干扰会直接叠加在ADC结果上在校准时刚好读到一个尖峰值你算出来的系数就会偏离真实值。解决经验有四条有条件的话给HX711模块单独用一片低压差稳压器LDO供电比如3.3V或5V的AMS1117输出端并一个10µF钽电容再加一个0.1µF陶瓷电容。传感器激励线E、E-尽量绞合信号输出线S、S-也尽量靠近走线不要和杜邦线一起绕成一团。模拟部分和数字部分尽量做一个单点接地不要用一根细细的杜邦线横穿整个板子当地线。校准时把电机、继电器全部关掉等系统安静下来再做标定。2.5 错误五机械结构还没稳定就急着上电标定这是我个人觉得水分最深的一个坑而且特别像“玄学故障”。现象是这样传感器单独放在桌上用接线夹夹住调零、标定一切正常。然后装进3D打印的外壳拧上螺丝固定好秤盘再上电——完蛋读数不是偏了就是乱跳而且回零也不正常。问题出在应变片式传感器非常敏感它不仅对重量敏感对任何作用在弹性体上的应力都敏感。你拧螺丝的力矩不同、安装面不平、秤盘变形牵拉传感器、限位螺丝顶住了应变区、固定的线缆硬邦邦地扯着传感器这些都会给弹性体叠加一个额外的应力直接改变零点和灵敏系数。正确的做法是把校准放到机械安装之后而不是之前。并且装完之后不要立刻校准先做一个“预压处理”在秤盘上放一个接近满量程的重物停留三五秒拿下来重复5到10次。这个操作会帮助传感器和结构释放一部分安装应力消除一部分机械蠕变。预压后再重新上电、预热、校准。固定传感器的螺丝要对称、逐步拧紧尽量让各颗螺丝力矩一致。还要检查活动区域应变区不能被螺丝、导线、热缩管卡住必须保证载荷通过秤盘垂直传递给传感器而不是带着侧向力。3. 一套不会翻车的完整校准流程3.1 硬件准备与稳定化处理开始校准前先把以下东西准备好HX711模块 称重传感器单片机Arduino、ESP32、STM32都可以至少两个标准砝码重量建议分别为满量程的10%和80%左右稳定的直流电源尽量不用USB口尽量短的杜邦线或焊接线校准流程第一步是“让硬件安静下来”。先完成全部机械结构安装检查螺丝、受力路径、活动间隙然后接通电源预热10分钟。这个等待不是浪费它确保芯片和传感器都进入稳定状态。预热结束后打开串口监视器空载状态下读原始值连续读一分钟记录波动的最大值和最小值。如果波动超过你目标精度先解决波动问题再往下走否则后续校准全是在给噪声打工。3.2 两点线性校准实操下面以Arduino环境为例写一套我用的校准流程。代码不追求花哨重点是逻辑清晰。#include HX711.h #define DOUT_PIN 3 #define SCK_PIN 2 HX711 scale; const float m1 50.0; // 砝码1重量单位克 const float m2 500.0; // 砝码2重量单位克 void setup() { Serial.begin(115200); scale.begin(DOUT_PIN, SCK_PIN); scale.set_gain(128); // 记住这个增益系数只对128有效 } void loop() { if (Serial.available()) { char cmd Serial.read(); if (cmd z) { calibrateZero(); } else if (cmd c) { calibrateWithWeights(); } } }操作顺序是这样的空载时发送z程序连续读30次原始值取平均记为零点偏移zeroOffset同时打印每次读数的极差。如果极差过大代码会提示你先检查供电和接线。放上砝码m₁等读数稳定发送c程序会提示你依次放上m₁和m₂各取30次平均值。计算比例系数k (m2 - m1) / (r2 - r1)单位是克/计数。最终重量换算weight (raw - zeroOffset) * k。校准过程的核心代码示意float calibrationFactor 0.0; float zeroOffset 0.0; void calibrateZero() { float sum 0; float minVal 1e9, maxVal -1e9; for (int i 0; i 30; i) { float v scale.read(); sum v; if (v minVal) minVal v; if (v maxVal) maxVal v; delay(100); } zeroOffset sum / 30.0; Serial.print(zero offset: ); Serial.println(zeroOffset, 1); Serial.print(peak-peak: ); Serial.println(maxVal - minVal, 1); } void calibrateWithWeights() { Serial.println(place m1 then type y); while (Serial.read() ! y); float r1 averageReading(); Serial.println(place m2 then type y); while (Serial.read() ! y); float r2 averageReading(); calibrationFactor (m2 - m1) / (r2 - r1); Serial.print(factor: ); Serial.println(calibrationFactor, 8); } float averageReading() { float sum 0; for (int i 0; i 30; i) { sum scale.read(); delay(100); } return sum / 30.0; }校准完成后建议直接打印一条验证命令空载时显示0.0克放上m₂时显示m₂的重量。如果偏差超过0.5%检查是不是砝码精度不够、传感器非线性太明显或者机械结构存在额外应力。3.3 用中间重量点验证线性度两点校准做完不要急着固化。找第三个重量点比如满量程的40%放上去看看实际显示和真值差多少。差得少说明两点线性模型够用如果中间点显示明显偏低或偏高说明非线性不能忽略这时候需要做三点校准加分段插值。分段线性插值的思路很直接标定三个点起点、中间点、终点程序里根据当前原始值落在哪个区间就用哪个区间的斜率来换算重量。代码上就是一个if-else并不复杂但很多电子秤DIY到这个阶段已经够用了我没必要在这里把人劝退到最小二乘那一步。顺便提一句如果你做的项目对精度有硬指标比如商用电子秤级别那就要考虑温度补偿、多次采样平均、更高性能的ADC方案HX711在这类场景里已经到极限了没必要硬撑。3.4 将校准参数固化到固件校准参数算出来之后写死在代码里最省事但有个问题以后每次改程序都要重新打开源码找那几个常量。更稳妥的做法是存到EEPROM或者SPIFFS里校准一次开机自动读取。EEPROM写入读取示意#include EEPROM.h void saveCalibration() { EEPROM.put(0, calibrationFactor); EEPROM.put(sizeof(float), zeroOffset); EEPROM.commit(); // ESP32需要Arduino AVR不需要 } void loadCalibration() { EEPROM.get(0, calibrationFactor); EEPROM.get(sizeof(float), zeroOffset); }注意一点换传感器、改增益、拆装机械结构之后EEPROM里的旧参数必须作废重新校准。我在程序里会加一个版本号校验校准模式写入一个新版本号如果EEPROM里的版本号和固件版本不一致就提示重新校准避免用着旧的校准数据配新的硬件。4. 常见问题排查与实操心得4.1 典型故障速查表故障现象可能原因排查方向零点持续漂移停不下来传感器未预热、机械应力未释放预热10分钟重新预压处理读数跳变波动超过预期供电噪声、线缆干扰、传感器激励线过长加电容缩短线缆测量时关闭电机继电器中间量程误差大两端还行单点校准存在非线性改两点或三点校准放上重物数值反向变化S和S-接反电桥信号极性反了交换传感器两根信号线换程序版本后读数全乱增益设置变了或用了别处抄来的系数重新校准确认set_gain(128)校准完隔几天又偏螺丝松动、结构蠕变、传感器疲劳重新紧固螺丝重新预压校准空载读数接近满量程或饱和传感器激励和HX711输入接错脚位对照模块丝印检查E、E-、S、S-接线4.2 先机械、再电气、后软件的三层检查法排错顺序比我列出的故障表更重要。我的固定流程是这样的先检查机械层看受力路径是否合理、螺丝是否拧紧、应变区有没有被阻挡再检查电气层看供电电压稳不稳、地线是否干净、传感器线有没有破皮短路最后才怀疑软件层查增益设置、滤波参数、校准系数是否被误覆盖。不少朋友一看到读数漂移第一反应是去改程序里的滤波算法结果折腾一晚上问题还在。实际上只要用手轻轻碰一下传感器的固定螺丝发现它松了故障原因就已经出来了。硬件上的问题不要用软件去修这是做传感器项目的第一条纪律。4.3 一些长期有用的习惯每次给新的称重项目写代码我都会预留一个“校准模式”入口物理按钮或串口命令都行。这个模式做的事很简单引导用户完成空载、轻载、重载三个步骤自动计算系数并写入EEPROM然后自动进入正常称重模式。别小看这个功能它让我以后复用自己的代码时少走很多弯路。还有就是在HX711数据采集上我习惯读原始值而不是直接读转化后的重量值。调试的时候串口同时打印raw和weight两列raw是用来判断链路状态的weight只是给人看的。raw值异常波动但weight被滤波掩盖了这种情况我遇到过不止一次。4.4 从电子秤延伸到更广的精密测量项目HX711电子秤做顺手之后你会发现它的底层逻辑和很多精密测量项目是相通的。拉力计、压力计、料位检测甚至更高端的ADC方案如ADS1220、DIY LCR电桥、开源SMU它们在标定时遵循的规律都一样先保证结构和电气稳定再选择多点标定最后验证。校准的本质从来都不是“按一个按钮”而是建立一个可重复、可追溯的测量基准。理解了这一点以后遇到再复杂的测量设备心里都有了底。最后再分享一个我自己的小习惯每次校准完我会用一个固定的重物比如手机在三个不同时间点各测一次把数据记在项目文档里。下次发现秤不准翻出这份记录对比能很快判断是漂移、温变还是结构松动。做硬件项目的经验往往就是从这样一条条记录里攒出来的。