尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

STM32智能计价电子秤设计全解析:从HX711称重到计价存储

发布时间:2026/9/27 1:51:52

资讯中心
01
ARTICLE

STM32智能计价电子秤设计全解析:从HX711称重到计价存储

STM32智能计价电子秤设计全解析:从HX711称重到计价存储
如果最近正在为单片机类毕业设计选题发愁我建议把智能计价电子秤列入备选名单。这个方向看着不起眼但做完之后你会发现STM32开发里最常用的几块能力——GPIO控制、外部中断、定时器、模拟信号采集、数据存储——它基本一个不落全用上了。而且它有一条完整的“感知-处理-交互”链路写论文、画框图、做答辩演示都很顺手。我当年就是把这套方案从原理图到软件一步步跑通的这篇文章就把完整设计过程整理出来供正在做相关项目的同学参考。1. 项目功能拆解电子秤为什么会成为经典毕设选题1.1 智能计价电子秤的功能需求清单设计之前先想清楚“要做什么”而不是先着急买传感器、买屏幕。很多同学拿到题就开始画板子后面越做越乱根子就在需求没理清。一个常规的智能计价电子秤核心功能至少要覆盖下面这几项称重量程与分辨率常规设计做到0~5000g分辨率1g精度对标III级衡器。能不能真正达到取决于传感器量程、AD精度和机械安装这几项后面展开说。单价输入与自动计价总价 重量 × 单价。单价通过按键逐位输入支持修改和重新设定。去皮功能放上容器后一键清零称净重时不需要手动做减法这是电子秤的刚需操作。限重报警超过预设上限或者接近传感器满量程时蜂鸣器报警提示。掉电保存校准系数、当前单价要存在非易失存储里重启之后不用重新标定。这个功能很多网上方案不做但答辩时特别能体现工程意识。1.2 主控芯片为什么选STM32F103C8T6有同学会纠结51单片机也能做电子秤为什么非要STM32说实话51也能硬做但有几个环节会在后期卡住你。第一个是24位数据的读取和运算。HX711一次读出24位有符号数51的8位寄存器和相对较弱的编译环境做起来很别扭数据扩展和算术运算都要花不少功夫直接拖慢开发节奏。第二个是浮点运算和单位换算。称重值转重量、重量乘单价这些运算在STM32上完全是富余的。第三个是掉电存储。STM32内置Flash可以直接当EEPROM用写一个简单的读取保存函数就行51外挂AT24C02也不是不行但方案又多了一层。STM32F103C8T6便宜好买主频72MHzFlash 64KB、RAM 20KB对电子秤来说是性能富余而且网上资料和参考代码极多遇到问题很容易找到答案。从项目完成度和答辩效果两个角度考虑它都是性价比很高的选择。1.3 称重方案选型对比称重部分常见做法有三类我直接给结论首选“应变式称重传感器 HX711模块”。方案成本精度调试难度备注电阻应变片 仪表放大器较高高高需自行搭建放大和滤波电路偏硬件设计方向称重传感器 HX711模块低高低模块整合了放大、AD转换和参考电压毕设推荐压电式 / 薄膜压力传感器低低低只能判断有无压力不适合精确称重单片机毕设的核心目标是在合理复杂度内打通整条链路HX711把前端放大、24位AD转换、参考电压全整合了还带稳压输出给传感器供电是最稳的选择。如果导师要求更偏硬件设计可以考虑独立仪表放大器方案但那篇论文的侧重点就完全不一样了。2. 硬件设计的核心链路从称重传感器到HX711信号采集2.1 悬臂梁式称重传感器的原理与电气特性多数电子秤使用的是应变式称重传感器外形是一个金属悬臂梁梁的上下表面贴有电阻应变片接成惠斯通电桥。梁受力弯曲时一侧应变片被拉伸、阻值变大另一侧被压缩、阻值变小电桥失去平衡输出一个与受力成正比的差分电压。市面常见的单点式称重传感器量程5kg或10kg输出灵敏度一般是2mV/V。意思是如果激励电压给5V满量程输出只有10mV。这个信号非常小直接用STM32内置ADC采基本采不出可信值——内置ADC参考电压3.3V12位分辨率理论上一个LSB大约对应0.8mV但要稳定分辨0.1mV级别的变化前端放大是躲不掉的。2.2 HX711的作用把毫伏信号变成干净的24位数字量HX711是专为高精度电子秤设计的24位Σ-Δ型ADC芯片内部集成了低噪声仪表放大器典型增益128倍差模输入范围约±20mV正好匹配应变式传感器的输出范围。它的优势不只是精度还有一个很容易被忽略的“比例式测量”机制HX711的参考电压直接取自外部基准而这个基准同时也会给传感器做激励电源。当电源电压波动时传感器输出和ADC参考电压同步变化变相抵消了电源纹波的影响。这个特性让HX711的抗干扰能力明显强于“独立基准 独立ADC”的方案。我实际用下来的另一个体会是HX711几乎不需要调零电路。上电读取原始值空载时记录一个偏移量软件减掉就行比老式电位器调零方案好维护太多。2.3 HX711与MCU的接口设计与数据格式HX711和MCU之间只有两根线SCK和DOUT。DOUT通知数据是否就绪SCK是读取时钟。具体时序是上电后DOUT从高电平变为低电平表示一次转换完成。此时MCU连续产生24个SCK脉冲每个脉冲的上升沿从DOUT移出一个数据位先移出的是最高位MSB。读完24位后再产生第25个脉冲DOUT恢复高电平并启动下一次转换。这段逻辑直接在驱动函数里体现int32_t HX711_Read(void) { uint32_t buf 0; while (HX711_DOUT_READ()); // 等待数据就绪DOUT拉低 for (uint8_t i 0; i 24; i) { HX711_SCK_HIGH(); delay_us(1); buf (buf 1) | (uint32_t)HX711_DOUT_READ(); HX711_SCK_LOW(); delay_us(1); } // 第25个脉冲恢复DOUT并开始下一次转换 HX711_SCK_HIGH(); delay_us(1); HX711_SCK_LOW(); delay_us(1); // 24位二进制补码转成有符号数避免负重量出错 if (buf 0x800000) return (int32_t)(buf | 0xFF000000); else return (int32_t)buf; }注意代码里有一个容易漏的点HX711输出的是24位二进制补码如果把原始数据直接当无符号数用空载或者去皮后出现负值时后面所有换算都会出错。所以一定要做符号扩展转成int32_t再参与运算。2.4 电源与信号完整性处理细节几个容易被忽略、但很影响系统稳定性的点电源选择整机用5V/2A直流适配器供电再用AMS1117-3.3给STM32供电。HX711模块多数是5V供电版本AVDD由模块内部稳压产生。不要拿同一路开关电源直接给模拟和数字部分一起供纹波一大人眼就能看到读数在跳。滤波电容HX711模块的VDD和AVDD引脚旁边放一个10uF钽电容加一个100nF陶瓷电容效果比单放大电容明显要好。退耦电容STM32每一个VDD引脚附近都要配0.1uF电容这个细节很多同学容易漏漏了之后偶尔会出现复位或程序跑飞非常难查。接线方式传感器到HX711模块的信号线用双绞线或屏蔽线模块和传感器尽量靠近放置。不要让几根长杜邦线在天上飞长线容易引入共模干扰。我踩过最狠的一个坑是HX711模块和电机驱动板放在同一个电源上电机一启动读数直接飞了。后来把模拟部分单独用LDO供电问题才解决。这个坑虽然基础但没遇到的人踩上去就是一顿折腾。3. 原理图与PCB布局里的几个关键取舍3.1 STM32最小系统晶振、复位、启动模式这是整个项目的地基原理图设计时这几个东西一个都不能少8MHz晶振配两个20pF负载电容晶振靠近MCU放置走线下方铺地减少干扰。复位电路用10k上拉电阻加104电容简单可靠。电子秤这种应用完全不需要加专用复位芯片。BOOT0上接一个10k下拉电阻到GND。这是最容易出的低级错误BOOT0悬空时程序偶尔能进下载模式但退出后不走Application区代码烧进去不运行。NRST引脚加100nF电容到地增强抗干扰。STM32F103C8T6内部Flash是64KB写自己的程序完全够用。20KB的RAM做电子秤绰绰有余不要去外扩SRAM纯属给自己增加工作量。3.2 显示、按键、蜂鸣器与存储电路显示方案我选LCD1602并口版需要6个IO口F103引脚够用代码也直观。如果想省GPIO可以用带IIC转接板的版本但注意IIC转接板上有个背光跳线默认状态要确认一下。按键电路用独立按键接上拉到3.3V按下接地检测低电平。每个按键并一个0.1uF电容做硬件消抖能省掉大量软件麻烦。蜂鸣器用有源蜂鸣器通过三极管或MOS管驱动不要直接接GPIO——GPIO驱动能力有限蜂鸣器工作电流通常25mA左右直接拉会拉垮电平。EEPROM这块直接用STM32内部Flash最后一个扇区模拟。注意写入前要擦除寿命大约1万次日常调价、存参数完全够用。这个方案省掉一颗AT24C02也省掉了对应的IIC驱动代码。3.3 PCB布局和传感器安装的实操经验如果项目要求自己画PCB布局上记住几条建议HX711放在传感器接线端子旁边模拟走线尽量短。数字地与模拟地在电源输入端单点连接不要铺一整块大铜皮直接通到四面八方。蜂鸣器、继电器这类发声元件远离HX711和传感器接线避免噪声耦合。用电烙铁焊完板子只是第一步传感器安装才是决定称重精度的关键环节。悬臂梁式传感器安装时梁的受力面要和地面平行固定螺丝的扭矩要控制好。我第一次装机没在意螺丝扭矩传感器一边高一边低空载原始值稳定在“三点几克”来回拧了很多次才找到问题。后来养成习惯安装完先看空载原始值是否稳定再逐级放砝码测线性最后才把螺钉锁死。4. 软件架构与核心代码驱动、校准、计价一次讲透4.1 分层结构硬件驱动与应用逻辑分开写很多人写毕设代码喜欢把所有逻辑堆在main.c里一个while循环几百行能跑但后期调试和答辩都受罪。我的习惯是分层写bsp层bsp_hx711.c、bsp_lcd1602.c、bsp_key.c、bsp_buzzer.c、bsp_flash.c。每个文件只管一个硬件外设。app层app_scale.c、app_price.c。负责称重滤波、去皮、计价状态机。main.c只做初始化然后跑一个简单调度循环。分层的好处是换硬件不用翻全部代码答辩被问“你的HX711驱动在哪里”也能直接指出来。项目复杂度不算高但这种组织方式是专业开发的基本习惯会在答辩环节给你加分。4.2 HX711驱动代码逐行拆解驱动代码核心函数前面已经给了。使用的时候还要注意采样频率HX711输出速率通常是10Hz或80Hz由模块引脚配置决定。电子秤建议选10Hz数据更稳。软件侧再加一个滑动平均滤波连续取10次原始读数去掉最大和最小后求平均能明显减轻振动干扰。不要小看这个平均滤波实际称重时手放上去又拿下来读数大幅波动不滤波根本没法看。如果想做更高级的数字低通滤波也行但对毕设来说滑动平均已经能把问题解决了。4.3 两点校准算法零点、斜率与去皮称重系统必须校准核心思想是“两点定标”零点空秤时读取N次平均记为zero。斜率放上标准砝码读取平均值为value对应已知重量weight计算系数scale (value - zero) / weight单位是AD值/g。之后任意时刻的重量就是 (current - zero) / scale单位是克。举个例子空载标定读取zero 820000放上1000g标准砝码读取value 1052000那么scale (1052000 - 820000) / 1000 232 AD/g。之后某次读取current 982000算出重量 (982000 - 820000) / 232 698.27g显示四舍五入到698g。校准系数和零点要写入内部Flash。写一个结构体打包写入前擦除扇区写入后加CRC校验读取时如果校验失败就触发重新校准。这个细节能避免“参数损坏后系统乱跳”的隐性bug答辩时讲出来也很加分。去皮逻辑更简单按下去皮键之后把当前重量记为tare后续显示重量 (current - zero) / scale - tare。逻辑只有一行但按键处理必须做成状态机防止一次按下触发多次事件。4.4 按键状态机与计价流程按键处理我推荐用简单状态机避免“明明按了一次结果执行了三次”的老问题检测到按键拉低先不动作延时10ms再确认一次。确认后进入按下态。释放时再延时10ms确认回到空闲态。这样就是一次完整的“按下-释放”事件。注意长按的情况如果要做长按连续加减单价就在按下态里加一个计时分支。计价主流程按这个顺序跑主循环读重量 → 判断是否超限 → LCD第一行显示重量和单价 → 第二行显示总价 → 如果超重蜂鸣器以1Hz频率报警。单价输入做成“逐位设置”模式按功能键选定位数再按加/减键修改类似老式计算器的操作逻辑界面简单直观。所有单价修改后同步写入Flash。5. 调试过程中踩过的坑与完整排查思路5.1 LCD1602不显示字符的排查LCD1602不显示是最常见的初始化问题排查顺序一定是先硬件后软件先拧对比度电位器。这个电位器调不对比度屏幕要么一坨方块要么全白很多人卡在这里浪费大量时间。确认供电电压。LCD1602多数是5V供电如果接到3.3V不是不能亮但对比度适配范围窄、显示很暗。初始化时序要足够慢。上电后要等40ms以上再发初始化指令每条指令之间留够延时。用现成库函数的人一般不会卡这一步如果自己用寄存器逐位操作很可能忽略忙检测。实在不显示就写一个“全屏写0xFF”的测试程序先确认硬件通路是通的再排查功能代码。我那次卡了快两个小时最后发现只是对比度电位器拧太低一度以为屏幕烧了。这种低级坑写出来后面的人能少走点弯路。5.2 HX711数据漂移和跳动HX711原始值轻微跳几个数非常正常但如果跳几十上百就要从下面几个方向排查电源纹波。用示波器量一下AVDD或者直接换稳压电源试验。串扰。蜂鸣器响的时候数值会不会跳如果会说明模拟部分隔离还没到位。软件滤波。滑动平均能明显改善抖动但如果硬件噪声源头没解决滤波只是治标。传感器固定螺丝是否松动。螺丝松了读数会没规律地漂这个一定要优先排除。判断系统是否合格有一个简单标准放同一个砝码反复读数10次波动小于1g算合格如果大于5g基本说明系统存在明显问题先回去查硬件。5.3 按键乱跳与下载失败按键乱跳大概率是软件没做消抖也可能是按键上拉太弱。PCB上加0.1uF电容是最省心的硬件方案软件再用状态机二次确认两层都做就不再犯。下载失败是新手遇到最多的问题常见原因排序驱动没装 → ST-Link接线不对 → BOOT0没接对 → 目标板供电不足 → 芯片锁死。芯片锁死通常是进入了低功耗模式或者把调试端口复用成普通GPIO。解药是先用串口ISP擦除整个Flash或者配合复位时序才能恢复。这里有个重要提醒STM32F103的PA13/PA14是SWD调试口不要随意复用成普通GPIO功能。调试阶段动了这两个引脚一旦代码跑起来调试器就再也连不上了非常麻烦。5.4 串口屏坐标映射升级时才会踩到的坑如果后续把LCD换成串口触摸屏会遇到一个“触摸坐标怎么对应到屏幕内容”的问题。屏幕按钮有像素坐标触控芯片上报的是触摸坐标两者往往不在一个坐标系里需要做线性映射用两个对角点做校准把触摸范围映射到屏幕分辨率范围。这个思路本质上和称重的两点校准是一回事——先定标再换算。答辩时如果能讲出“我在触摸屏上也用了同样的校准思想”会显得对整个系统有真正深入的理解。6. 系统测试、答辩展示与后续扩展方向6.1 系统测试方法与数据记录项目做得差不多了一定要把测试数据整理成表格。这是论文和答辩里含金量最高的部分也是最容易被忽略的部分。我的做法是静态称重测试用标准砝码按0、100g、500g、1000g、2000g、5000g逐级加载记录示值误差。重复性测试同一个砝码放5次记录最大值与最小值的差。偏载测试把砝码放在秤盘四个角和中心看示值一致性。偏差大的话多半是机械结构问题不是软件问题。线性度与回程误差线性度是加载点连成曲线后偏离理想直线的程度回程误差是加载到某重量和卸载回到该重量时的示值差。商用衡器标准里有明确指标毕设论文引用III级衡器要求做对照会很有说服力。测试数据举例如下标准砝码(g)示值(g)误差(g)0001001000500500010001001120001999-1500050022这个精度对毕设项目来说已经不错了。注意误差单位是g论文里可以换算成相对误差写成百分比。6.2 后续扩展方向这个项目的扩展空间比想象中大得多显示升级换成OLED或带字库的LCD12864界面可以做得很漂亮代码改动集中在驱动层应用层几乎不动。联网上报通过ESP8266或ESP32把称重数据上传到云端做成物联网电子秤项目直接升级一个档次。语音播报加一个SYN6288语音模块称重后直接播报重量和金额这个交互场景很有故事性。打印小票接一个58mm热敏打印机计价结束直接出小票已经逼近商用收银秤的形态了。蓝牙小程序用HC-05或低功耗蓝牙连微信小程序重量实时显示在手机端还能做历史记录。建议根据剩余时间决定扩展深度先保证核心功能百分百稳定再考虑锦上添花。导师评分重点永远是“你能不能把整个系统讲清楚”而不是“你堆了多少功能”。最后再分享一点个人体会智能计价电子秤这个项目最大的价值不在于做出了一台能称重的机器而在于它把“物理量采集→数字处理→人机交互”这条完整链路打通了一遍。做完之后再看其他单片机项目不管智能家居还是工业仪表骨架其实是相通的。遇到问题先区分是硬件问题还是软件问题再逐段缩小范围这套排查思路比任何一段代码都值钱。祝你顺利跑通。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。