news 2026/9/27 3:50:54

基于STM32与HX711的智能计价电子秤设计与实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于STM32与HX711的智能计价电子秤设计与实现

做毕设想选一个既有硬件味道、又能讲清楚完整业务逻辑的题目,智能计价电子秤绝对算一个。它不像纯控制类项目那样只在板子上点灯,也不像纯上位机那样脱离物理世界,而是把传感器采集、信号放大、ADC转换、数据处理、人机交互、计价逻辑全部串在一起,一套流程下来,单片机核心知识基本都能覆盖。而且题目的应用场景明确,答辩时随便拿出一张收银小票、一次称重校准,都能讲出实际价值。

我调试这套基于STM32的智能计价电子秤时,最大的感受是:难点不在STM32本身,而在“称得准”这三个字上。很多同学用HX711模块,接上传感器,读个原始值就以为完事了,结果放上砝码数值漂移、换了量程非线性严重、按键按下单价却跳动,这些问题几乎每个人都会遇到。这篇文章我就把自己的完整设计、选型逻辑、软件实现和踩坑记录整理出来,希望能给做类似毕设的同学省掉几个通宵。

1. 项目整体设计与思路拆解

1.1 需求拆解:这个秤到底要完成什么任务

先把需求说透。智能计价电子秤不是普通的体重秤,它的核心业务是“称重+算钱”。用户把商品放上去,系统识别重量,操作者通过键盘输入单价,屏幕显示重量、单价、金额。听起来简单,但展开后至少有下面几个功能点:

  • 称重:通过电阻应变式压力传感器感知重量,量程常见5kg、10kg、30kg,精度要求通常到1g或者0.1g级别。
  • 计价:重量乘以单价得到总价,支持小数位处理,单价单位一般是元/斤,也有用元/kg的,这个要提前定好。
  • 去皮:放上包装盒或容器后,按去皮键把当前重量清零,只计算商品净重。
  • 累加:可能需要支持多次称重、累计金额,方便按批次结算。
  • 显示与键盘:清晰的重量、单价、金额显示界面,按键输入数字、小数点、确认、清除、去皮等。
  • 校准与精度保障:传感器有零点漂移和增益误差,必须提供校准流程,保证不同传感器、不同安装条件下都能准确称重。

这里有个容易忽略的点:成本敏感。毕设预算有限,不可能用工业级称重仪表,所以整套方案必须在常用模块的基础上完成。这也引出了选型的逻辑。

1.2 方案选型:为什么是STM32F103C8T6+HX711+电阻应变式传感器

主控选STM32F103C8T6,这是目前单片机课程和毕设中使用率极高的芯片。Cortex-M3内核,72MHz主频,资源恰好够用,而且网上资料铺天盖地,遇到任何问题都能搜到答案。更重要的是,它可以用标准库或者HAL库开发,两种方式都有大量例程,适合不同编程基础的同学。

称重传感器选电阻应变式,在电子秤领域几乎是唯一选择。它的工作原理是弹性体(铝合金或钢材)受力变形,贴在弹性体上的应变片电阻跟着变化,通过惠斯通电桥把微小的电阻变化转换成差分电压信号。这个差分信号非常微弱,满量程时大概只有几毫伏到十几毫伏,必须经过专用ADC放大后才能给单片机使用。

HX711就是专门干这个活的芯片。它内部集成了低噪声可编程增益放大器(PGA),可选增益64和128,还有24位高精度ADC,数据通过两线串行接口输出,和STM32连接只需要SCK和DOUT两根线。为什么选它而不是用STM32内置ADC直接采?原因很简单:内置ADC根本无法分辨几毫伏的差分信号,而且传感器是电桥输出,需要差分测量,内置ADC的输入范围、精度和噪声性能都不够。HX711模块很便宜,一片几块钱,还自带稳压电路,称重方案选它最成熟。

显示方面有两种选择:LCD1602和OLED。我做的时候选了LCD1602加IIC转接,因为1602能显示三行信息,但标准1602只有两行,需要合理安排显示布局。OLED更清晰,但需要SPI或IIC接口,价格稍高。如果考虑答辩展示效果,推荐用0.96寸OLED,显示信息更灵活,但要注意刷新率不能太低,否则按键时数字闪烁。

键盘用4x4矩阵键盘,因为需要输入数字、小数点、清零、去皮、确认,按键数量不够不行。矩阵键盘扫描占用引脚多,但MCU引脚够用,逻辑也不复杂。如果用独立键盘,至少要9个键,反而更费引脚。

供电方案要单独说。STM32最小系统板一般用USB 5V供电,HX711模块有两种供电方式:一种直接用5V给HX711数字部分和传感器供电,增益选128;另一种用3.3V供电,增益选64。传感器激励电压高一些,输出信号更大,但HX711的模拟电源AVDD如果直接用5V,内部稳压后基准会变,导致读数范围不同。很多同学发现换了供电方式以后读数全是负数或者满量程,就是因为公式没搞明白。这里先记住一条:模块标着E+、E-接传感器红黑线,A+、A-接信号线(绿白),模块VCC用5V时,HX711内部稳压后AVDD约为4.3V,增益选128时对应的满量程差分输入约为20mV,适合5kg传感器;用3.3V供电时增益选64,自己计算一下满量程范围,保证不超量程就行。

1.3 功能模块划分

整体框图如下(用文字描述,不画图了):压力传感器 -> 电桥差分信号 -> HX711放大+ADC -> STM32(GPIO模拟时序读取数据、换算重量、处理按键、控制显示) -> LCD显示;键盘 -> STM32的按键扫描GPIO;另外还可以加蜂鸣器做按键提示音,加LED状态灯。没有额外的复杂外设,整个系统的核心就在HX711的时序读取和称重算法上。

这样模块划分的好处是:每个部分可以单独调试。先写HX711驱动,用串口看原始值;再写按键扫描,用串口打印键值;最后把它们整合到一起。千万不要一开始就一股脑写完所有代码再下载,出了问题根本不知道是硬件还是软件。

2. 核心硬件设计细节

2.1 传感器与HX711接线要点

电阻应变式压力传感器一般引出四根线:红(E+)、黑(E-)、绿(A+)、白(A-)。还有一种是六线制的,多出两根屏蔽线,接外壳地。市面上常见的小量程传感器模块已经焊好,直接接HX711模块即可。

接线顺序一定要核对。HX711模块上的标识通常是E+、E-、A+、A-,分别接红、黑、绿、白。接反了会怎样?读数会变成负数,或者在零负载时读数乱跳。如果发现负数,先把A+和A-对调,不用换传感器。

供电方面,HX711模块的VCC和GND接STM32板子的5V和GND。需要注意的是,STM32F103C8T6的引脚耐受电压是5V,但它的GPIO输出高电平是3.3V。HX711的SCK需要输入高电平,3.3V完全能被识别,所以HX711的SCK可以直接接STM32的GPIO推挽输出。DOUT输出高电平也接近VCC,如果VCC是5V,DOUT高电平是5V,虽然大多数STM32引脚是5V容忍的,但为了稳妥,可以在DOUT引脚上串联1kΩ电阻限制电流,或者用两个电阻分压到3.3V。实际测试中直接连接也没问题,只要你不是在静电环境里乱摸板子。

HX711模块上的稳压芯片(一般是RT9193或类似)给传感器提供稳定的激励电压。有些模块上有一个跳线或焊盘可以切换AVDD电压,常见的是5V供电时,传感器激励为约4.3V(通过内部稳压),3.3V供电时激励约2.6V。激励电压低,传感器满量程输出更小,所以要根据量程和ADC增益调整。

2.2 量程与增益匹配计算

这个环节必须动手算一遍,不然你调秤时都不知道为什么数据溢出。

假设传感器量程5kg,灵敏度为1mV/V。也就是说,每1V激励电压,满量程时电桥输出1mV差分电压。如果激励电压是4.3V,满量程输出电压就是4.3mV。HX711增益选128时,可测的差分输入范围大约是±20mV(具体取决于AVDD,通常是AVDD/GAIN),4.3mV在范围内。如果传感器灵敏度是2mV/V,满量程输出就是8.6mV,还在范围内。

如果激励电压是5V,增益128,满量程差分输入就是4.3mV?等等,重新算。激励电压取AVDD=4.3V,灵敏度2mV/V时满量程输出8.6mV,小于±20mV,可用。如果灵敏度3mV/V,输出12.9mV,也还在范围内,但余量就小了。传感器量程30kg,灵敏度2mV/V,激励4.3V,满量程输出8.6mV,也可以。但你买到的传感器不一定标灵敏度,多数是1mV/V±10%。不确定时,就选增益64,增益64时满量程输入约±40mV,几乎没有超量程风险,但分辨率会降一档。

HX711的24位ADC,实际有效位数受到噪声影响,大约在17-19位之间。用5kg量程、增益128、激励4.3V、灵敏度1mV/V时,满量程对应ADC读数约满码的4.3/20 = 21.5%,也就是大约0.215 * 0x800000 ≈ 173万。5kg对应约450万计数?等等,HX711满量程码值不一定到0x800000,它输出的是有符号数,满量程对应约±0x800000。按比例,4.3mV/20mV = 0.215,所以满量程对应约0.215*8388608=180万里最大?不对,20mV对应8388608,4.3mV对应180万。180万码对应5kg,每克约360码,这个分辨率足够了。如果传感器精度是0.05%FS,5kg的误差约2.5g,所以1g显示精度本来就受传感器限制,算法再好也无法超越传感器物理误差。

我把这个计算过程写进论文里,答辩时老师会认为你真的理解了系统,而不是只会抄代码。

2.3 最小系统板与按键显示电路

STM32F103C8T6最小系统板自带晶振、复位、USB转串口,直接插上就能用。要注意BOOT0引脚不要悬空,通常板上已经有下拉电阻,不用特殊处理。使用3.3V供电时,HX711模块需要5V,那就得给板子USB供电,HX711的VCC接板子上的5V引脚。

LCD1602用IIC转接模块时,IIC地址默认0x27,有些是0x3F。接线:VCC、GND、SDA、SCL。如果LCD1602没有接转接板,用并行接线会占用至少6个GPIO,而且还要调对比度,麻烦。所以我强烈建议直接买带IIC转接的1602或者直接用OLED。OLED使用时,注意STM32的IIC引脚要配置为开漏输出,并外加上拉电阻,最小系统板上很多已经有上拉了,没有的话要接4.7k电阻。用软件IIC模拟也行,但HAL库的硬件IIC在F103上有时不太好用,我建议新学的人直接用GPIO模拟IIC,代码简单,稳定。

4x4矩阵键盘按行列扫描法:四行接GPIO输出低电平,四列接输入下拉,或者反过来。按键按下后,行列会导通,扫描到键值。这里有个细节:GPIO内部上拉/下拉要和行列方向匹配。我做的方案是行线配置为推挽输出,列线配置为上拉输入。扫描时行输出低,某列读到低,说明对应按键按下。如果行和列接反了,就会得到“斜对角”的键值,所以最好先写一个测试程序,每个按键亮度或串口打印键值,确认映射关系。

2.4 电源和布线注意

称重系统最怕电源干扰。HX711模块的模拟部分和数字部分共用VCC,如果你的USB供电纹波大,ADC读数就会抖动。解决办法:在HX711模块的VCC和GND之间并联一个100uF电解电容和0.1uF陶瓷电容,靠近模块放置。如果板子本身已经做了,可以不用重复加。传感器信号线不要和电机线、继电器线绑在一起,毕设一般没有强电设备,但蜂鸣器或继电器通断瞬间也可能导致读数跳变,最好给蜂鸣器加续流二极管,或用三极管隔离。

另外一个容易忽略的是接地。不要用杜邦线飞长线连接传感器,杜邦线的接触电阻和抖动都会让信号变差。建议把传感器和HX711之间的杜邦线尽量缩短,或者直接焊接。如果信号线长了,可以试试双绞线绕在一起,能减少外界电磁干扰。

3. 软件核心实现与关键算法

3.1 整体软件架构与状态机

软件部分我用的是一个主循环加状态判断的结构,不使用RTOS,因为逻辑并不复杂。初始化部分包括:系统时钟(默认72MHz)、GPIO、IIC/LCD、HX711、按键GPIO、串口(用于调试)。主循环里依次执行:

  • HX711读取原始数据(多次采样,取平均值)。
  • 重量换算(减去零点,乘以标定系数)。
  • 按键扫描(去抖,获取键值)。
  • 根据当前状态执行相应动作:正常称重、输入单价、去皮、累加。
  • 刷新显示。

状态机设计成四个状态:IDLE(待机)、SET_PRICE(输入单价)、WEIGHING(确认单价后称重计费)、ACCUMULATE(累加总价)。这样按键逻辑不会乱。比如在IDLE状态按数字键,进入SET_PRICE;在SET_PRICE状态按确认,回到WEIGHING;在WEIGHING状态按累加,把当前金额加进总金额,然后清零当前重量或者回IDLE。

这种状态机的好处是:后期加功能方便,比如加“找零”或“打印小票”时,只需要新增状态和转移条件。把状态机画进课程设计报告里,老师会给高分。

3.2 HX711读取时序与驱动代码

HX711的数据读取时序很简单:DOUT为低电平时表示转换完成,此时SCK发送25个正脉冲,前24个脉冲读取24位数据(先是最高位,最后是最低位),第25个脉冲会让HX711进入下一次转换。如果第25个脉冲不放,则保留当前数据,配合某些连续转换模式。

关键点:读取过程要一气呵成,中间不要被中断打断。因为如果在读取过程中插入大延时,可能读到错误数据。我在代码里使用了关中断的方式保护读取过程,但对于毕设来说,主循环里一般没有高频中断,所以不关中断问题不大。如果用了定时器中断做按键扫描,就有风险了,此时建议在读取HX711时临时关闭相关中断。

驱动代码(标准库风格)示例:

#include "hx711.h" #include "stm32f10x.h" #include "delay.h" #define HX711_SCK GPIO_Pin_0 #define HX711_DOUT GPIO_Pin_1 #define HX711_PORT GPIOB void HX711_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = HX711_SCK; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(HX711_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = HX711_DOUT; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(HX711_PORT, &GPIO_InitStructure); GPIO_WriteBit(HX711_PORT, HX711_SCK, Bit_RESET); } int32_t HX711_Read(void) { int32_t data = 0; uint8_t i; // 等待DOUT变低,表示转换完成 while (GPIO_ReadInputDataBit(HX711_PORT, HX711_DOUT) == Bit_SET); for (i = 0; i < 24; i++) { GPIO_WriteBit(HX711_PORT, HX711_SCK, Bit_SET); delay_us(1); data = data << 1; if (GPIO_ReadInputDataBit(HX711_PORT, HX711_DOUT) == Bit_SET) data++; GPIO_WriteBit(HX711_PORT, HX711_SCK, Bit_RESET); delay_us(1); } // 第25个脉冲,进入下一次转换 GPIO_WriteBit(HX711_PORT, HX711_SCK, Bit_SET); delay_us(1); GPIO_WriteBit(HX711_PORT, HX711_SCK, Bit_RESET); delay_us(1); return data; }

这里要注意,连续读取时,DOUT在下一次转换完成前会一直保持高电平。所以在读取函数开头的while循环,如果DOUT一直高,说明上一次转换还没完成,或者接线有问题。如果你发现程序卡死在while循环里,优先检查DOUT接线和传感器供电。

为了减少噪声,我写了一个多次采样取平均的函数:

int32_t HX711_Get_Average(uint8_t times) { int32_t sum = 0; uint8_t i; for (i = 0; i < times; i++) { sum += HX711_Read(); delay_ms(1); // 等待下一次转换完成,通常10ms左右 } return sum / times; }

这个平均值函数很有必要。单次读取的噪点可能导致重量显示跳动好几个克。取8~16次平均,噪声能压到接近传感器自身精度。但取平均也会降低更新频率,一般每秒刷新10次就够了,不用更快。

3.3 重量换算与标定原理

拿到原始ADC码值后,需要换算成克。公式很简单:

重量(克) = (当前原始值 - 零点原始值) / 标定系数

其中标定系数表示每克对应的原始码值。需要知道零点和标定系数这两个参数。

零点获取:空秤状态下读取平均值,存到全局变量。去皮键的作用就是把当前重量当作新的零点。

标定系数获取:放上一个已知重量的砝码,比如500g,读取原始值。标定系数 = (砝码原始值 - 零点原始值) / 砝码重量。单位是码/克。

这个换算必须在int32_t范围内进行。原始值是24位有符号数,范围约±800万。重量的实时值用float类型保存,显示时转成整数或带一位小数。

标定过程我做了三步:

  1. 空秤稳定后,按键读取零点,保存。
  2. 放上标准砝码(比如500g),读取稳定原始值,自动计算标定系数。
  3. 存储到Flash,掉电不丢失。

存储到Flash可以使用STM32内部Flash,也可以使用AT24C02 EEPROM,毕设用内部Flash最省事。内部Flash擦写次数有限,但对这种偶尔写一次的需求完全够用。要注意写入地址要避开程序代码区域,一般选在片内Flash靠后的扇区,比如0x0800FC00。

写一个简单的Flash读写函数:

#define CAL_ADDR 0x0800FC00 // 最后一个扇区 #define ZERO_VAL_ADDR 0x0800FC08

标定系数存成float,零点存成int32_t,在重新上电后读取。没有存过校准值时,可以用一个默认值比如100.0,但显示会不准,提示用户先校准。这个功能是加分项,很多同学做电子秤却没有掉电校准存储,答辩时容易被问住。

3.4 数字滤波:滑动平均与中位值平均

虽然已经在HX711层做了简单平均,但实际称重时,人放上重物的瞬间会有冲击和振动,导致读数剧烈变化。解决方法是增加数字滤波。我用的是“中位值平均滤波法”:连续采样N次,去掉最大值和最小值,然后计算平均。这样既能滤除脉冲干扰,又能平滑波动。N取5或7比较合适,太大了反应慢,称重时总重量稳定后再输出较好。

下面给出一个简洁实现:

#define FILTER_N 7 int32_t HX711_Filter(void) { int32_t buf[FILTER_N]; int32_t sum = 0; uint8_t i, j; for (i = 0; i < FILTER_N; i++) { buf[i] = HX711_Read(); delay_ms(2); } // 简单排序去最大最小 for (i = 0; i < FILTER_N - 1; i++) { for (j = i + 1; j < FILTER_N; j++) { if (buf[i] > buf[j]) { int32_t t = buf[i]; buf[i] = buf[j]; buf[j] = t; } } } for (i = 1; i < FILTER_N - 1; i++) { sum += buf[i]; } return sum / (FILTER_N - 2); }

这个代码里排序用的是最朴素的冒泡,数据量小,完全够用。实际感受是,滤波后读数稳定很多,放上物体后大概0.5秒内稳定下来,比不滤波时少跳动好几个克。

3.5 计价逻辑与显示界面

键盘输入单价需要做一个简单的简易输入缓冲。我用一个字符串数组存数字键,例如输入“1” -> “0.1”不太对,实际要处理小数点。常用办法是:输入整数单价(单位:角/斤),或者支持一位小数。

我实现的是:按数字键时,如果当前没有小数点,则将数字左移一位;按“#”键作为小数点按钮,之后输入的数字作为小数部分,最多两位;按“*”键作为确认/回车。这样逻辑简单。

计价公式:金额 = 重量(克) / 500 * 单价(元/斤)。因为买菜用户习惯用“斤”作为单位,500克一斤。如果按公斤,就除以1000。你需要根据场景确定,并在显示屏上标注单位。

显示界面设计成:

Weight: 1.250 kg Price: 5.50 /500g Amount: 6.88

如果是LCD1602两行,就交替显示重量+单价,金额用第二行。如果OLED则更灵活。

为了展示方便,我在HAL库版本的代码里用到了printf重定向到串口,方便调试。但显示部分不要过度使用格式化,1602写字符时要注意ASCII码表里没有中文,所以界面尽量用英文或者拼音,如“Weight”“Price”“Amount”。

3.6 按键去抖与扫描实现

4x4矩阵键盘扫描代码不复杂,但去抖不能省。我用的是定时器中断:每隔10ms扫描一次,连续两次读到相同键值才认为有效。这样做也顺带做了LED数码管的动态扫描(如果加的话)。

矩阵键盘扫描伪代码:

uint8_t Key_Scan(void) { static uint8_t key_old = 0; uint8_t key = 0; GPIO_ResetBits(KEYPORT, ROWS); for (row = 0; row < 4; row++) { // 依次将各行输出低,其他行输出高 ... for (col = 0; col < 4; col++) { if (GPIO_ReadInputDataBit(KEYPORT, cols_pin[col]) == RESET) { key = row*4 + col + 1; } } } if (key != key_old) { key_old = key; if (key != 0) return key; } return 0; }

具体实现时,可以把行线和列线定义成数组,用循环控制,减少代码量。矩阵键盘有个麻烦事:两个键同时按下时可能会产生“鬼影”,即读到第三四行交叉处的键值。应对方法:如果检测到多个列同时为低,就放弃本次扫描,只记录第一次检测到的那一列。对于称重操作的简单输入场景,同时按两个键的概率不大,所以不用做完整防鬼影,但至少要有去抖。

4. 调试与常见问题排查实录

4.1 数据乱跳、漂移严重,怎么解决

这是我被问得最多的问题。现象:空秤时HX711读数以几十甚至几百的幅度波动,换算成重量就是好几克。

先检查供电。用USB供电时,如果电脑USB口供电不稳定,会导致HX711的参考电压波动。可用万用表测HX711的VCC是否稳定在5V,晃动一下线看读数是否变化。杜邦线松动的情况非常常见,尤其是传感器四根线,接触不良会让信号彻底乱跳。建议把所有信号连接排针处插紧,或者直接焊接。

其次检查传感器是否受到外力,秤盘安装是否牢固。如果秤盘压到传感器边缘或摩擦到外壳,会造成非线性波动。

软件方面,增加采样平均次数,比如32次平均。如果还跳,再用中位值平均滤波。另外检查HX711_Read函数中每个SCK脉冲之间的延时是否足够,有些模块因为PCB布局问题,时钟脉冲太快会导致采样不稳定,在每次SCK变化后加1~2微秒延时。

还有个坑:如果主循环里读取HX711的同时,定时器中断里也调用了HX711_Read,会导致DOUT时序混乱。保证HX711读取只在主循环执行,或者加一个互斥标志。

4.2 读数负数或者溢出

负数问题,基本是A+和A-接反了,或者传感器受力方向反了。传感器安装时,有标记的一面朝上,或者按照箭头方向施压。另外空秤时如果秤盘较重(比如几百克),传感器输出可能饱和或者非线性,需要确保零点余量足够,即空秤原始值不要超过正满量程的10%。

溢出问题常见于传感器灵敏度太高、激励电压太高、增益太大,导致满量程超过ADC输入范围。解决方法:把增益从128改为64,或者降低传感器激励电压。HX711模块的AVDD通常由VCC决定,如果你用5V,又选了128,并且满量程输出超过20mV,ADC就会饱和。计算一下你的传感器灵敏度,如果满量程输出接近20mV,改用64增益。

4.3 重量显示一直为0或者不变

如果读数固定不变,先跳过滤波,直接读原始值。如果原始值恒为8388608/2之类,那可能是DOUT没正确读到信号,或者DOUT一直悬空。检查HX711模块的供电、传感器电桥是否通(万用表测传感器红黑线之间的电阻,通常几百欧)。如果读数恒定但变换代码后数值变化,可能是你换算公式写错了,比如系数是0导致重量为0。

4.4 按键不灵敏或乱触发

矩阵按键的问题多半是行列接反,导致按压某键时检测到错误的行列组合。写个扫描测试,把所有键都按一遍,在串口打印行列值,建立映射表。按键抖动也会导致一次按多个数字,所以在按键去抖后,需要等待按键释放后才再接收下一次。最简单的做法:检测到有效键值后,处理完该键,然后循环等待所有按键弹起,再继续扫描。

4.5 校准后换量程不准

很多同学做了一版5kg的,想改成30kg,只改硬件不重写校准系数。不同传感器在相同增益下的标定系数差别很大,换传感器后必须重新校准。甚至同一个传感器在不同温度下,标定系数都会略有变化(温漂)。所以校准存储功能很重要,每次上电读校准值,如果测量偏差大于0.5%,重新校准。

5. 项目扩展与经验总结

5.1 可以继续加的功能

智能电子秤这个题目从毕设角度来说,下限很低、上限很高。基础版就是称重+计价,想要高分可以做这些扩展:

  • 加多个预设单价:以按键快捷方式调取常用商品单价,减少每次打的麻烦。
  • 加语音播报:用SYN6288或DFPlayer模块报出重量和金额,方便视障人士使用。
  • 加蓝牙/WiFi模块:将称重数据上传到手机App或云平台,实现远程监控或小票打印。
  • 加掉电记忆:存储累计销售金额、出货记录等,断电不丢失。
  • 加自动校准:放上标准砝码后按键一下,进入校准模式,自动修正系数。
  • 加大尺寸LCD或触摸屏:用ST7789屏幕做图形界面,更高级。
  • 加低功耗模式:用STM32的待机模式和HX711断电控制,适合便携场景。

扩展功能不要堆太多,选择两三个和论文方向相关的做深。比如你是做物联网方向的,就选蓝牙+App;做嵌入式系统方向的,就选RTOS+图形界面。

5.2 我的调试验证记录

我这版做的是5kg量程、1mV/V传感器、HX711增益128、5V供电。校准前,空秤原始值约180000左右,放500g砝码后读数约140000,标定系数约-80?不,因为A+接反导致负数等情况,实际你调试时正负取决于接线方向。我最终取得的标定系数大约是每克340码,也就是说500g对应170000码。经过中位值平均滤波后,重复性误差在±2g内,线性度在0.3%FS左右。这个精度作为毕设完全够用。

测试时发现一个有意思的现象:用手压传感器边缘和中心,读数不一样,这是偏心负载导致的机械误差,不是电路问题。解决方法是秤盘尽量小一点、硬一点,四个支撑脚受力均匀,或者用多个传感器做平均。毕设不用太纠结,知道原理就行。

5.3 常用资料备查

调这种项目,以下资料能救命:STM32F103C8T6数据手册(引脚图)、HX711数据手册(时序和增益)、LCD1602数据手册(IIC转接板地址)、4x4矩阵键盘常见原理图。网络搜索时用“HX711 STM32 例程”、“HX711 读不到数据”等关键词,网上有大量现成代码。但不要直接抄,抄来的代码往往不匹配你的接线,调试时更痛苦。我推荐的做法:先写一个最简单的GPIO测试,确保点亮屏幕;再写HX711读原始值,用串口观察;最后才加滤波、按键和计价。

我最后再分享一个小技巧:调试称重时,一定要把所有调试信息通过串口打印出来,包括原始值、平均值、零点、系数、重量、状态。不要在出现问题时才加打印,一开始就建立好调试机制。我习惯用串口输出一行带时间戳的数据,这样能看清波动规律。某次读数周期性跳动,就是因为串口助手和USB供电共地不良,导致地线干扰,后来给USB隔离或者换了个供电线就好了。

这个项目做完,你的收获其实不只是“做了一个秤”。你会熟悉传感器信号链路、ADC精度概念、数字滤波方法、状态机设计,并且能独立排查硬件故障,这些能力比毕业设计本身更值钱。只要把基础打好,2027年答辩时你完全可以从容展示,老师问到你精度怎么保证、温漂怎么解决,你都能接得住。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/27 3:43:13

《怎样解题》四步法:从理解题目到回顾的通用问题解决框架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 3:42:55

第二周学习周报

第二周学习周报&#xff08;2026.9.21 - 2026.9.26&#xff09; 本周主线&#xff1a;Docker 安装与环境配置 → Linux 文件系统基础 → SQL 注入实战&#xff08;sqli-labs Less-1~3&#xff09; 目录 一、Docker 安装与环境配置 1. 安装位置选择2. 安装命令3. 镜像加速器配置…

作者头像 李华
网站建设 2026/9/27 3:40:36

两小时精通Excel宏与VBA:从录制到实战,告别重复劳动

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 3:40:25

站点卡住了,怎么破?—— SEO 流量瓶颈的 8 种卡法与破局思路

做 SEO 的人早晚会撞上这堵墙&#xff1a;前几个月流量涨得顺&#xff0c;某天开始就趴着不动了&#xff0c;曲线平得像用尺子画的。翻后台也看不出大毛病&#xff0c;但数字就是不动。这个阶段难受就难受在&#xff0c;问题不摆在明面上。刚开始那阵&#xff0c;任务是"有…

作者头像 李华