☰
Arduino+HX711自制高精度电子秤:从传感器选型到校准全攻略
2026/10/7 1:14:40 网站建设 项目流程

最近好几个玩 Arduino 的朋友问我,说想做个能显示重量的电子秤,但又不想买那种几十块钱的成品模块,想自己从传感器到显示全流程打通。我最初也是从这块入手的,用 HX711 加一个 5kg 平行梁传感器,再接一块 0.96 寸 OLED,大概半小时就能跑起来,测量精度能做到正负 1 克左右,日常称个小零件、做个小物件完全够用。

这个项目特别适合刚接触 Arduino 的朋友,它不像控制舵机或者跑小车那样有复杂的运动逻辑,核心就三件事:读传感器的数字信号、校准重量值、显示到屏幕上。但里面涉及的知识点又很典型,比如应变片原理、24 位 ADC 的使用、I2C 通信协议、OLED 驱动的坑,每一个都是以后做其他项目会反复用到的基本功。

这篇文章我会把整个制作过程拆开讲,从硬件选型、接线方式、代码实现到校准标定,一路写到常见问题排查。整个过程踩过的坑我会专门列出来,特别是 OLED 点不亮和 HX711 读数漂移这两个问题,几乎每个人都会碰到,网上搜到的答案又都比较零散。这里给出一份完整可复现的方案,照着做就能跑起来。

1. 硬件选型:先搞清楚三块板子怎么配

1.1 称重传感器怎么选

市面上最常见的称重传感器有两种封装:一种是四根线的平行梁传感器,量程有 1kg、3kg、5kg、10kg 等;另一种是半桥传感器,只有三根线,通常是两个一组使用。要做电子秤,优先选四根线的平行梁称重传感器,因为它在结构上自带完整的惠斯通电桥,一颗就能完成测量,不需要再去拼凑半桥。

量程选择上,我个人建议在预期最大称重的基础上留出 1.5 到 2 倍的余量。比如日常称手机、小零件,选 1kg 或者 3kg 就够;如果偶尔要称几本书或者厨房食材,5kg 更从容。不要追求大满配直接上 10kg,因为量程越大的传感器,在重量小的时候分辨率相对越差,称一个 10g 的螺丝,误差会比小量程传感器明显。

传感器的外观是一个铝合金或者铁质的长条块,中间有个通孔。出厂时上面会贴一张小标签,标注量程和灵敏度,比如 5kg、1.0mV/V。这个 1.0mV/V 是灵敏度参数,意思是当传感器供电 5V、施加满量程重量时,输出差分电压是 5V 乘以 1.0mV/V,也就是 5mV,电压非常小,所以我们后面必须经过 HX711 的放大器才能被单片机有效读取。

1.2 HX711 模块要注意的细节

HX711 是一颗专用的 24 位高精度 A/D 转换芯片,专为电子秤设计。市面上常见的模块是一个蓝色或绿色的小板子,上面有 HX711 芯片、一个晶振、还有一排排针,板上通常标注着 VCC、GND、SCK、DOUT 四个引脚,另一边是传感器的接线端子,标着 E+、E-、A+、A- 或者红黑绿白。

选模块的时候注意看板子上有没有集成稳压电路。有些精简模块直接把 VCC 接到芯片,没有经过去耦稳压,读数会受电源波动影响。我用的模块带了一个 5V 转 3.3V 的稳压,HX711 芯片本身的模拟电源由这个稳压输出供电,这样读数稳定很多。另外注意 DOUT 和 SCK 两个引脚的电平逻辑,很多模块用 3.3V 供电,但 Arduino 的数字引脚输出是 5V,这在这个场景下可以直接驱动模块,实测没问题。部分 ESP32 用户需要小心,如果你用的是 3.3V 逻辑的 ESP32,模块的 SCK 有时需要串联一个 1k 电阻做电平匹配,避免部分芯片烧坏。

关于 HX711 芯片手册,我之前专门翻过一遍,里面有个细节很重要:芯片的通道 A 可编程增益为 128 或 64,通道 B 固定增益为 32。绝大多数模块默认接的是通道 A,增益 128。在代码库里我们可以去设置增益,默认 128 就是我们需要的状态,放大后的等效分辨率非常细,可以读到非常微小的重量变化,这也是 HX711 适合做电子秤而不是普通 ADC 的核心原因。

1.3 OLED 屏选 I2C 还是 SPI

OLED 屏分 I2C 和 SPI 两种接口,分辨率常见的有 0.91 寸 128 乘 32 和 0.96 寸 128 乘 64。做电子秤这类显示内容不复杂的项目,优先选 I2C 接口的 0.96 寸 128 乘 64,因为接线只要两根信号线(SDA、SCL),再加上电源和地,一共四根线就搞定。SPI 接口虽然刷新率高一些,但要占用更多引脚,对电子秤这种低频刷新场景来说完全没有必要。

这里要提醒一个容易踩的坑:市面上的 OLED 模块地址不完全是同一个。SSD1306 这个驱动芯片的 I2C 地址由模块背面一个电阻决定,大部分是 0x3C,但也有部分是 0x3D。代码跑不起来,屏幕上没显示,首先扫描一下总线地址,确认你的模块到底是 0x3C 还是 0x3D。这个我后面在常见问题里会展开讲。

还有一个在买屏幕时要注意的点:同样标着 0.96 寸,屏幕的驱动芯片可能是 SSD1306 也可能是 SH1106,两者在驱动方式上有细微差别。好在 Arduino 的 Adafruit SSD1306 库对这两种驱动都能适配,但是如果你用的是 STM32 的 HAL 库,自己写驱动时就要区分了。Arduino 用户基本不用纠结这个。

2. 从物理原理到测量逻辑:为什么 HX711 能称重

2.1 应变片与惠斯通电桥

传感器之所以能感知重量,靠的是内部的应变片(一种电阻会随着形变而变化的元件)。当物体压在传感器上时,传感器的弹性体发生微小形变,贴在弹性体上的应变片跟着被拉伸或压缩,电阻值随之改变。四根线的传感器内部把两个受拉和两个受压的应变片组成惠斯通电桥,电桥的差分输出电压和所受力大小成正比。

你可以把应变片理解成一根拉长后会变细的金属丝:又被拉长时,它的电阻变大;被压缩时,电阻变小。电桥的巧妙之处在于,它能把“两个电阻变大、两个电阻变小”的微小变化巧妙地叠加起来,放大成可供测量的差分信号。这样即使温度变化引起的普通电阻漂移,也会因为电桥的对称性而被抵消掉一部分,这是惠斯通电桥在传感器领域大量应用的根本原因。

2.2 24 位 ADC 与增益到底在做什么

HX711 内部集成了低噪声放大器和一个 24 位的 Delta-Sigma ADC。传感器送来的差分电压只有几毫伏,这个量级直接交给普通单片机去读是不可行的,因为普通单片机的 ADC 分辨率通常只有 10 位或 12 位,参考电压是 5V,一个 LSB 就代表大约 1.2mV,根本无法区分 0.6mV 和 0.7mV 的差别。而 HX711 先把信号放大 128 倍,再用一个 24 位的 ADC 去量化,分辨率极高,能分辨出非常微小的电压变化。

Delta-Sigma ADC 的原理这里是需要补一下的:它并不是直接对电压做逐次逼近,而是通过对信号反复积分、比较、反馈,生成一串高速的 1 位数据流,再用数字滤波器把多位结果算出来。这样做的好处是噪声被平均掉了,精度很高,代价是转换速度不快。HX711 的输出速率默认是 10 SPS(每秒 10 次采样),后面代码里我们做多次采样取平均,就是基于这个速度来安排的。

2.3 比例测量:为什么不需要精确的基准电压

做电子秤时还有一个很容易让人困惑的点:HX711 的参考电压其实就来自 ADC 芯片的供电电压(AVDD),而这个电压会波动,按理说读出来的数值不应该受影响吗?实际上不会,因为整个测量系统是一个比例测量系统。

传感器输出的差分电压正比于激励电压(也就是 VCC 或 AVDD),而 ADC 的参考电压也是同一路 AVDD。当 AVDD 升高或降低时,传感器输出和 ADC 的满量程基准会同步变化,两者相除的结果在理想情况下保持不变。这就意味着,用 HX711 做电子秤时,你不需要一个高精度的基准电压源,供电只要在芯片允许范围内,测量值就相对稳定。这是 HX711 方案成本低但精度依然不错的重要原因。

3. 接线、供电与安装细节

3.1 全桥传感器接线颜色对应

四根线的传感器,线色标准比较统一:

传感器线色含义接 HX711 模块
红色激励电压正极 E+E+ 端子
黑色激励电压负极 E-E- 端子
白色信号输出正 A+ 或 S+A+ 端子
绿色信号输出负 A- 或 S-A- 端子

如果接反了,现象不是不工作,而是读数会变成负数,或者当你按下传感器时,读数朝反方向变化。遇到这种情况,交换白色和绿色两根线就行。关于线的颜色,不同厂家偶尔有差异,但红黑白绿是最普遍的。

HX711 模块到 Arduino 的接线更简单,以 Arduino Uno 或 Nano 为例:

HX711 模块引脚Arduino Uno/Nano 引脚
VCC5V
GNDGND
SCKD2
DOUTD3

有的库在初始化时参数顺序是begin(DOUT, SCK),有的库是begin(SCK, DOUT),这个细节我会在代码章节里专门说明,否则一上来就踩坑。

3.2 OLED 的 I2C 接线与地址

OLED 屏的接线几乎固定,因为它是标准的 I2C 协议设备:

OLED 引脚Arduino Uno/Nano 引脚
VCC5V(部分模块 3.3V,看你板子上的稳压情况)
GNDGND
SCLA5
SDAA4

注意 Uno 和 Nano 的 I2C 引脚固定在 A4(SDA)和 A5(SCL),不能随便换到别的数字引脚。如果你用的是 ESP32,I2C 引脚是 GPIO21(SDA)和 GPIO22(SCL),代码初始化时要用Wire.begin(21, 22)指定。这个项目如果换到 ESP32 上,除了引脚位置改一下,几乎不需要改其他代码,有兴趣的可以顺手试试。

OLED 的 I2C 地址 0x3C 或 0x3D 我这里再提一下。先用一个 I2C 扫描程序,几行代码扫出总线上有哪些设备地址,再把这个地址填到 SSD1306 库的初始化里,比对着教程猜地址可靠得多。

3.3 传感器的机械安装与供电注意事项

接线只是第一步,机械安装直接影响测量稳定性和重复精度。传感器的平行梁一端有孔,用螺丝固定在底座上;另一端悬空,用来承载物体。两端固定的方向要严格按照厂商的箭头或标签说明,有的传感器标注了受力方向,装反了读数完全是乱的。

固定传感器时用 3mm 的螺丝,不要拧得太紧,否则可能让弹性体提前受力变形,导致空载读数不稳定。底座要平稳,最好放在硬质桌面上,不要在软垫或手上测试,架子晃动会影响应变片的形变。

供电方面,Arduino 的 5V 引脚可以直接给 HX711 模块和 OLED 屏供电,前提是整体电流不超过 USB 口的供电能力。实测下来,HX711 模块加 OLED 屏加 Arduino Uno,工作电流不到 100mA,USB 口完全带得动。但如果你的 OLED 是那种带背光的、或者你想加 WiFi 模块,电流需求就会上升,建议改用外部 5V 电源给 Arduino 供电,不要继续吃 USB 口。

4. 代码实现与关键函数拆解

4.1 环境准备与库安装

整个代码依赖两个库:一个是 Adafruit SSD1306(OLED 显示),另一个是 HX711 驱动库。Adafruit SSD1306 又依赖 Adafruit GFX 库,而 HX711 库有很多版本,我推荐使用bogde/HX711这个库,因为它的接口设计非常清晰,大量开源项目在用它维护也更活跃。

在 Arduino IDE 里打开“库管理器”,搜索Adafruit SSD1306并安装,它会自动提示你安装依赖的Adafruit GFX库,也一并安装。再搜索HX711,找作者是 Bogdan Necula 的那一版,安装即可。

如果你不想用 Adafruit 那一套庞大的图形库,其实 OLED 显示重量数字也可以用U8g2库,或者直接用SSD1306的精简库。但对初学者来说,Adafruit 库文档最全,资料最多,出问题也好搜,所以我这里以它为准。

4.2 完整示例代码

下面是一份可以直接编译上传的代码,我尽量把注释写详细。接线就以 Uno/Nano 为参考,前面表格里的接法。

#include <HX711.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCK_PIN 2 #define DOUT_PIN 3 #define OLED_RESET -1 // HX711 对象 HX711 scale; // OLED 对象,分辨率 128x64,I2C 地址 0x3C Adafruit_SSD1306 display(128, 64, &Wire, OLED_RESET); // 校准因子:单位是“传感器原始读数 / 克” // 这个数值需要用标准砝码标定,不同传感器、不同供电都会不同 float calibration_factor = 405.0; // 去皮基准值 float tare_value = 0.0; void setup() { Serial.begin(115200); Serial.println(F("Starting Scale...")); // 初始化 OLED if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F("SSD1306 allocation failed")); while (true); } display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(20, 20); display.println(F("Scale")); display.display(); delay(1000); // 初始化 HX711 // 注意 bogde/HX711 库的引脚参数顺序是 begin(DOUT, SCK) scale.begin(DOUT_PIN, SCK_PIN); // 设置校准因子(scale 值),含义是“每个读数单位对应多少克” scale.set_scale(calibration_factor); // 去皮:把当前空载读数记为基准零点 scale.tare(); } void loop() { // get_units(5) 表示采样 5 次取平均值,单位是克 float weight = scale.get_units(5); // 避免传感器回零不完全时出现的轻微负值 if (weight < 0) { weight = 0; } Serial.print(F("Weight: ")); Serial.print(weight, 1); Serial.println(F(" g")); // 刷新 OLED 显示 display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 24); display.print(weight, 1); display.print(F("g")); display.display(); delay(200); }

这段代码上电后先显示“Scale”约 1 秒,然后自动去皮归零,之后循环读取重量并在 OLED 上显示。串口也会同时输出重量值,方便调试时在电脑上观察。

4.3 关键函数与常见误区

很多第一次接触 HX711 库的朋友会搞混set_scale()和tare()的作用。set_scale()设置的是校准因子,它把传感器原始读数映射成克数,是一个缩放系数;tare()则是把当前的原始读数记录为基准零点。可以这样理解:set_scale()决定“每一格代表多重”,tare()决定“哪里算是零”。

在上面的循环里,scale.get_units(5)的意思是连续读取 5 次,每次调用都会等待 HX711 有新的转换结果,然后取平均。这个采样次数可以根据需求调整:次数多能平滑掉一些随机噪声,但响应变慢;次数少响应快但读数可能跳动。电子秤场景我用 5 到 10 次都行,试过之后感觉 5 次是比较舒服的平衡点,显示更新也足够快。

另一个容易踩坑的地方是库的引脚顺序。Bogdan 库的构造函数和初始化顺序如下:

scale.begin(DOUT_PIN, SCK_PIN);

注意第一个参数是 DOUT,第二个是 SCK。网上很多老版本的示例写的是scale.begin(SCK_PIN, DOUT_PIN),如果你的库是最新版,接反了会发现读数始终为零或者程序卡住。如果遇到这种现象,检查一下是不是引脚顺序搞反了。

5. 校准与标定:电子秤准不准全看这一步

5.1 校准因子的本质

HX711 输出的原始值是一个大整数,它和传感器受力之间是线性关系,但这个关系的斜率由传感器灵敏度、HX711 增益、供电电压等共同决定。校准因子的核心作用就是把原始读数转换成克数。

理论上,校准因子等于“标准重量对应的原始读数变化量 ÷ 标准重量”。举例来说,如果你放上 100g 砝码,原始读数从空载时的 0 变成了 40500,那么校准因子就是 40500 ÷ 100 = 405。这个数值直接对应代码里calibration_factor的初始值。

5.2 两点校准法实操步骤

校准并不复杂,关键是手里要有一个标准砝码。没有砝码的人可以用一枚一元的硬币代替,新的、未磨损的一元硬币重量大约是 6 克。优先建议买一套便宜的砝码,几十块钱,比靠感觉准确得多。

具体校准步骤我拆成四步:

  1. 上传原始代码后,打开串口监视器,波特率 115200,等待 OLED 显示出空载读数。
  2. 观察空载时get_units(5)的输出。由于tare()已经在 setup 里执行过,空载读数应该在 0 附近。
  3. 放上已知重量砝码。比如放 100g,记录串口输出的重量值。如果显示的不是 100g,而是比如 93.5g,说明校准因子需要调整。
  4. 调整calibration_factor。新的校准因子 = 旧校准因子 ×(标准重量 ÷ 当前显示重量)。例如旧值是 405,显示 93.5g,那新值就是 405 ×(100 ÷ 93.5)≈ 433.16。把这个值填入代码,重新上传或动态调整,再放砝码验证,反复校准两轮,精度就能很理想。

为了方便动态调整,我经常在代码里加串口指令调试功能。比如通过串口收到a加一点点校准因子,收到z减一点点,收到t执行一次去皮。这样不用每改一次参数就重新上传,调试效率高很多。

5.3 实际称重测试与精度表现

校准完成后,我拿厨房电子秤做了一次对比测试:放一颗标准电池,电子秤显示 23.4g,自制的读数也在 23.2g 到 23.5g 之间浮动,误差基本在 0.3g 以内。对于大多数日常生活场景来说,这个精度足够。

需要注意,校准因子在温度变化明显时会有漂移。传感器本身带有温度系数,冷启动到运行一段时间后,空载读数可能发生偏移。所以我代码里在开机时自动执行了一次tare(),但如果你长时间运行,建议周期性执行去皮,或者用功能键手动去皮。这也是电子秤成品普遍有“去皮”按钮的原因。

6. 功能扩展:从称重到更多玩法

电子秤的核心功能做好之后,剩下的扩展方向其实是很多的。比如加两个按键,一个去皮一个开关键;或者加一个串口输出的折线图显示称重变化;再或者把数据发送到服务器做一个小型的数据采集系统。下面是我试过且觉得比较实用的几个方向。

第一个方向是增加按键去皮。用两个轻触开关接到 D4 和 D5,按一下去皮键调用scale.tare(),按一下背光键控制 OLED 屏幕开关。接线很简单,按键一边接 GND,一边接数字引脚,在代码里配置引脚为 INPUT_PULLUP 模式即可,不需要外部上拉电阻。遇到矩阵键盘没有反应这类问题时,可以去扫描一下引脚定义和上拉模式,是不是把引脚配置成了普通输入。

第二个方向是数据可视化。把串口输出的重量值接到 Processing 或者 Python 的 pySerial,可以实时画出重量变化曲线。之前称一颗不断往下滴水的湿毛巾时,用曲线看蒸发过程很有意思,也能直观看到传感器的漂移快慢。数据采集精度并不高,但足够观察到趋势上的变化。

第三个方向是做个完整的厨房秤。在亚克力板上钻四个孔,把传感器固定在支撑结构上,外壳用亚克力或木头拼装,供电改成锂电池加充电板。如果选 0.91 寸 OLED 128 乘 32 的小屏,整个设备可以做得非常迷你,放口袋里都行。

ESP32 用户还可以通过自带的 WiFi 模块把重量同步到手机,或者做一个远程的库存监测系统。Arduino 做前端采集、ESP32 做后台上云,这套组合在电商库存管理、宠物喂食器的场景都很常见。对 ESP32 装配不熟的读者,可以先在 Wokwi 仿真平台上把逻辑跑通,再操作实机。Wokwi 对 Arduino 和 ESP32 的支持已经很完善,可以直接在网页里拖拽 HX711 和 OLED 模块模拟,调试完采样逻辑再上真机,省了不少来回烧录的时间。

7. 常见问题速查表与排查实录

7.1 OLED 点不亮或者上电卡死

这个问题出现的频率极高。我从一开始就怀疑是代码问题,后来排查下来才发现主要有三类原因:地址不对、接线不牢、供电不足。

排查的第一步是确认 I2C 地址。用下面这段扫描代码替换主程序,上传后打开串口监视器,看总线上扫描到的设备地址是什么。如果你是 0x3C 的屏,却写成了 0x3D,那 OLED 绝对不会工作。

#include <Wire.h> void setup() { Serial.begin(115200); Wire.begin(); } void loop() { byte error, address; int nDevices = 0; for (address = 1; address < 127; address++) { Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print(F("I2C device found at 0x")); if (address < 16) Serial.print(F("0")); Serial.println(address, HEX); nDevices++; } } if (nDevices == 0) Serial.println(F("No I2C devices")); delay(2000); }

如果扫描不出任何地址,重点检查 SDA 和 SCL 两根线有没有松动或者接反,VCC 是否接到了对应电位的电源上,GND 是否共用。还有就是不要忘记 OLED 和 Arduino 必须共地,这是 I2C 通信的硬性要求。

还有一种情况:OLED 屏幕本身坏了或者焊接虚焊。OLED 屏是贴片器件,模块引脚的焊盘很小,出厂时如果焊接不良,上电后可能点不亮。这时候用万用表量一下模块上 VCC 和 GND 之间的电压,再量一下 SDA 和 SCL 引脚上是否存在上拉电平(通常是 3.3V 或 5V)。如果 VCC 有电但上拉没电平,基本就是屏幕排线或焊盘虚焊了。

7.2 代码里加了 OLED 函数之后程序卡死

有一种很典型的场景:代码单独跑 HX711 没问题,单独跑 OLED 也没问题,但把两个部分合在一起,程序就卡死了。这个问题多半出在 I2C 总线冲突上。HX711 虽然是通过时钟脚和数字脚通信,但有些版本的 HX711 库内部也使用了 Wire 库的某些资源,或者你在初始化顺序上有问题。

解决办法比较粗暴但有效:先初始化 HX711,再初始化 OLED,并且包一层错误判断,加一个复位逻辑。OLED 初始化失败时不要死循环,打印错误信息,让程序继续跑,这样卡死问题至少不会影响整个设备。

还有一次我碰到程序卡死,原因是display.begin()放在了Wire.begin()之前。SSD1306 库会在begin()内部调用Wire相关方法,如果 Wire 还没初始化就会卡住。所以请确保在程序早期调用Wire.begin()或者直接调用display.begin()之前,Wire 库已经被调用。

另外很多 SSD1306 库的例子会在display.begin()前加入delay(100),这不是玄学,而是给 OLED 驱动芯片一个上电稳定时间,特别是直接接 5V 的模块。批量买来的 OLED 模块如果不加这个延时,上电复位异常,可能导致“批量点不亮”的错觉。我后来在批量测试一批屏幕时,加了延时后点亮率确实提高了不少。

7.3 HX711 读数一直为零或者负数

如果代码和接线看起来都对,OLED 也正常显示,但重量读数始终在零附近不动,或者一放砝码就变成负数,多半是传感器信号接反或者传感器没有真正受力。

信号接反的情况排查方法很简单:用一个已知重量压到传感器上,看数字变化方向。如果数值变负,把白色和绿色两根线对调,或者把 A+ 和 A- 对调。

还有一种情况是传感器不受力,因为安装时仅把传感器固定好了,但承载面没有正确压在传感器的受力点上。平行梁传感器的受力点通常是在梁的悬臂端,需要用一个托盘或者支撑杆把力传递到那个点上。如果只是把重物放在传感器旁边的底座上,当然读不到任何变化。

另外还有 HX711 的 DOUT 引脚状态问题。如果 DOUT 一直为高电平,说明芯片没有完成转换或者通信时序不对。用示波器或万用表量一下运行中的 DOUT 引脚有没有周期性变化。如果完全没变化,大概率是 SCK 没有正常驱动 HX711,重点检查begin()里引脚定义是否和接线一致,先用最简单的数字开关代码去测试驱动。

7.4 读数跳动和漂移的问题

读数跳动常常是电源和线路问题。Arduino 由 USB 供电,而 USB 口的电压有时会随负载波动,如果传感器线过长、线径过细,信号线受到的干扰也更大。解决方法:一是用质量好一点的杜邦线;二是让信号线尽量远离电源线和电机驱动类线缆;三是给 Arduino 换一个稳定的供电电源,比如手机充电器加一个稳压模块,而不是一直吃电脑 USB。

软件层面的平滑手段也有不少。比如在get_units()参数里增加采样次数,从 5 次改到 10 次;或者自己实现一个滑动平均滤波器,用最近 10 次数据算平均值。代码里写一个简单的滑动窗口并不难,对减少数字跳动很有效。

漂移问题分两种:短时间漂移和长时间漂移。短时间漂移多由机械松动或空气流动导致,重新固定传感器或放在稳定的环境中即可。长时间漂移则是温度变化和传感器自身蠕变导致的,解决方法就是开头说的:定期执行tare()重新置零。如果你的应用要求长时间连续监测重量,可以写一个定时去皮逻辑,比如每小时自动去皮一次。注意去皮时要保证秤上没有物体,否则基准点会被错误地改写。

写在最后

从我个人的经验来看,全套硬件投入其实不超过四十块钱:HX711 模块几块钱,OLED 屏十几块,传感器十几块,Arduino 板子如果没有的话再算上兼容版的钱。调试时间主要集中在两点:一是第一次接线时的颜色对应关系,二是校准因子的迭代。这两关过了,后面基本就是一路顺畅。

整个项目最有价值的部分不是电子秤本身,而是你在这个过程中建立起的一套“传感器信号是怎么变成数字显示”的完整认知。以后再遇到其他传感器,心里就有了底:先查手册、看输出格式、弄清精度和量程、再想办法标定。这套方法论远比做出一台秤本身更重要。

如果你手头没有标准砝码,也可以先拿几枚规格一致的硬币标定个大致的数值,或者用瓶装水配合量筒估算重量,精度差一些,但作为起步足够。最后再分享一个小技巧:每次开机后先稳定几秒再去皮,等 HX711 的输出完全稳定下来,这样挂载物体时,零点漂移会小很多。这是我在批量测试后总结出的经验,能让整个系统看起来更专业、更可靠。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询