
1. 项目概述与核心价值想自己动手做一个高精度的电子秤吗无论是用于厨房的精准配料还是工作室里的小物件称重甚至是作为学习嵌入式传感器原理的绝佳项目用Arduino、HX711模块和一块称重传感器来搭建都是一个既有趣又极具学习价值的实践。我折腾过不少传感器项目但像电子秤这样能把物理世界的“重量”这个直观概念通过电信号和数据清晰地呈现出来每次完成校准看到准确读数时那种成就感还是很特别的。这个项目的核心在于理解并应用一套经典的“物理量-电信号-数字信号”转换链。核心部件称重传感器内部是精密的应变片电桥。当你把东西放上去传感器的金属梁会发生微小的形变导致贴在它上面的应变片电阻值发生变化从而输出一个极其微弱的差分电压信号通常是毫伏级别。这个信号太微弱了Arduino的模拟输入口根本无法直接读取而且夹杂着噪声。这时HX711芯片就登场了。它是一款专为称重传感器设计的24位模数转换器ADC内部集成了可编程增益放大器能把这个微弱信号放大上万倍并转换成高精度的数字值。最后Arduino作为大脑读取这个数字值经过我们编写的校准算法处理转换成实际的重量比如克并驱动OLED显示屏显示出来。而本教程的特色在于使用了Visuino这款图形化编程工具。对于初学者或者想快速验证原型的朋友来说它极大地降低了门槛让你可以像搭积木一样连接组件逻辑无需深入复杂的代码细节就能完成核心功能。当然我也会在过程中解释背后的原理和代码逻辑让你知其然更知其所以然。无论你是嵌入式新手想入门还是经验丰富的开发者想快速实现一个称重功能原型这个从硬件连接到软件配置、校准、显示的完整流程都能给你提供一个清晰、可靠的参考方案。2. 硬件选型、电路设计与原理解析2.1 核心元器件深度解析在动手连接线之前我们必须先吃透手里这几个核心元器件的“脾气”这样才能在后续校准和调试中游刃有余。称重传感器Load Cell我们常用的是电阻应变式称重传感器规格例如5kg。它的核心是一个惠斯通电桥由四个应变片电阻组成R1, R2, R3, R4。当没有负载时电桥处于平衡状态输出端通常标记为E和E-之间的电压差为零。当传感器受力发生形变时一对应变片被拉伸电阻增大另一对被压缩电阻减小从而打破电桥平衡在E和E-之间产生一个与所受压力成正比的微小差分电压信号。常见的接线有四线制和六线制我们用的模块化方案通常对应四线制红(E)、黑(E-)、白(A-)、绿(A)。其中E和E-是给电桥供电的激励电压正负端A和A-则是信号输出正负端。注意传感器的量程选择很重要。如果你主要称几克到几百克的东西选个1kg或2kg的传感器会比5kg的获得更高的相对精度。长期超量程比如在5kg传感器上称6kg会永久损坏传感器。HX711模块这是项目的“心脏”。它不仅仅是一个ADC更是一个完整的信号调理前端。可编程增益放大器PGAHX711内置的PGA提供128倍或64倍的增益可选。我们通常使用128倍来放大称重传感器那毫伏级的信号。增益越高对小信号的灵敏度越高但也更容易引入噪声。24位Σ-Δ型ADC这是高精度的关键。24位分辨率意味着它可以产生 2^24 16,777,216 个不同的输出代码。即使满量程输入电压是±40mV经过128倍放大后变为±5.12V其理论最小可分辨电压变化也极低从而实现了高分辨率测量。通信接口采用简单的同步串行接口只需要两个数字引脚与MCU通信DT数据和SCK时钟。HX711会持续进行转换当数据准备好后DT引脚会拉低。MCU通过SCK引脚发出脉冲来读取数据。Arduino开发板任何具有数字IO口的Arduino板都可以如Uno、Nano、Mega等。它负责向HX711提供时钟信号、读取数据、执行校准计算、并将结果发送到OLED显示。其5V输出也为整个系统供电。OLED显示屏I2C接口选择I2C接口的0.96寸或1.3寸OLED屏主要是为了节省引脚仅需SDA和SCL两根线并且显示效果清晰。它将负责实时显示重量读数。2.2 电路连接详解与避坑指南根据提供的材料我们进行如下连接。务必在断电情况下操作第一步连接称重传感器与HX711模块这是最容易出错的一步线序必须严格对应。称重传感器红色线- HX711模块E引脚称重传感器黑色线- HX711模块E-引脚称重传感器白色线- HX711模块A-引脚称重传感器绿色线- HX711模块A引脚实操心得不同厂家传感器的线色可能不同最可靠的方法是查阅传感器 datasheet 或使用万用表测量。通常激励正负E/E-之间的电阻与信号正负A/A-之间的电阻是相等的例如350Ω。而任意一个激励端与任意一个信号端之间的电阻大约是激励或信号内部电阻的一半例如175Ω。用这个方法可以准确判断四根线的身份。第二步连接HX711模块与ArduinoHX711模块GND(黑) - ArduinoGNDHX711模块VCC(红) - Arduino5VHX711模块DT(绿) - Arduino数字引脚 D3HX711模块SCK(黄) - Arduino数字引脚 D2第三步连接OLED显示屏与ArduinoOLEDVCC- Arduino5VOLEDGND- ArduinoGNDOLEDSCL- ArduinoSCL(在Uno/Nano上对应A5引脚)OLEDSDA- ArduinoSDA(在Uno/Nano上对应A4引脚)重要提示确保所有电源连接5V和GND牢固。接触不良是导致读数跳动、不准甚至模块不工作的首要原因。建议使用面包板或焊接好的扩展板来确保连接可靠性。3. 使用Visuino进行图形化编程与配置Visuino将代码逻辑可视化我们通过拖拽和设置属性来完成编程。这非常适合快速原型开发。3.1 环境设置与组件添加启动与板卡选择打开Visuino软件。在组件面板中找到“Arduino”比如Arduino Uno或Nano将其拖到设计区域。然后点击这个Arduino组件上的“工具”图标小扳手在弹出的对话框中选择你实际使用的板卡型号例如“Arduino Nano”。这一步确保了后续代码编译和上传的正确性。添加HX711称重组件在组件面板的“Sensors”库中找到“Scale”分类选择“Weight Scale HX711”组件将其拖放到设计区域。这个组件已经封装了与HX711芯片通信、读取原始数据的全部逻辑。添加OLED显示组件在“Displays”库的“OLED”分类下找到“OLED I2C”组件拖放到设计区域。它将负责数据的可视化输出。3.2 组件属性设置与界面设计配置OLED显示内容双击设计区域中的“DisplayOLED1”组件会打开元素编辑器。从左侧“Elements”工具箱中拖拽一个“Draw Text”元素到画布左侧。在右侧“Properties”属性窗口中找到“Text”属性输入标题例如“Weight (g)”。然后调整“Size”属性为2设置一个合适的字体大小。再次从“Elements”工具箱中拖拽一个“Text Field”元素到画布。这个元素用于动态显示重量数值。在属性窗口中将其“Size”设置为3比标题大并将“Y”属性设置为30或更大的值使其显示在标题下方避免重叠。关闭元素编辑器窗口。理解HX711组件关键属性校准前暂不修改Offset偏移量用于“去皮”或调零。默认是0。我们后续校准的第一步就是确定这个值。Scale Divider比例因子这是将原始ADC读数转换为实际重量的核心系数。默认是1。校准的第二步就是确定这个值。Gain增益通常设置为128对应HX711的通道A。除非使用特殊的传感器连接方式否则保持默认。3.3 逻辑连接与通信配置现在我们将各个组件“连接”起来建立数据流。连接HX711与Arduino引脚点击“WeightScale1”组件将其“Sensor Data”引脚连接到Arduino组件上的数字引脚“Digital 3”。将其“Sensor Clock”引脚连接到Arduino的“Digital 2”。这对应了我们硬件连接中的DT-D3, SCK-D2。连接HX711数据到OLED将“WeightScale1”组件的“Out”引脚连接到“DisplayOLED1”组件下刚才添加的“Text Field1”元素的“In”引脚。这样重量数据就会自动发送到显示屏的指定文本区域进行显示。连接OLED的I2C总线将“DisplayOLED1”组件的“I2C”输出引脚连接到Arduino组件的“I2C”输入引脚。这建立了显示屏的通信通道。临时连接串口用于校准为了在校准过程中从串口监视器查看原始读数我们需要临时添加一个数据通道。将“WeightScale1”组件的“Out”引脚再连接一条线到Arduino组件的“Serial”输入引脚通常是“Serial In”。请注意校准完成后需要断开此连接。4. 校准流程从原始数据到精准重量校准是电子秤项目的灵魂直接决定了测量的准确性。其核心是建立两个参数Offset零点偏移和Scale Divider比例因子。原理公式可以简化为实际重量 (原始读数 Offset) / Scale Divider。4.1 第一步生成代码并获取空载原始值在Visuino底部点击“Build”标签页。选择正确的Arduino开发板对应的串口端口。点击“Compile/Build and Upload”按钮将程序上传到Arduino。上传完成后在Visuino中点击顶部菜单栏的“Tools” - “Serial Terminal”或直接打开串口终端标签页。在串口终端中选择相同的端口点击“Connect”。确保传感器空载没有任何东西放在上面并且放置平稳。此时串口终端会开始滚动输出一长串数字。这个数字就是HX711读取到的原始ADC值。记录下这个数值例如104216。这个值就是当前空载状态下的系统读数它包含了传感器本身的偏差、HX711的偏移以及电路噪声。4.2 第二步计算并设置Offset调零我们的目标是让空载时的显示值为0。根据公式当实际重量0时应有0 (原始读数 Offset) / Scale Divider。由于Scale Divider尚未确定我们先进行一个简化操作让(原始读数 Offset) 0。因此Offset -原始读数。在Visuino设计区域点击选中“WeightScale1”组件。在右侧属性窗口中找到“Offset”属性。输入你记录的空载原始值的负数。例如如果记录值是104216则输入-104216。重要修改属性后必须重新编译上传项目。再次点击“Compile/Build and Upload”。4.3 第三步获取负载原始值并计算Scale Divider现在进行比例校准。你需要一个已知精确重量的砝码。对于小量程秤一个1克的砝码或已知重量的硬币、标准重量片是理想选择。如果没有可以用一个相对准确的家用电子秤称出一个物体的重量例如100克用它作为临时标准。将已知重量的物体假设为1克轻轻、稳定地放置在称重传感器的中心位置。再次观察串口终端记录下此时输出的新原始值例如105956。计算Scale Divider此时系统满足公式1 (新原始读数 Offset) / Scale Divider。我们已经设置了Offset -104216。计算(新原始读数 Offset) 105956 (-104216) 1740。这个1740就是1克重量对应的“净”ADC读数。因此Scale Divider 净ADC读数 / 实际重量 1740 / 1 1740。在“WeightScale1”组件的属性窗口中找到“Scale Divider”属性输入计算得到的值1740。再次重新编译上传项目。4.4 第四步验证与微调上传后观察OLED显示屏。现在空载时应显示接近0的值可能有个位数的跳动这是正常的噪声放上1克砝码后应显示接近1.00的值。实操心得与高级技巧多点校准提升线性度如果追求更高精度可以进行两点校准。即除了空载(0g)和1g点再测量一个满量程附近点如4.5g。然后用这两个点0, ADC0和W1, ADC1通过公式Scale (ADC1 - ADC0) / W1来计算比例因子通常比单点计算更准确。处理读数跳动原始ADC读数会有微小波动。在软件端无论是Visuino后续处理还是自己写代码可以通过“滑动平均滤波”来稳定显示值。即维护一个最近N次读数的队列始终显示其平均值。Visuino中可以通过添加“Average”组件来实现。校准砝码的选择尽量使用质量准确的砝码。临时替代品的误差会直接带入你的系统。电子天平校准用的标准砝码是最好的选择。断开校准连接校准完成后记得在Visuino中断开从“WeightScale1”的“Out”引脚连接到Arduino “Serial”引脚的那条线。然后重新编译上传这样串口就不会被占用程序更简洁。5. 项目优化、问题排查与扩展思路5.1 常见问题与解决方案速查表在实际搭建过程中你可能会遇到以下问题。这里提供一个快速排查指南问题现象可能原因排查步骤与解决方案OLED屏幕不亮/无显示1. 电源接反或接触不良。2. I2C地址不匹配。3. 屏幕本身损坏。1. 检查VCC和GND连接确认5V供电。2. 多数OLED默认地址是0x3C少数是0x3D。在Visuino中双击OLED组件检查“Address”属性。3. 用Arduino示例库中的“SSD1306”示例代码单独测试屏幕。串口读数始终为0或固定值1. HX711与Arduino通信失败。2. 传感器或HX711模块损坏。3. 供电不足。1. 确认DT和SCK引脚连接正确D3, D2。尝试交换这两个引脚测试。2. 测量传感器激励端(E/E-)电压应有~5V。若无检查模块供电。3. 使用外部电源如手机充电器给整个系统供电排除USB口供电能力不足问题。读数跳动非常剧烈1. 机械结构不稳定。2. 电源噪声大。3. 传感器受力点不均。1. 确保传感器固定牢固称重平台稳定无晃动。2. 在Arduino的5V和GND之间并联一个100uF的电解电容滤除电源噪声。3. 确保重物放在传感器承重点的中心位置。有负载时读数反而减小或为负传感器信号线接反A和A-对调。交换连接HX711模块A和A-的两根线通常是白线和绿线。校准后读数仍不准或线性度差1. 校准砝码不准。2. 传感器量程过大小重量信号弱。3. Offset和Scale设置后未重新上传程序。1. 使用更精确的砝码重新校准。2. 换用更小量程的传感器如1kg测量小重量。3.切记在Visuino中修改任何组件属性后都必须重新“Compile/Build and Upload”Visuino编译/上传错误1. 板卡型号选择错误。2. 串口被占用。3. 缺少库文件。1. 检查Tools菜单中板卡和端口选择是否正确。2. 关闭其他可能占用串口的软件如串口监视器、其他IDE。3. 确保Visuino已安装必要的库通常HX711和OLED库已内置。5.2 从Visuino到代码理解底层逻辑虽然Visuino简化了开发但了解其生成的代码有助于深度优化和调试。Visuino生成的代码结构清晰主要包含初始化设置引脚模式初始化HX711和OLED库。主循环不断读取HX711的原始值应用公式weight (raw_value offset) / scale_divider进行计算然后将结果格式化并发送到OLED显示。如果你未来想用Arduino IDE直接编程核心的HX711读数函数类似于以下伪代码long readHX711() { while (digitalRead(DT_PIN) HIGH); // 等待数据就绪 long data 0; for (int i 0; i 24; i) { // 读取24位数据 digitalWrite(SCK_PIN, HIGH); delayMicroseconds(1); data data 1; // 左移一位 digitalWrite(SCK_PIN, LOW); delayMicroseconds(1); if (digitalRead(DT_PIN) HIGH) data; } // 发送第25个脉冲设置下一次读取的增益 digitalWrite(SCK_PIN, HIGH); delayMicroseconds(1); digitalWrite(SCK_PIN, LOW); return (data ^ 0x800000); // 转换补码 }理解这段代码你就能明白Visuino背后在做什么也能自己实现更高级的滤波算法如中值滤波、卡尔曼滤波来进一步提升稳定性。5.3 项目扩展与进阶玩法一个基础的电子秤完成了但它的潜力远不止于此添加去皮功能在电路中增加一个按钮。编程实现当按下按钮时记录当前重量值作为新的“零点偏移”后续显示值都减去这个偏移。这在称量容器内物品时非常实用。单位切换与累计重量增加第二个按钮用于在“克”、“千克”、“盎司”等单位间切换。还可以编程实现累计模式多次放置物品后自动计算总重。数据记录与上传增加一个SD卡模块将每次称重的重量和时间戳记录到文件中。或者添加一个Wi-Fi模块如ESP8266将数据上传到云端服务器或手机App实现远程监控和记录。制作成便携设备使用Arduino Pro Mini或ESP32等更小的主板配合锂电池和充电模块将所有元件集成到一个3D打印的外壳中制作一个真正便携的电子秤。应用于其他场景称重传感器的原理可以用于测量力、压力。你可以用它制作一个简单的握力计、仓库库存报警系统当重量低于阈值时报警甚至是一个宠物喂食器的重量监测模块。这个项目从硬件连接到软件校准完整地走通了一个物理信号采集、处理、显示的全过程。无论你是停留在Visuino的快速实现还是深入代码进行定制化开发其中涉及的传感器原理、ADC应用、校准方法和问题排查思路都是嵌入式开发中非常宝贵的实践经验。