ESP32 + HX711 智能称重系统:从零搭建高精度电子秤 🧰⚖️

你有没有想过,一个几十块钱的模块组合,就能做出一台能连 Wi-Fi、自动上传数据、甚至带远程报警功能的智能电子秤?🤔

这不是实验室里的黑科技,而是每个 Maker 都能轻松实现的小项目。今天我们就来聊聊 ESP32 HX711 的“黄金搭档”是如何把一块应变片传感器变成智能终端的。别急着看代码,咱们先搞清楚——为什么是它俩?


想象一下这个场景:厨房里,你刚切好食材,电子秤默默把重量传到手机 App,顺手帮你记下今日摄入热量;养殖场中,饲料桶每少一公斤,系统就自动提醒补料;快递柜前,包裹一放上,费用立刻计算完成……这一切的背后,可能就是一个小小的 HX711 芯片和一颗 ESP32 在默默工作。

那么问题来了:
👉 为啥不用普通 ADC?
👉 为啥非得用 HX711?
👉 ESP32 真的比 Arduino 更适合做智能秤吗?

我们一个个拆开来看。


🔍 先说 HX711:专为“微弱信号”而生的放大器 + ADC

称重传感器(Load Cell)本质上是一个惠斯通电桥,输出的是毫伏级的差分电压信号——比如满量程 5kg 的传感器,在 5V 激励下,最大输出才 20mV 左右。这种信号有多脆弱?吹一口气都可能导致读数波动 😅。

普通单片机自带的 ADC 根本扛不住这么小的信号,信噪比太低,结果就是“跳数”、“漂移”、“归零不准”。这时候就需要一个“专业选手”出场了—— HX711

这颗芯片可不是普通的 ADC,它是为称重场景量身定制的:

  • 内置可编程增益放大器(PGA) :支持 128 倍增益(通道 A),能把 20mV 放大到接近 2.5V,完美匹配 ADC 输入范围。
  • Σ-Δ 高精度 ADC :24 位分辨率,理论分辨率达到 1/16,777,216,换算下来,哪怕只有 1kg 量程,也能识别到 0.06 毫克 级别的变化!当然实际受噪声限制,稳定读数一般在 0.1g~1g 之间。
  • 两线串行通信(SCK + DT) :不需要 SPI 硬件接口,软件模拟即可,节省资源。
  • 双通道输入 :A 通道用于高精度称重(128x 增益),B 通道可用于温度补偿或其他传感器(32x 增益)。

📌 小贴士:
虽然 HX711 模块便宜又方便,但它的性能极度依赖电源质量。建议使用独立 LDO(如 AMS1117-5V)供电,并在 VCC-GND 间加一个 10μF 电解电容 + 0.1μF 陶瓷电容去耦,否则纹波会直接污染你的测量结果!


📡 再看 ESP32:不只是 Wi-Fi,更是“全能大脑”

如果说 HX711 是耳朵,那 ESP32 就是大脑+喉咙+神经中枢。

相比传统的 Arduino Uno 或 STM32F1 系列,ESP32 的优势在哪?

特性 实际价值
双核 LX6 CPU @ 240MHz 可一边采样滤波,一边跑网络协议,互不干扰
内置 Wi-Fi / BLE 无需外接 ESP-01 模块,省成本、减干扰
支持 FreeRTOS 多任务调度更灵活,适合复杂逻辑
OTA 升级 设备部署后还能远程更新固件,维护超方便
丰富 GPIO 和外设 接 OLED、按键、蜂鸣器都不在话下

举个例子:你想做个宠物喂食器,要求每天定时称重并上传数据。如果用 Arduino + ESP-01,不仅要处理串口透传,还要担心掉线重连、功耗控制等问题;而用 ESP32,Wi-Fi 连接、MQTT 发布、本地显示、低功耗休眠……全都能在一个芯片上搞定。

而且!它还支持深度睡眠模式(Deep Sleep),电流可以压到 几微安级别 ,配合电池供电,续航几个月不是梦🔋。


⚙️ 硬件怎么接?简单到哭!

HX711 模块通常只有四个引脚:
- VCC → 接 5V 或 3.3V(推荐与传感器共电源)
- GND → 共地
- DT(DATA)→ 接 ESP32 的任意 GPIO(例如 IO19)
- SCK(CLK)→ 接另一个 GPIO(例如 IO18)

⚠️ 注意事项:
- 称重传感器四根线要接对:红(E+)、黑(E-)、绿(O+)、白(O-)
- 最好用屏蔽线连接传感器,避免电磁干扰
- HX711 模块尽量靠近传感器,减少长导线带来的噪声

电路图示意如下:

graph LR
    A[Load Cell] -->|mV信号| B(HX711模块)
    B --> C{DT → GPIO19}
    B --> D{SCK → GPIO18}
    C --> E[ESP32]
    D --> E
    E --> F[OLED显示]
    E --> G[Wi-Fi上传]

是不是超级简洁?整个核心部分连 PCB 都不用画,面包板一搭就能测 😎。


💻 代码怎么写?Arduino 生态真香!

得益于强大的开源社区,我们根本不用从头写驱动。直接用现成的 HX711 库就行,安装方法:库管理器搜索 “HX711 Arduino” 安装即可。

来看看关键代码片段👇

#include <HX711.h>

const int LOADCELL_DOUT_PIN = 19;
const int LOADCELL_CLK_PIN = 18;

HX711 scale;

void setup() {
  Serial.begin(115200);
  while (!Serial);

  scale.begin(LOADCELL_DOUT_PIN, LOADCELL_CLK_PIN);

  if (!scale.is_ready()) {
    Serial.println("    HX711 不在线,请检查接线!");
    while (1);
  }

  Serial.println("  HX711 初始化成功");
  scale.set_scale();        // 后续需校准
  scale.tare();             // 去皮清零
  Serial.println("请放置物体...");
}

void loop() {
  if (scale.is_ready()) {
    float weight = scale.get_units(10);  // 10次平均

    if (abs(weight) < 0.01) weight = 0;

    Serial.print("重量: ");
    Serial.print(weight, 3);
    Serial.println(" kg");

    delay(500);
  }
}

这段代码已经包含了基本功能:
- 初始化通信
- 判断设备是否在线
- 去皮归零
- 多次采样取平均,提升稳定性

但!这只是起点。真正的“工业级”体验还得加上这些技巧👇


🛠️ 高阶玩法:让电子秤不再“跳数”

1. 滑动平均滤波
float readings[10] = {0};
int index = 0;
float sum = 0;

float smoothWeight() {
  float newReading = scale.get_units();
  sum -= readings[index];
  sum += newReading;
  readings[index] = newReading;
  index = (index + 1) % 10;
  return sum / 10;
}

get_units(10) 更高效,且实时性强。

2. 动态去皮 & 温漂补偿

长时间运行后,零点可能会漂移。可以在空载状态下定期执行 tare() ,或者记录环境温度进行补偿(如果有 DS18B20)。

3. 非阻塞设计

别再用 delay(500) 了!改用 millis() 控制采集节奏,保证 Wi-Fi 和 UI 不卡顿:

unsigned long lastRead = 0;
if (millis() - lastRead > 300) {
  updateWeight();
  lastRead = millis();
}
4. 校准自动化

手动调 set_scale(22800) 太原始?试试自动校准程序:

Serial.println("请先清零...");
delay(3000);
scale.tare();

Serial.println("放上标准砝码(单位kg):");
while (!scale.is_ready());
delay(3000);

float measured = scale.get_value(10);
float knownWeight = 1.0;  // 例如1kg
float calibrationFactor = measured / knownWeight;

EEPROM.writeFloat(0, calibrationFactor);  // 保存到 Flash
EEPROM.commit();

下次上电直接读取,再也不用手动设置了!


🌐 数据要出去!Wi-Fi 怎么玩?

ESP32 最大的魅力就是联网能力。下面是个简单的 MQTT 示例:

#include <WiFi.h>
#include <PubSubClient.h>

const char* ssid = "your_wifi";
const char* password = "your_pass";
const char* mqtt_server = "broker.hivemq.com";

WiFiClient espClient;
PubSubClient client(espClient);

void connectToWiFi() {
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) delay(500);
  Serial.println("Wi-Fi connected");
}

void connectToMQTT() {
  client.setServer(mqtt_server, 1883);
  while (!client.connected()) {
    if (client.connect("ESP32_Scale")) {
      Serial.println("MQTT connected");
    } else {
      delay(5000);
    }
  }
}

void loop() {
  if (!client.connected()) connectToMQTT();
  client.loop();

  float weight = scale.get_units(5);

  StaticJsonDocument<64> doc;
  doc["weight"] = weight;
  doc["ts"] = millis();

  String payload;
  serializeJson(doc, payload);

  client.publish("scales/kitchen", payload.c_str());

  delay(2000);
}

发布之后,你可以用 Home Assistant、Node-RED 或自建 Web 页面实时查看数据📊,甚至设置微信推送:“检测到冰箱门开了,食物消耗异常!” 🤖


🧪 实战痛点 & 解决方案

问题 原因 解法
数值跳动严重 电源不稳、接地不良 加稳压源、共地、加去耦电容
归零失败 机械结构松动或未完全释放应力 等待几秒再 tare() ,增加判断条件
校准不准 标准砝码误差大或未水平放置 使用正规砝码,确保平台水平
Wi-Fi 断连 信号弱或路由器不稳定 添加重连机制,启用看门狗
功耗太高 一直全速运行 称重时唤醒,其余时间进 Deep Sleep

💡 经验之谈:
我曾经做过一个快递柜项目,一开始用了普通开关电源,结果每天早上上班高峰期,电网波动导致称重系统批量“失灵”。后来换成隔离 DC-DC + LDO 双级供电,问题彻底解决。所以啊, 电源设计决定了系统的上限


🚀 应用场景不止于“称东西”

别以为这只是个厨房秤。这套组合拳已经在很多领域悄悄发力:

  • 智慧农业 :监测猪舍饲料桶余量,自动触发补料通知
  • 健康管理 :老年人用药盒集成称重,提醒按时服药
  • 物流分拣 :包裹初筛称重,异常重量自动报警
  • DIY 健身器材 :拉力器+称重传感器=智能训练记录仪
  • 咖啡机改造 :精确控制粉量,复刻大师级萃取曲线

更有意思的是,ESP32 还支持 I2S 接口,未来可以接入语音模块,做成“你说‘多少克’,它就播报当前重量”的交互式设备🎤。


🌈 最后一点思考

ESP32 + HX711 的组合看似平凡,但它代表了一种趋势: 感知 + 计算 + 通信 的一体化嵌入式架构正在下沉到每一个角落。

它门槛低,却足够强大;
它成本低,却不失精度;
它简单,但潜力无穷。

无论你是学生做课程设计,还是工程师开发原型,甚至创业者验证产品概念,这套方案都是绝佳的起点🎯。

下次当你看到一个电子秤,不妨想想:
它的“芯”里,是不是也藏着一颗 HX711 和 ESP32?😏


技术的魅力,不在于多复杂,而在于—— 用最简单的组合,解决最真实的问题

更多推荐