压力传感器 HX711 电子秤制作:高精度称重 DIY 实战

HX711 + 50kg 称重传感器 + Arduino Nano 电子秤 DIY 接线实物图

为什么选择 HX711?

市面上几十块的电子秤精度只能到 1g,但用 HX711+ 称重传感器,你可以轻松做到 0.1g 甚至 0.01g 精度。关键是成本极低:HX711 模块 8 块钱,50kg 称重传感器 25 块,Arduino Nano 克隆版 15 块,总成本不到 50 元。

这个项目适合:

  • 需要高精度称重的 DIY 项目(咖啡称、珠宝秤、配料秤)

  • 学习传感器信号放大和 ADC 原理

  • 制作智能仓储称重系统

  • 想理解应变片和惠斯通电桥工作原理

硬件清单

组件型号价格备注
HX711 模块HX711 24 位 ADC¥8必选,信号放大
称重传感器50kg 悬臂梁¥25根据量程选择
主控板Arduino Nano¥15或 ESP32
OLED 显示屏0.96 寸 I2C¥12显示重量
杜邦线公对母¥5连接用
面包板400 孔¥8测试用
合计-¥73批量可更低

购买建议:

  • 淘宝搜”HX711 模块”,选带稳压的版本

  • 传感器量程根据需求选:1kg/5kg/10kg/50kg

  • 小量程传感器(1-5kg)精度更高,适合小物件称重

HX711 工作原理

HX711 是专为高精度称重设计的 24 位 ADC 芯片。它内部集成了:

  • 低噪声可编程增益放大器(PGA),增益 32/64/128 倍可选

  • 24 位 Δ-Σ ADC,最高 80SPS 采样率

  • 稳压输出,可直接给传感器供电

为什么需要 24 位?

称重传感器输出的是毫伏级微弱信号(满载时约 2mV/V)。假设用 5V 供电,满载输出只有 10mV。如果用 Arduino 自带的 10 位 ADC(0-1023 对应 0-5V),10mV 只占 2 个刻度,根本没法用。

HX711 的 24 位 ADC 把 0-5V 分成 1677 万份,10mV 对应约 3.3 万个刻度,精度提升上万倍。

电路连接

HX711 模块引脚定义:

  • VCC: 5V 或 3.3V

  • GND: 接地

  • DT: 数据引脚(接 Arduino D2)

  • SCK: 时钟引脚(接 Arduino D3)

称重传感器通常有 4 根线:

  • 红线: E+(激励正)

  • 黑线: E-(激励负)

  • 白线: A+(信号正)

  • 绿线: A-(信号负)

接线步骤:

  1. $1

  2. $1

  3. $1

  4. $1

  5. $1

如果传感器线色不同,用万用表测电阻:

  • E+ 和 E- 之间电阻约 400Ω

  • A+ 和 A- 之间电阻约 400Ω

  • 任意其他组合电阻约 300Ω

代码实现

基础称重代码

#include \"HX711.h\"

// 引脚定义
#define DT_PIN 2
#define SCK_PIN 3

HX711 scale;

// 校准参数(需要实际标定)
float calibration_factor = 420.0;  // 每克对应的原始值
long zero_offset = 0;              // 零点偏移

void setup() {
  Serial.begin(9600);
  Serial.println(\"HX711 电子秤初始化...\");

  scale.begin(DT_PIN, SCK_PIN);
  scale.set_scale(calibration_factor);
  scale.tare();  // 自动归零

  Serial.println(\"初始化完成,开始称重...\");
}

void loop() {
  if (scale.is_ready()) {
    float weight = scale.get_units(10);  // 读取 10 次平均
    Serial.print(\"重量:\");
    Serial.print(weight, 2);
    Serial.println(\" g\");
  } else {
    Serial.println(\"HX711 未就绪,检查接线!\");
  }
  delay(500);
}

带 OLED 显示的完整代码

#include \"HX711.h\"
#include 
#include 
#include 

#define DT_PIN 2
#define SCK_PIN 3
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

HX711 scale;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

float calibration_factor = 420.0;
long zero_offset = 0;
float current_weight = 0;

void setup() {
  Serial.begin(9600);

  // OLED 初始化
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(\"OLED 初始化失败\");
    for (;;);
  }
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println(\"电子秤启动中...\");
  display.display();

  // HX711 初始化
  scale.begin(DT_PIN, SCK_PIN);
  scale.set_scale(calibration_factor);
  scale.tare();

  delay(1000);
  display.clearDisplay();
  display.display();
}

void loop() {
  if (scale.is_ready()) {
    current_weight = scale.get_units(10);

    display.clearDisplay();
    display.setCursor(0, 0);
    display.println(\"当前重量:\");
    display.setTextSize(2);
    display.setCursor(20, 25);
    display.print(current_weight, 1);
    display.print(\" g\");
    display.display();
  }

  delay(300);
}

校准步骤

校准是电子秤精度的关键。你需要一个已知重量的砝码(或已知重量的物品)。

校准流程:

  1. $1

  2. $1

  3. $1

  4. $1

  5. $1

  6. $1

校准代码:

void calibrate() {
  Serial.println(\"移除所有重物,准备归零...\");
  delay(3000);

  scale.tare();
  Serial.println(\"归零完成\");

  Serial.println(\"放上已知重量的砝码(如 100g)\");
  Serial.println(\"输入实际重量(克):\");

  while (Serial.available() == 0) {}
  float known_weight = Serial.parseFloat();

  long raw_value = scale.read_average(20);
  calibration_factor = raw_value / known_weight;

  Serial.print(\"校准系数:\");
  Serial.println(calibration_factor);
  Serial.println(\"将此值写入代码中的 calibration_factor\");
}

校准技巧:

  • 用多个不同重量校准,取平均值更准确

  • 校准后不要移动传感器位置

  • 温度变化会影响精度,重要应用需温度补偿

常见问题排查

问题 1:读数一直为 0

可能原因:

  • HX711 未供电(检查 VCC 是否有 5V)

  • DT/SCK 引脚接错

  • 传感器线序错误

解决方法:

// 添加诊断代码
void diagnose() {
  Serial.print(\"DT 引脚状态:\");
  Serial.println(digitalRead(DT_PIN));

  if (!scale.is_ready()) {
    Serial.println(\"HX711 未就绪!检查接线\");
  }
}

问题 2:读数跳动很大

可能原因:

  • 电源不稳定

  • 传感器未固定好

  • 环境振动

解决方法:

  • 给 HX711 单独供电,避免与电机共用电源

  • 增加读数平均次数:scale.get_units(20)

  • 添加软件滤波:

float filtered_weight = 0;
float alpha = 0.3;  // 滤波系数

void loop() {
  float raw = scale.get_units(5);
  filtered_weight = alpha * raw + (1 - alpha) * filtered_weight;
  Serial.println(filtered_weight, 2);
}

问题 3:精度不够

提升方法:

  1. $1

  2. $1

  3. $1

  4. $1

问题 4:漂移严重

原因: 传感器温漂或蠕变

解决方法:

  • 上电预热 5 分钟再使用

  • 定期自动归零(每 10 秒)

  • 选择质量更好的传感器(铝合金 vs 不锈钢)

进阶应用

去皮功能

void tare() {
  scale.tare();
  Serial.println(\"已去皮\");
}

// 添加按键触发去皮
#define TARE_BUTTON 4

void loop() {
  if (digitalRead(TARE_BUTTON) == LOW) {
    tare();
    delay(500);  // 防抖
  }
  // ... 其他代码
}

多量程自动切换

float get_weight_auto_range() {
  float weight = scale.get_units(10);

  if (weight 

File dataFile;

void setup() {
  SD.begin(4);
  dataFile = SD.open(\"weight_log.csv\", FILE_WRITE);
  dataFile.println(\"timestamp,weight\");
}

void loop() {
  float weight = scale.get_units(10);
  dataFile.print(millis());
  dataFile.print(\",\");
  dataFile.println(weight);
  dataFile.close();

  delay(1000);
}

成本优化建议

如果批量制作,成本可以进一步降低:

  1. $1

  2. $1

  3. $1

  4. $1

批量成本(10 套):

  • HX711: ¥6/片

  • 传感器:¥20/片

  • ESP8266: ¥12/片

  • 段码屏:¥3/片

  • PCB: ¥5/片

  • 单套成本:¥46

总结

HX711 电子秤项目是学习传感器信号处理的绝佳入门项目。通过这个项目,你可以:

  • 理解应变片和惠斯通电桥原理

  • 掌握微弱信号放大技巧

  • 学习 24 位 ADC 的使用方法

  • 实践传感器校准和滤波算法

最重要的是,成本不到 50 元就能做出精度 0.1g 的电子秤,性价比极高。

希望这篇博客文章对您有所帮助!