STM32智能计价电子秤设计:HX711称重传感器与标定全解析

发布时间:2026/10/31 10:35:27
STM32智能计价电子秤设计:HX711称重传感器与标定全解析

最近刚把基于STM32的智能计价电子秤整个项目从头到尾跑通,从硬件选型、电路焊接,到固件编写、标定调试,前后折腾了小半个月。期间踩了不少坑,也把很多”看起来不难但实际做起来很玄学“的地方彻底搞明白了。这个项目正好适合想入门嵌入式、想拿STM32做点实物作品的开发者,也适合电子专业的学生当成课程设计或毕业设计的完整参考。

所谓智能计价电子秤,不光是能称重,还要能去皮、能按单价自动算金额、能存储标定参数重启不丢,甚至还可以扩展蓝牙、Wi-Fi 或云端数据上报。我这次用的是主流的 STM32F103C8T6 加 HX711 称重模块,配上电阻应变式压力传感器、OLED 屏和矩阵键盘。整套方案成本不高、资料充足、踩坑也能在网上找到大量案例,是最适合复现的选型组合。下面我会把整个项目的设计思路、硬件电路、软件框架以及调试验证过程完整拆解,尤其会重点讲讲传感器信号是怎么变成数字重量的,以及为什么标定不是写个系数那么简单。

1. 选型逻辑:为什么是 STM32 + HX711 + 电阻应变式传感器

很多人看到电子秤第一反应是”随便找个单片机加个压力传感器不就行了“。真做起来就会发现,称重这个场景对模拟前端的要求比想象中高得多:传感器输出信号非常微弱,噪声干扰大,普通 ADC 根本吃不住。所以选型是整个项目最关键的第一步。

1.1 称重传感器的选型:为什么电阻应变式是主流

市面上的电子秤传感器基本分成几类:电阻应变式、电容式、压电式、电磁力平衡式。家用和商用电子秤绝大多数用的是电阻应变式,因为它的线性度好、成本低、结构成熟,而且惠斯通电桥设计可以直接用差分方式抑制共模干扰。我选的是量程 5kg 的铝制悬臂梁传感器,四根线分别是红(E+)、黑(E-)、绿(S+)、白(S-)。这种传感器典型灵敏度在 1mV/V 到 2mV/V 之间,意思是每 1V 激励电压下,满量程时输出大约 1~2mV。如果供电电压是 5V,满量程输出也就 5~10mV,这个信号直接给 STM32 内置 ADC 用,分辨率完全不够看,必须经过高精度 ADC 放大。

选择量程也有讲究,电子秤一般让常用称重区间落在传感器量程的 20%~80% 之间,这样线性度和重复性最好。如果你经常称几克到几百克的物品,却选了一个 50kg 的传感器,小重量下信噪比会很差,数字跳动明显。我这台样机选 5kg,日常称菜、称快递足够用了。

1.2 模数转换核心:HX711 的优势在哪里

HX711 是专为电子秤设计的 24 位高精度 ADC 芯片,内部集成了仪表放大器、稳压电源和时钟电路,芯片自带两个差分输入通道,可以通过编程选择通道 A 或通道 B。通道 A 增益可选 128 或 64,通道 B 增益固定为 32。实际称重应用几乎都用通道 A、128 倍增益。

为什么必须用 HX711 而不是 STM32 自带的 12 位 ADC?简单算一笔账:STM32F103 的 ADC 在 12 位分辨率下,满量程 3.3V 时一个 LSB 大约是 0.8mV。而传感器满量程输出才 5mV,也就是说整个传感器的满量程信号只占 ADC 的 6 个 LSB 左右,这根本无法分辨几克的变化。HX711 的 24 位输出虽然实际有效精度约为 19~20 位,但经过 128 倍放大后,满量程信号可以覆盖很大的数字码范围,理论上可以分辨出 0.1g 级别的变化(取决于传感器噪声)。另外 HX711 内部有专门的低噪声稳压电路,可以直接在模块上给传感器桥路供电,抗干扰能力比直接用 STM32 的电源轨好很多。

1.3 MCU 平台选择与资源配置

STM32F103C8T6 在这个项目里可以说是”杀鸡用牛刀“,但这正是它的优点:资料多、库函数全、成本十来块,而且整个项目基本用不到复杂外设,只需要 GPIO、定时器、I2C/SPI(驱动屏幕)、串口(调试),以及内部 Flash(模拟 EEPROM)。我用的是标准外设库(Standard Peripheral Library),当然用 HAL 库也完全没问题。核心资源占用情况大概如下:

  • GPIO:HX711 占用两个引脚(DOUT 和 PD_SCK),OLED 用软件 I2C 两个引脚,按键矩阵用 7 个引脚,总计不超过 15 个普通 GPIO。
  • 定时器:使用一个定时器做按键扫描消抖,一个定时器做称重数据定时刷新(如 10Hz)。
  • Flash:内部 Flash 写入标定系数和零点偏移值,每次开机自动读取。
  • 串口:用于打印调试信息和扩展上位机通信。

这套资源配置下来,STM32F103C8T6 的 64KB Flash、20KB RAM 绰绰有余,后续想加个蓝牙、Wi-Fi 模块也不费力。

2. 硬件搭建:电路设计与连接细节

硬件部分看似简单,但很多人把线连上之后发现读数乱跳,十有八九是电源和接地没处理好。下面我把整套硬件方案按模块拆开讲清楚。

2.1 供电系统设计

称重系统最忌讳的就是电源纹波大。传感器桥路的激励电压不稳定,输出信号就会跟着漂。HX711 模块上通常带有一个稳压芯片(比如 HT7333 或类似 LDO),可以给传感器提供稳定的激励电压。我建议电源输入用 5V USB 供电或者两节 18650 电池串联(7.4V 转 5V),然后由 HX711 模块上的稳压电路给传感器和芯片供电。

如果直接用 STM32 的 3.3V 给 HX711 数字部分供电,注意 HX711 的数字电源(VDD)和模拟电源(AVDD)最好分开处理。很多模块已经做好了内部隔离,你只需要保证 STM32 与 HX711 的 IO 电平匹配。STM32F103 的引脚是 5V tolerant,但 HX711 的数字输出 DOUT 在 3.3V 供电时输出高电平约为 3.3V,接 STM32 引脚完全没问题。如果模块是 5V 供电的,DOUT 高电平可能接近 5V,这种情况下建议在 DOUT 上串一个 1k 电阻,或者用电阻分压到 3.3V,不然长期使用可能损伤 STM32 引脚。

2.2 HX711 与传感器接线

传感器桥路有四根线,接线定义要仔细看传感器说明书或颜色标注。常见的红色 E+、黑色 E-、绿色 S+、白色 S- 接 HX711 模块对应的 E+、E-、S+、S- 端子。如果接反了,读数会是负数,或者标定时出现斜率异常,这时可以交换 S+ 和 S- 看看。

连接 HX711 与 STM32 的只有两根线:

  • DOUT:数据输出,高电平有效,平时为高,当数据准备好时拉低,通知 MCU 可以读取。
  • PD_SCK:电源控制和串行时钟输入。这个引脚有双重功能:连续输出脉冲时读取数据,PD_SCK 拉高超过 60us 会让芯片进入掉电模式。

我在设计时把 PD_SCK 接到 PB0,DOUT 接到 PB1,按键矩阵接到 PA0~PA6,OLED 用 PB10、PB11 做软件 I2C。具体引脚分配如下表。

功能引脚说明
HX711 DOUTPB1数据输出,下降沿触发读取
HX711 PD_SCKPB0时钟控制
OLED SCLPB10软件 I2C 时钟
OLED SDAPB11软件 I2C 数据
矩阵按键行/列PA0~PA64x3 矩阵,支持 0-9、去皮、单价设置

2.3 显示与按键交互

显示部分我选了 0.96 寸 OLED(SSD1306,128x64),用软件 I2C 驱动,只接 4 根线(VCC、GND、SCL、SDA),省引脚而且显示效果好。显示内容主要分为两行:第一行显示当前重量、单价、金额,第二行显示状态和操作提示。为了夜间使用方便,可以加一个小背光 LED,但 OLED 自发光,不需要背光。

按键用 4x3 矩阵键盘,用来输入单价、去皮、校准、切换单位。矩阵键盘的好处是 7 个引脚就能实现 12 个按键,非常节省 IO。当然如果只是简单演示,用独立按键也行,但作为完整方案,矩阵键盘更符合计价秤的使用场景。矩阵键盘扫描要配合定时器消抖,否则容易误触,这部分在软件章节会细说。

2.4 PCB 与焊接注意事项

如果是自己搭洞洞板,注意尽量把传感器线、HX711 模块、电源线分开走,避免电源线和大电流线贴着信号线。传感器线建议用屏蔽线,屏蔽层单端接地。焊接 HX711 模块时,务必先焊电源和地,再焊信号线,避免静电损坏芯片。STM32 最小系统板(蓝板)可以直接插在面包板上,但面包板接触不良会引入接触电阻,导致读数不稳定。我最终是焊在洞洞板上的,效果明显比面包板稳定。另外,称重传感器本身是要固定在机械结构上的,螺丝不能拧太死,也不能有松动,否则会造成数据漂移。

3. 核心原理:从应变片到数字重量

很多新手按下 HX711 读取代码,能读回一个数字,但不理解这个数字代表什么。这一章我会把信号链路的物理原理和数学关系讲透,这对后续标定和调 bug 非常重要。

3.1 惠斯通电桥:秤为什么能称重

电阻应变式传感器的核心是贴在弹性体上的应变片。弹性体受力发生形变,应变片的电阻值随之变化,变化量非常微小。为了把这个微小变化转变成可测量的电压信号,四片应变片组成惠斯通电桥。

惠斯通电桥的原理可以类比成”天平的两端“:四个电阻构成一个菱形,两个对角接入激励电压,另两个对角输出差分电压。没有受力时,电桥平衡,输出电压为零;受力时,相邻桥臂电阻变化方向相反,导致输出端产生正比于应变的差分电压。这个差分电压比单应变片输出大一倍以上,同时还能自动抵消温度变化引起的等值电阻漂移。

从公式上看,当四个桥臂电阻均为 R,其中两个阻值变为 R+ΔR,另两个变为 R-ΔR 时,输出差分电压约为:

Vout = Vex * (ΔR / R)

假设激励电压 Vex=5V,应变片灵敏度系数为 2,满量程应变引起的 ΔR/R 约为 0.001,那么满量程输出就是 5mV,与传感器标称的 1mV/V 灵敏度吻合。

3.2 HX711 的模拟前端和 24 位 ADC

HX711 内部结构可以理解为一个高精度仪表放大器加一个 Delta-Sigma ADC。仪表放大器把传感器输出的差分电压放大 128 倍(通道 A 默认增益),放大后的信号由 24 位 Delta-Sigma ADC 转换成数字码。Delta-Sigma 架构的特点是采样率相对较低,但精度高、量化噪声小,特别适合低频称重信号。

HX711 的转换速率由外部时钟决定,常用速率有两种:10Hz 和 80Hz,通过 PD_SCK 引脚高电平时长或模块上的跳线/电阻配置选择。我的做法是默认 10Hz,因为称重不需要高速,10Hz 下噪声更低。有朋友为了提高响应速度改成 80Hz,结果跳字严重,需要更强的滤波。

3.3 重量与数字码的换算关系

24 位 ADC 输出的是二进制补码,范围大概在 -8388608 到 +8388607 之间。HX711 数据读取时序是:DOUT 为低时,MCU 给 PD_SCK 连续发 25 个下降沿脉冲,前 24 个脉冲依次输出最高位到最低位,第 25 个脉冲控制下一次转换的通道和增益(高电平时选择通道 A,增益 128)。所以代码里读取的原始值是一个有符号 32 位整数,高 8 位需要做符号扩展。

数字码与重量之间的关系不是简单的线性比例,因为整个信号链路的增益、传感器灵敏度、激励电压都会影响斜率。实际使用中必须通过标准砝码标定来获得每个工程项目自己的换算系数。这部分我放到后面单独讲。

4. 软件实现:STM32 固件开发全过程

软件部分我按模块推进:工程初始化、HX711 驱动、数据处理、人机交互、参数存储。下面直接给出核心代码和使用思路。

4.1 工程结构与基础初始化

我用的是 MDK-ARM + STM32F1 标准外设库。工程结构大概如下:

Project/ ├── User/ │ ├── main.c │ ├── system_stm32f10x.c │ └── stm32f10x_it.c ├── Hardware/ │ ├── hx711.c/h │ ├── oled.c/h │ ├── key_matrix.c/h │ └── eeprom_flash.c/h └── App/ ├── scale.c/h └── price_calc.c/h

main.c 里我做了四件事:系统时钟初始化、GPIO 初始化、OLED 初始化、外设初始化,然后进入 while 循环。称重数据用定时器中断标志驱动,保证刷新频率稳定,不阻塞在 HX711 等待上。

GPIO 初始化的关键代码片段:

GPIO_InitTypeDef GPIO_InitStructure; /* HX711 DOUT */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure); /* HX711 PD_SCK */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);

注意 DOUT 配置为浮空输入,PD_SCK 配置为推挽输出。HX711 的 DOUT 输出能力较弱,如果配置成上拉输入,可能会因为上拉电阻影响电平细节,最好是浮空输入。

4.2 HX711 驱动读写:时序是命门

HX711 的时序复杂度不高,但极易被细节坑到。正确读取数据的流程:

  1. 等待 DOUT 从高电平跳变为低电平,表示数据就绪。
  2. 循环 24 次:每次 PD_SCK 输出高电平再拉低,在低电平期间读取 DOUT 引脚电平,依次从最高位到最低位读入。
  3. 再输出第 25 个脉冲,让芯片回到通道 A、增益 128 模式。

核心代码(用标准库实现):

uint32_t HX711_Read(void) { uint32_t value = 0; uint8_t i = 0; while (HX711_DOUT_IS_HIGH()); // 等待数据就绪 for (i = 0; i < 24; i++) { HX711_SCK_HIGH(); value = value << 1; if (HX711_DOUT_IS_HIGH()) { value++; } HX711_SCK_LOW(); } for (i = 0; i < 1; i++) { // 第25个脉冲 HX711_SCK_HIGH(); HX711_SCK_LOW(); } return value; }

读回来的原始值是无符号 32 位,但是 HX711 数据是二进制补码,所以需要做符号扩展。建议封装成有符号类型:

int32_t HX711_ReadRaw(void) { uint32_t val = HX711_Read(); if (val & 0x800000) { return (int32_t)(val | 0xFF000000); } return (int32_t)val; }

有个常见坑:在读取循环中,如果 DOUT 一直是高电平,程序会卡死在等待中。这不是程序 bug,而是 HX711 没有正常唤醒或者接线有问题。调试时可以在 while 等待处加一个超时计数,超时后返回上一次有效值,避免整机卡死。

4.3 称重数据的滤波与稳定

HX711 的原始读数噪声跟供电质量、传感器机械震动都有关系。直接拿单次读数去显示,你会发现重量在 ±3g 甚至 ±10g 之间跳。解决思路是滤波。

我实际测试了几种方案:

滤波方式效果资源占用
算术平均滤波简单,但受瞬时粗大误差影响大低
中位值滤波能剔除异常毛刺,但反应慢中
滑动平均滤波平滑,响应快,适合连续称重低
中位值平均滤波先取中位值再去平均,兼顾两者中

电子秤应用推荐用“中位值平均滤波”,具体做法是连续采集 N 次(我取 11 次),去掉最大值和最小值,然后对剩下的 9 个值求平均。这样既抑制了震动尖峰,又不会因为偶然干扰导致显示跳变。采样频率是 10Hz,11 次大约 1.1 秒,对于静态称重完全够用。

滤波之后还要做数字平滑,也就是显示值不要突变。我用了一阶惯性滤波来平滑显示重量:

filtered = 0.7 * filtered + 0.3 * current;

这套组合下来,实测净重读数稳定度能控制在 ±1g 以内(5kg 量程下),效果很好。如果想进一步提升动态响应,可以在检测到重量变化大时减小滤波深度,但是一般没必要。

4.4 去皮、标定与计价逻辑

去皮是电子秤最基本的功能。去皮本质上就是记录当前空载时的滤后重量作为零点偏移值(tare_offset),然后把实际重量计算为:

weight = (raw_filtered - tare_offset) / calibration_factor

这里的 calibration_factor 是标定斜率,单位是”每克对应的原始码值“。计算重量后再乘以单价得到金额。

标定流程通常用两点标定法:

  1. 空秤状态下记录零点 raw_zero。
  2. 放上标准砝码,比如 1000g,记录稳定后的原始值 raw_span。
  3. 计算 calibration_factor = (raw_span - raw_zero) / 1000。

之后的实际重量就是:

weight_g = (current_raw - tare_offset) / calibration_factor

单价和金额我使用整数计算,金额保留两位小数,用整型变量存储分,避免浮点精度问题。比如单价 3.5 元/斤,重量 1.234 斤,金额 = 3.5 * 1.234 = 4.319 元,四舍五入显示 4.32 元。我用的计价逻辑是:

uint32_t total_cents = (uint32_t)((price_cents_per_500g * weight_g) / 500);

因为 1 斤 = 500 克,单价如果按“元/斤”输入,就统一换算成“分/500g”来算,全程用整数运算,稳定可靠。

4.5 存储标定参数:STM32 内部 Flash 模拟 EEPROM

标定参数必须断电保存,否则每次重启都要重新标定一次,那就没法用了。STM32F103 没有真正的 EEPROM,但内置 Flash 可以操作。我用了最后一个 1KB 扇区来存储参数,用双备份机制防止写入过程中断电导致损坏。

写 Flash 的流程是:解锁 → 擦除整个扇区 → 写入数据 → 加锁。注意 Flash 写入前必须擦除,而且擦除以扇区为单位。我定义了一个结构体:

typedef struct { uint16_t magic; int32_t calibration_factor; int32_t tare_offset; uint16_t checksum; } ScaleParams;

magic 固定为 0xA5A5,checksum 为前三个字段的累加和。每次开机读取,先验证 magic,再验证 checksum,通过才认为参数有效,否则提示重新标定。实测这个方案很稳,如果校验失败,我会把默认参数加载进去,同时显示“请校准”提示。

5. 调试与标定:让数据准确的关键步骤

软件跑起来之后,真正麻烦的是怎么让数据准确。很多人把代码抄下来发现读数乱跳,就开始怀疑硬件坏了。这一章分享一下我完整的调试和标定过程。

5.1 零点漂移处理:先让空秤稳定在 0g

上电后先不要急着称东西,让系统空载运行几分钟,观察 OLED 上显示的滤波后原始码值。你会发现即使什么都没放,原始码也会慢慢漂移,这主要是温度变化和应变片应力释放造成的。解决办法:

  • 每次开机做一次自动去皮,把当前空载值记为新的零位,这样开机就是 0g。
  • 零位值存到 Flash,但如果每次开机都更新零位,用久了零位会随老化漂移,所以我只把校准时的零位存起来,正常运行时可以手动去皮临时修正。

调试时我还发现,机械结构对零点稳定性影响很大。传感器悬臂梁如果有一侧被螺丝压得太紧,或者称盘安装偏斜,零点会一直缓慢变化。把称盘水平放置、固定螺丝对角均匀拧紧,零点漂移会明显改善。

5.2 两点标定法实操

标定代码我放在了按键菜单里,长按“校准”键进入标定模式。过程如下:

  1. 清空秤盘,等待显示稳定,按下“去皮”键记录零点 raw_zero。
  2. 放上标准砝码(我用的是 1000g 标准砝码),等待读数稳定,按下“确认”键记录 raw_span。
  3. 系统自动计算 calibration_factor 并保存。

有个容易被忽视的问题:标定砝码的质量一定要准确。我曾经用塑料瓶装水代替砝码,结果每次读数差好几克。有条件的话买一套铸铁砝码,或者用厨房电子秤倒推“500g 大米”装袋,但精度始终不如标准砝码。

标定完成之后,我再放 200g、500g、1500g、3000g 验证线性误差。如果发现中间量程误差偏大,比如两头准、中间偏,说明传感器本身线性度不好或者安装结构有应力,单纯调系数是救不回来的。需要检查传感器安装是否水平、称盘是否磕碰变形。

5.3 误差分析与补偿

称重系统的误差来源主要有三类:

  1. 非线性误差:传感器应变片的应变-电阻关系在小形变下近似线性,但在接近满量程时会出现偏移。解决方法是做多点标定,分段线性插值。对于普通计价秤,两点标定已经够用,追求精度可以增加 3~5 个标定点,存一张误差表。
  2. 温漂:温度变化导致应变片电阻变化。HX711 的增益和激励电压也有温漂。处理方式是软件做温度补偿,但需要额外的温度传感器,一般低成本项目不做。
  3. 蠕变:加载后传感器弹性体仍在缓慢形变,导致读数随时间缓慢上升。好的传感器蠕变参数小,便宜的传感器需要靠“采样后延时再显示”来缓解。

我在调试中最大的体会是,不要为了追求极致精度而过度优化软件。传感器的机械精度是上限,软件只能把读数稳定在这个上限附近。如果硬生生用软件把非线性误差“抹平”,遇到温度变化反而会变差。

6. 踩坑记录与优化技巧

最后分享几个我在实际项目里踩过的坑和优化方案,这些细节往往比主流程更能决定项目的成败。

6.1 震动和气流干扰:为什么数字一直在跳

第一次把设备放在桌上称重,屏幕数字总是隔几秒跳 1~2g,换了滤波算法也不见好。后来发现是桌子的微小振动和空调气流共同作用的结果。传感器对振动敏感,尤其是高灵敏度的 5kg 传感器,人体靠得太近都能引起读数波动。

解决思路分机械和软件两层。机械上,给传感器底部加硅胶减震垫,或者把秤体放在稳定的桌面上,避免放在风机口。软件上,在重量变化小于 ±2g 时,显示值保持不变,只有变化超过阈值才更新显示。我称之为“滞回显示”。这个阈值设置要小心,设大了会掩盖真实的小重量变化,设小了没效果,我用 2g 实测比较合理。

6.2 供电噪声导致的跳字:5V 和 3.3V 要分开看

有段时间我把 HX711 模块直接接在同一个 USB 供电的 5V 上,OLED 刷新时读数会突然跳动几十克。原因是 OLED 的电流瞬变较大,通过地线干扰了 HX711 模拟部分。解决方法是:

  • STM32、OLED 和 HX711 的数字电源共地,但传感器激励电源由 HX711 模块自己的稳压输出提供。
  • 在 HX711 模块电源输入端并联 100uF 电解电容和 100nF 陶瓷电容去耦。
  • 如果还有问题,把 OLED 的 I2C 速率降低,或者将 OLED 的供电单独用一个 LDO 供电。

电源噪声这个问题,用示波器能直接看到,没有示波器时可以通过增大滤波深度来缓解,但根本解法还是硬件去耦。

6.3 低功耗与电池供电:HX711 的掉电模式

如果要做成便携式电子秤,需要考虑低功耗。STM32 在待机模式下电流可以做到微安级,HX711 也可以通过 PD_SCK 引脚控制进入掉电模式:把 PD_SCK 置高并保持超过 60us,芯片进入掉电状态,电流只有约 0.1uA。唤醒时拉低 PD_SCK,等待大约 100ms 让内部电路稳定,再开始正常转换。

我设计的低功耗流程是:平时 STM32 进入 STOP 模式,按键唤醒后完成称重,显示约 10 秒后自动熄灭屏幕,再次进入 STOP。这套流程实测两节 18650 电池可以用非常久。不过要注意,每次唤醒后的第一次读数通常不准,要丢弃前几组数据,等滤波稳定再显示。

6.4 扩展空间:蓝牙、Wi-Fi 与云端上报

项目做稳定之后,可以考虑把单机电子秤升级成智能设备。STM32F103 没有蓝牙和 Wi-Fi,但可以通过串口外接模块实现。蓝牙用 HC-05 或 JDY-31,可以连接手机小程序,实时查看重量和金额。Wi-Fi 用 ESP-01 或 ESP8266,通过 AT 指令把称重数据 POST 到服务器或物联网平台,实现“扫码取袋自动计价”“远程监控库存”等应用。

我在扩展时遇到的最大坑是波特率匹配和缓冲区处理。ESP8266 模块默认波特率可能是 115200,而 STM32 串口一般先调试为 9600,需要先用串口助手把模块波特率改过来。还有就是 AT 指令返回是异步的,不能简单等待,要做一个状态机来解析 +IPD 数据。这些内容如果展开又是一大篇,有兴趣的话我后续可以单独写一篇关于 STM32 接 ESP8266 的实践。

这个智能计价电子秤项目做下来,最大的收获不是代码怎么写,而是理解了“信号链”这个概念。从传感器变形到电桥失衡,再到 HX711 放大采样,最后到 MCU 滤波标定,每一环都在影响最终数据。我会建议后面想复刻这个项目的朋友,不要急着买材料,先把传感器、HX711 和 STM32 之间的信号关系搞清楚,再做电路和代码,这样遇到问题时你才知道往哪个方向排查。如果有条件,尽量准备一个标准砝码和一块万用表,调试效率会高很多。