从HX711到精准称重:自制电子秤的硬件原理与软件实现

发布时间:2026/7/28 8:00:18
从HX711到精准称重:自制电子秤的硬件原理与软件实现 1. 项目概述从厨房到工作台的精准测量如果你和我一样是个喜欢在工作室里捣鼓点小玩意儿的人或者对电子秤、压力传感器背后的原理感到好奇那么“自制一只小台秤”这个项目绝对值得你花上一个周末的时间。这不仅仅是一个简单的焊接和组装活儿它更像是一次从物理原理到数字信号的完整旅程。核心在于那个小小的芯片——HX711一个专门为称重传感器设计的24位模数转换器。市面上的电子秤、厨房秤甚至一些工业设备里都藏着它的身影。自己做一台你就能彻底搞懂从一片金属片的微小形变到屏幕上那个精确到克的数字中间到底发生了什么。这个项目适合谁呢首先当然是电子爱好者尤其是对模拟信号采集和单片机应用感兴趣的朋友。其次对于创客、学生或者任何想给家里的咖啡角、烘焙区添置一个独一无二、且能显示小数点后一位的精准小秤的人来说它都是一个绝佳的实践。你不仅能得到一个实用的工具更重要的是你会理解应变片电桥、差分信号、模数转换、数字滤波这一整套知识链。整个过程成本不高主要部件就是一个HX711模块、一个称重传感器通常是5kg或10kg量程的、一个单片机比如Arduino UNO或者ESP8266/ESP32再加上一些结构件。接下来我就带你从原理到代码从硬件到校准完整地走一遍。2. 核心硬件选型与原理深潜2.1 称重传感器感知压力的“机械心脏”自制台秤的核心感知元件是称重传感器最常见的是悬臂梁式。它看起来就是一块金属梁上面贴着几个关键的小东西——电阻应变片。它的工作原理基于“金属的应变效应”当金属梁受力弯曲时其表面会产生微小的拉伸或压缩形变。贴在表面的应变片一种特殊的电阻会随之发生电阻值的变化。通常四个应变片会以惠斯通电桥的方式连接。两个贴在梁的上表面受拉两个贴在梁的下表面受压。当没有负载时电桥平衡输出电压差为零。一旦放上重物梁弯曲上方的应变片被拉长电阻增加下方的被压缩电阻减小电桥失去平衡输出一个与压力成正比的微小电压信号通常是毫伏级别。这个信号极其微弱且容易受到温度、电磁干扰的影响直接读取几乎不可能这就需要我们的主角HX711登场了。注意选购传感器时除了量程如5kg关键参数是灵敏度单位是mV/V。常见值为1.0mV/V或2.0mV/V。这意味着在额定电压如5V激励下达到满量程时输出的信号电压幅度。这个值直接影响后续的测量分辨率和精度。2.2 HX711模块微信号的“放大镜”与“翻译官”HX711芯片的作用非常明确第一给惠斯通电桥提供稳定的激励电源第二将电桥输出的微弱差分模拟电压信号放大第三将放大后的模拟信号高精度地转换为数字信号。它集成了可编程增益放大器PGA和24位Δ-Σ型模数转换器ADC。为什么是24位ADC位数决定了ADC的分辨率。对于一个5kg量程、灵敏度2.0mV/V的传感器在5V激励下满量程输出信号是10mV。如果使用常见的10位ADC参考电压5V其最小分辨电压约为5V/1024 ≈ 4.9mV这意味着它连传感器的满量程信号都分辨不了几步精度极差。而24位ADC其理论分辨率可达5V/(2^24) ≈ 0.3μV足以清晰分辨传感器输出的微伏级变化从而实现克甚至更小单位的精确测量。可编程增益放大器PGA允许我们选择128或64倍的增益。对于输出信号较小的传感器如1mV/V可以选择128倍增益以获得更好的信噪比对于信号较大的可选64倍以避免饱和。HX711模块通常将增益固定为128倍并通过板载的稳压器为传感器提供稳定的5V或3.3V激励这比直接用单片机的IO口供电要稳定得多减少了因电源波动带来的测量误差。2.3 控制器与结构件项目的“大脑”与“骨骼”控制器负责与HX711通信、读取数据、进行计算、校准和显示。最经典的选择是Arduino UNO其库生态完善入门简单。如果你希望增加无线传输、网页显示等功能ESP8266如NodeMCU或ESP32是更强大的选择。它们自带Wi-Fi可以用更少的成本实现物联网称重。结构件决定了台秤的稳定性和外观。你需要一个坚固的底座来固定传感器的固定端一个秤盘或托盘连接传感器的受力端。中间需要设计一个传力结构确保重量垂直、均匀地施加在传感器受力点上避免侧向力影响精度。常用的材料有亚克力板、木板或3D打印件。这里有一个关键技巧在传感器受力点和秤盘之间最好使用一个球头或半球形结构连接这样可以自动对中消除因放置物品位置偏移产生的扭力大幅提升测量的重复性。3. 电路连接与硬件搭建实操3.1 HX711模块引脚详解与接线图市面上常见的HX711模块通常有6个引脚VCC模块电源正极接5V。GND电源地与单片机共地。DT数据输出引脚接单片机任意数字IO口。SCK时钟输入引脚接单片机另一数字IO口。E传感器电桥电源正极输出。E-传感器电桥电源负极输出。A A-传感器信号正、负输入端。B B-另一组差分信号输入本项目通常不用。称重传感器一般有4条线颜色标准通常是红色电源 (Excitation)黑色电源- (Excitation-)白色信号 (Signal)绿色信号- (Signal-)接线步骤供电连接将Arduino的5V和GND分别连接到HX711模块的VCC和GND。信号连接将HX711模块的DT和SCK引脚分别连接到Arduino的数字引脚例如DT接D2SCK接D3。传感器连接传感器红线 → HX711模块的E传感器黑线 → HX711模块的E-传感器白线 → HX711模块的A传感器绿线 → HX711模块的A-重要提示接线务必牢固接触不良是导致读数跳动、不准的首要原因。建议使用杜邦线焊接或者用螺丝端子压接。在通电前再三检查电源正负极是否接反接反很可能永久损坏传感器或HX711模块。3.2 机械结构组装要点机械组装的核心目标是让传感器的受力端只承受垂直向下的力并且力要作用在设计的受力中心上。底座固定用螺丝将传感器的固定端通常有两个安装孔牢牢锁在底座板上。底座板本身要足够重、足够稳防止称重时整个秤体晃动。秤盘连接在传感器的受力端通常是一个中心带螺纹的孔安装一个连接杆。连接杆的上端与秤盘连接。这里就是我前面提到的关键点强烈建议在连接杆和秤盘之间加入一个“万向节”结构。一个简单的做法是在连接杆顶端放置一颗钢珠秤盘底部做一个凹坑。这样无论物品放在秤盘哪个位置力都会通过钢珠自动垂直传递到传感器中心完美解决偏载误差。限位与保护传感器虽然有量程但过载或侧向冲击很容易导致其塑性变形而损坏。可以在底座和秤盘之间围绕传感器安装几个限位螺栓。调整螺栓头部与秤盘底部的间隙为1-2毫米。这样当放入远超量程的重物或受到冲击时限位螺栓会先接触并承受大部分力保护传感器。这个间隙不能太小否则会影响正常量程内的测量。4. 软件编程与核心算法解析4.1 库的安装与基础读数程序在Arduino IDE中我们通常使用HX711_ADC库它比基础的HX711库功能更强大内置了数字滤波和校准功能。通过库管理器搜索并安装。下面是一个最基础的、读取原始ADC值的程序#include HX711_ADC.h // 定义HX711连接的引脚 const int HX711_dout 2; // DT引脚 const int HX711_sck 3; // SCK引脚 // 创建HX711对象 HX711_ADC LoadCell(HX711_dout, HX711_sck); void setup() { Serial.begin(57600); delay(10); Serial.println(Initializing...); LoadCell.begin(); // 启动传感器参数1.0是初始校准值未校准时 unsigned long stabilizingtime 2000; // 稳定时间 boolean _tare true; // 启动时是否去皮 LoadCell.start(stabilizingtime, _tare); if (LoadCell.getTareTimeoutFlag()) { Serial.println(Timeout, check MCUHX711 wiring and pin designations); while (1); } else { LoadCell.setCalFactor(1.0); // 设置校准系数为1.0 Serial.println(Startup is complete); } } void loop() { // 检查是否有新的数据可供读取 if (LoadCell.update()) { // 获取原始ADC值未校准 long rawData LoadCell.getData(); // 获取经过当前校准系数计算后的重量值单位取决于校准 float weight LoadCell.getData(); Serial.print(Raw ADC value: ); Serial.print(rawData); Serial.print( | Weight: ); Serial.print(weight, 1); // 显示1位小数 Serial.println( g); } delay(100); }这段代码初始化了HX711并循环打印原始ADC值和当前重量值。在未校准时“重量值”是没有意义的数字。4.2 校准流程赋予读数真实意义校准是让这台自制秤变得可用的最关键一步。其物理原理是建立一个线性模型测量值 校准系数 * 原始ADC值 零点偏移。HX711_ADC库已经帮我们处理了零点偏移通过tare()去皮功能所以我们主要就是确定校准系数。标准砝码校准法确保秤盘空载运行程序调用LoadCell.tareNoDelay()进行去皮。此时重量应显示为0。将一个已知精确重量的标准砝码例如500.0g放在秤盘中心。等待读数稳定后记录下此时库函数LoadCell.getData()返回的“重量”读数假设是readValue比如是123456.7。计算校准系数calFactor (已知重量) / (readValue - 0点值)。因为已经去皮0点值为0所以calFactor 500.0 / 123456.7 ≈ 0.00405。在程序中通过LoadCell.setCalFactor(0.00405)设置这个系数。重新运行程序放上砝码检查显示是否接近500.0g。可以再使用另一个不同重量的砝码如200g进行验证。为了方便库提供了串口指令交互的示例。你可以上传Calibration示例代码然后通过串口监视器发送指令来交互式完成校准和去皮非常方便。4.3 数字滤波与软件稳像原始ADC读数即使在没有负载时也会在小范围内跳动这是由于电源噪声、热噪声等引起的。直接使用跳动的读数体验很差。HX711_ADC库内置了移动平均滤波。// 在setup()中可以设置滤波强度 LoadCell.setSamplesInUse(4); // 使用最近4次采样的平均值 // 或者更高级的使用内置的平滑滤波 void loop() { static boolean newDataReady 0; // 检查新数据并尝试平滑滤波 if (LoadCell.update()) newDataReady true; if (newDataReady) { if (millis() t serialPrintInterval) { float weight LoadCell.getSmoothedData(); // 获取平滑后的数据 Serial.print(Weight: ); Serial.println(weight, 1); newDataReady 0; t millis(); } } }getSmoothedData()函数使用了更复杂的算法来平滑数据比简单的移动平均效果更好能让最终显示的数字稳定下来不会频繁跳动。你还可以在读取后自己增加额外的软件滤波比如“去极值平均滤波”连续采样N次去掉最大最小值剩下的求平均。5. 功能扩展与项目优化5.1 添加显示与交互界面最基本的显示是接一个0.96寸OLED屏幕I2C接口。在代码中引入Adafruit_SSD1306和Adafruit_GFX库。在loop循环中将获取到的重量值显示在屏幕上还可以增加单位切换g/kg/oz、去皮按钮等功能。为了操作方便可以添加两个按钮一个用于去皮Tare一个用于切换单位。去皮功能的实现很简单在按钮按下时调用LoadCell.tareNoDelay()即可。单位切换则是在显示前对重量值进行数学换算。// 示例按钮去皮 const int tareButtonPin 4; void loop() { if (digitalRead(tareButtonPin) LOW) { // 假设按钮按下为低电平 delay(50); // 简单消抖 if (digitalRead(tareButtonPin) LOW) { LoadCell.tareNoDelay(); Serial.println(Tare done); } while(digitalRead(tareButtonPin) LOW); // 等待按钮释放 } // ... 其他逻辑 }5.2 物联网升级使用ESP8266/ESP32将控制器换成ESP8266你可以实现网页服务器让手机或电脑通过浏览器直接访问ESP的IP地址看到一个实时显示重量的网页。数据上报将重量数据定期发送到物联网平台实现远程监控。例如做一个智能宠物喂食器监控余粮重量或者一个盆栽土壤湿度监测通过称重花盆失水重量来间接判断。蓝牙串口通过手机蓝牙APP读取数据更方便。这里以ESP8266创建简易Web服务器为例#include ESP8266WiFi.h #include ESP8266WebServer.h #include HX711_ADC.h // ... HX711初始化代码 ... const char* ssid Your_WiFi_SSID; const char* password Your_WiFi_Password; ESP8266WebServer server(80); void handleRoot() { float weight LoadCell.getSmoothedData(); String html htmlbodyh1My Scale/h1pWeight: strong String(weight, 1) g/strong/p; html pa href\/tare\buttonTare/button/a/p; // 网页去皮按钮 html /body/html; server.send(200, text/html, html); } void handleTare() { LoadCell.tareNoDelay(); server.sendHeader(Location, /); server.send(303); } void setup() { // ... 初始化HX711 ... Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() ! WL_CONNECTED) { delay(500); Serial.print(.); } Serial.println(); Serial.print(Connected! IP address: ); Serial.println(WiFi.localIP()); server.on(/, handleRoot); server.on(/tare, handleTare); server.begin(); } void loop() { LoadCell.update(); server.handleClient(); }5.3 提高精度与稳定性的高级技巧电源隔离与滤波HX711模块和传感器对电源噪声非常敏感。如果使用开关电源比如手机充电器为整个系统供电可能会引入高频噪声。一个有效的办法是使用线性稳压模块如LM7805为HX711单独供电或者在电源入口处增加大容量如1000uF电解电容和0.1uF的陶瓷电容进行滤波。温度补偿应变片的电阻值会随温度变化而漂移导致零点漂移和灵敏度漂移。对于高精度要求可以在电路中增加一个温度传感器如DS18B20实时监测传感器温度并在软件中根据一个预制的温度-误差表进行补偿。这是一个进阶话题需要你记录不同温度下空载和带载的读数来建立模型。多点校准单点校准只用一个砝码假设系统的线性度是完美的。但实际传感器和电路可能存在微小的非线性。更高精度的做法是进行两点或三点校准空载点0g和满量程点如5kg是必须的中间点如2.5kg可以进一步修正非线性误差。校准后可以使用分段线性插值或二次曲线拟合来计算重量。机械隔离确保整个秤体放置在平稳、无振动的台面上。对于微小重量的测量甚至需要避免空气流动和人员走动带来的干扰。6. 常见问题排查与调试心得在实际制作过程中你几乎一定会遇到下面这些问题。我把我的踩坑经验总结在这里希望能帮你快速通关。问题1读数乱跳完全不稳定。检查接线这是最常见的原因。用手轻轻捏一下杜邦线接头看读数是否剧烈变化。务必确保所有连接牢固最好焊接。检查电源用万用表测量HX711模块的VCC电压是否稳定在5V左右。尝试换用电池或不同的USB口供电排除电源干扰。检查机械结构秤盘或传力机构是否稳固有没有碰到任何东西传感器本身是否安装平整轻微的倾斜或应力都会导致读数漂移。添加软件滤波如前面所述启用库的平滑滤波或自己增加滤波算法。问题2有负载但读数接近零或不变。检查传感器接线顺序确认传感器的红、黑、白、绿四根线是否严格按照对应关系接到HX711的E, E-, A, A-。最常见的就是信号线正负极接反。测试传感器用万用表电阻档测量传感器红黑线之间的电阻通常是350Ω或1000Ω左右再测量白绿线之间的电阻应与红黑间电阻相近。如果阻值异常如开路或短路则传感器可能已损坏。检查增益设置确认代码中初始化的增益与模块硬件匹配。不过大多数模块固定为128倍问题不大。问题3去皮或校准后数据依然不准。校准流程错误确保去皮时秤盘绝对空载。校准时砝码必须放置在秤盘中心并等待读数完全稳定通常需要几秒钟后再记录。砝码不准不要用随机物品当砝码。使用经过校准的标准砝码。如果没有可以用一瓶未开封的500ml矿泉水约500g或已知重量的厨房秤进行交叉验证。非线性误差如果只在轻量时准重量大了偏差变大可能是传感器非线性或机械结构在重载下形变。尝试进行两点校准零点满量程点。问题4ESP8266读取数据慢或不稳定。注意延时ESP8266的Wi-Fi和TCP/IP栈会占用大量CPU时间可能干扰HX711通信时序。在loop()中确保LoadCell.update()被频繁调用。避免在update()之间进行长时间的阻塞操作如delay(1000)。使用非阻塞的定时方式。电源不足ESP8266在Wi-Fi发射时峰值电流可能超过200mA如果USB线或电源模块供电不足会导致电压跌落影响HX711工作。使用能提供5V/1A以上的电源。个人心得耐心是金硬件项目尤其是涉及精密测量的八成的问题出在接触和电源上。遇到问题先冷静下来从最基本的连线、供电查起。分步测试不要一次性写完所有代码。先写最简单的读ADC原始值程序确认硬件通信正常。再加上滤波显示最后做校准和高级功能。每一步都验证通过能极大降低调试难度。机械重于电路在这个项目里一个稳定、对称、传力直接的机械结构对最终精度的影响往往比电路优化更大。多花点时间打磨你的秤盘和连接结构绝对值得。拥抱不完美自制台秤受限于传感器等级、ADC噪声、环境干扰很难达到商用高端产品的精度和稳定性。但只要重复性够好即多次称量同一物品结果一致并且通过校准在常用量程内准确这个项目就是成功的。它能让你理解原理满足日常大部分非贸易用途的称重需求这已经足够了。