手头这套基于STM32的智能计价电子秤是我带学生做毕设时反复打磨过的一个完整方案。单片机领域毕业设计称重计价这个题目看起来简单但真要做出能用、测准、还算稳定的成品涉及传感器选型、信号采集、滤波标定、人机交互一整套链路坑不少。这篇就把整套设计和实现完整拆开讲一遍给正在做STM32项目的同学或者入门嵌入式的朋友一条能直接参考的路径。这个项目最核心的价值在于它把模拟信号处理、数字滤波、标定算法、外设驱动和交互逻辑全串在了一起。做完这一套你对STM32的理解基本就立住了不是那种跑个流水灯、点个屏幕就完事的虚活。下面我从方案选型讲起一直讲到代码实现和调试验收全程不藏私把我踩过的坑都摆出来。1. 整体设计与选型思路拆解1.1 为什么用STM32做计价秤而不是51单片机计价电子秤的技术难度不在计算而在重量采集的稳定性和准确性。51单片机当然也能做但做出来的东西精度和抗干扰能力差一截。STM32F103C8T6这个片子在同类项目里用得最多原因很直接72MHz主频、20K字节RAM、64K字节Flash跑滤波算法和浮点换算完全没压力加上硬件I2C、SPI、USART、定时器一应俱全后面想扩展蓝牙或者WiFi模块也有富余资源。最关键的是它的库函数和例程资料在网络上极其丰富毕设遇到疑难杂症基本都能搜到解决方案。同样是通过热词搜索可以看到很多同学纠结“51单片机和STM32怎么选”。我的建议是如果题目只要求“电子秤”51确实够用但题目带“智能”两个字就意味着要有交互、要有稳定算法、可能要存储单价数据甚至语音播报或物联网上传这时STM32的性价比就完胜了。不要为了省学习成本选太弱的平台毕设答辩时专家一问“为什么用这个方案”你能扔出一套充分的理由比什么都强。1.2 称重传感器与ADC方案选型电阻应变式加HX711称重传感器这个环节最容易翻车。市面上几百块的电子的秤核心器件就两种流派一种是电阻应变式传感器利用金属箔应变片贴在弹性体上受力后电阻值变化再通过惠斯通电桥把差分电压输出另一种是电磁力平衡式精度极高但成本贵实验室能用不适合做毕设。毕设选题基本都走电阻应变式常见的量程5kg、10kg配一个悬臂梁式传感器几十块钱搞定。传感器输出的差分信号非常微弱满量程时也就几毫伏到十几毫伏STM32内置的12位ADC根本分辨不了这么小的信号必须要外挂一个高精度ADC前端。HX711就是专门干这个的24位Σ-Δ型ADC内置增益可编程放大器128倍/64倍/32倍直接对接桥式传感器输出的是串行数据占用两个GPIO就能读数据。这颗芯片用得太多了驱动代码成熟价格便宜完全满足计重场景。选它不选ADS1232或者国产其他芯片理由就是稳定、例程多、不容易翻车。1.3 系统架构和功能需求分解先把整个系统的功能边界划清楚。一套完整的智能计价电子秤至少要具备以下几个能力称重实时读取重量去皮后显示净重计价预设单价重量乘以单价算出总价可以自由修改单价交互按键输入单价、去皮、累计、清零显示重量、单价、总价同屏显示校准用户模式下能用标准砝码重新标定修正零点漂移和增益误差超限保护超量程时报警防止传感器过载损坏系统架构就是典型的前端采集加主控处理加人机交互三层结构。前端是传感器加HX711主控是STM32交互是LCD显示屏加矩阵键盘。这套架构逻辑清晰分层明确答辩时画框图也好看。这里说句实在话毕设评审老师最看重的不是你功能炫不炫而是你能不能把自己的系统逻辑讲圆能不能解释清楚每个模块为什么存在。2. 硬件设计与电路实现细节2.1 最小系统板的选择核心板还是自己画PCB做毕设的同学通常会面临一个选择直接用市售的最小系统核心板还是自己画一块完整的PCB。我的建议是分情况。如果时间紧张、预算有限买一块STM32F103C8T6核心板那种带USB转串口、带晶振和复位电路的蓝色板子再单独买一个HX711模块、一块LCD1602模块用杜邦线连起来就能跑通全部功能。这种做法最稳妥电赛和毕设大量学生都走这条路。但如果你想把“设计与实现”的含金量抬高就值得自己画PCB。我自己做第二版时画了一块完整的主板STM32最小系统、HX711电路、电源稳压、显示接口、按键全部集成板子大概10cm×8cm。自己画的好处是系统稳定性好杜邦线连接的板子在称重时经常因为接触不良导致读数跳变这在后面标定时非常痛苦。坏处是时间成本高第一次打板容易出低级错误比如晶振负载电容焊错、复位电路方向反了。核心板加模块的搞法硬件联调周期可以控制在三天以内自己画PCB从画原理图到打板回来调通乐观估计也要两周。这是成本与深度的取舍我建议毕设想拿高分还是自己画但前提是你得先把模块化方案的逻辑跑通再迁移到自己板上。2.2 STM32最小系统几个关键设计要点先看电源。STM32F103C8T6工作电压是2.0V到3.6V常用3.3V。HX711供电电压2.6V到5.5V传感器激励电压直接来自HX711的AVDD。如果你的系统用USB供电5V先通过1117-3.3稳压到3.3V给MCU同时5V直接给HX711的数字电源。这里有个特别容易忽视的点模拟电源和数字电源要分开退耦HX711的AVDD和VSUP之间必须加RC滤波很多做出来读数跳得像跳舞的板子根源就是电源纹波没滤干净。再看晶振。STM32F103C8T6可以用内部8MHz RC振荡器跑但USB外设和ADC精度对时钟精度有要求毕设还是老老实实焊一颗8MHz无源晶振加两个20pF负载电容。如果你同时想用RTC或者精确计时还要加一颗32.768kHz的晶振。这里有个热词里反复被搜到的问题“STM32时钟树到底怎么配”说白了就是搞清楚SYSCLK、AHB、APB1、APB2之间的分频关系。F103默认上电是内部HSI 8MHz如果外部晶振没焊接配置时选了HSE就会卡死在等待就绪那一步。这个坑后面排查章节会细讲。再看芯片的启动配置。BOOT0和BOOT1引脚必须正确处理。正常从Flash启动BOOT0接地即可。很多同学买的核心板已经把BOOT0通过跳帽接好了自己画板时要记得预留。2.3 HX711接口电路接法HX711跟MCU之间只需要两根线PD_SCK和DOUT。PD_SCK是移位时钟输入DOUT是数据输出。数据格式是24位二进制补码按从最高位到最低位的顺序输出。接线时注意传感器到HX711的连线尽量短最好用屏蔽线双绞线也行避免工频干扰。HX711模块上如果留有跳线可以选择通道A还是通道B通道A接传感器增益默认128倍这也是我们必须用到的模式。传感器本身是四线制红E激励正、黑E-激励负、白S信号正、绿S-信号负。接线时千万别搞错不然读数要么是乱码要么是反向。我见过好几个同学满量程标定时数据一路狂飙最后发现是白绿两根线接反了。HX711模块的输入端通常标了A、A-、B、B-白色接A绿色接A-这个顺序跟模块说明走就行。供电方面HX711的模拟电源AVDD用5V供电时传感器激励电压就是5V输出灵敏度会高一点。如果整个系统只有3.3V用3.3V供电也能工作只是满量程输出会低一些对应ADC读数范围变小精度略有下降。有条件尽量给HX711供给5VMCU用3.3V两边是独立的I/O电平上面HX711的输出高电平接近供电电压对3.3V的MCU来说略超一点但一般不会出事稳妥起见可以串一个100欧电阻。2.4 显示与按键模块的选择计价秤显示无外乎三种方案数码管、LCD1602、OLED。数码管显示重量没问题但要同时显示单价和总价就得用四位数码管拼多个走线和驱动复杂一点。LCD1602是毕设最常见的方案两行十六字符第一行显示重量和单价第二行显示总价信息完整度好价格便宜背光一打开效果也不差。OLED屏幕显示素质更高但0.96寸的屏幕显示面积小适合做小巧桌面秤不适合做常规台式计价秤而且OLED用I2C或SPI接口写中文字库要折腾取模。按键我用的是独立按键加矩阵键盘混合方案。功能键少去皮、清零、累计、校准就做四个独立按键接在GPIO上通过软件消抖识别数字键多0到9、小数点就排成4×4矩阵键盘扫描方式典型。矩阵键盘的好处是10个GPIO就能搞定16个按键缺点是要处理组合按键和误触代码量多一点。如果赶进度也可以直接买一块现成的4×4矩阵键盘模块回来把引脚一接就行。3. 软件架构与核心算法实现3.1 工程模板选择标准库还是HAL库这届学生做STM32项目最先纠结的就是用标准外设库还是HAL库。我的观点很明确毕设项目直接用标准库例程最多、资料最全、出问题最容易查。HAL库封装层次高代码写起来优雅但Debug时一层套一层对刚接触嵌入式的人来说反而容易蒙圈。标准库到HAL库的差异本质上就是底层寄存器的封装粒度不同用标准库写上手的逻辑更直白读代码的人也能更快理解。很多同学搜“STM32库函数和标准库有什么区别”其实就是想知道该学哪一套。我的建议是先用标准库把GPIO、定时器、串口这些玩明白以后工作要用HAL库再迁移也不难底层思路是相通的。工程模板建议用Keil MDK买一块STM32F103C8T6最小系统板用ST-Link V2下载器几十块钱一套烧录调试非常方便。记得在Options for Target的Debug选项里选ST-Link DebuggerUtilities也对应选好不然点下载按钮没反应。关于下载还有一个高频坑就是“STM32禁用JTAG”。当你把PB3、PB4这些引脚复用为普通IO时JTAG功能还占着它们导致程序烧录后跑飞或者引脚不工作。解决方法是先调用GPIO_InitTypeDef把复用时钟打开再用GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE)关闭JTAG只留SWD。这样做之后ST-Link的SWDIO和SWCLK两个引脚仍然能下载只是不能再走JTAG模式。这个知识点在热词里被反复搜索说明踩的人很多你提前知道就能少折腾半天。3.2 称重数据的滤波算法与标定流程HX711的原始读数直接拿过来用会非常离谱因为传感器的机械振动、电源纹波、电磁干扰都会在数据里叠加噪声。原始值在稳态时可能跳动几百个LSB直接换算称重量小数点后面就没法看。解决办法是滤波我用的是滑动平均和中值滤波的组合先做一次中值滤波去掉毛刺再做20到50次滑动平均平滑噪声。滑动平均的窗口长度要权衡。窗口太长响应变慢东西放上去要等一两秒才稳定用户体验差窗口太短噪声压不下去。我自己测下来50Hz采样率下取30次平均既能把峰峰值抖动压到±1克以内响应速度也够。这个参数不是死的你换一个传感器、换一套供电可能都要重新调。标定是整个项目里最关键的算法环节。HX711输出的ADC值跟重量之间是线性关系Weight (RawValue - ZeroValue) × Scale。ZeroValue是空秤时的读数Scale是单位重量对应的ADC增量。标定就是做两件事一是确定零点二是确定斜率。标准做法是空秤采样100次取平均作为ZeroValue然后放一个已知重量的标准砝码比如1kg采样后算出Scale (RawValue_cal - ZeroValue) / 1000。有了这两个参数任意重量就能反算出来。为了减少误差我建议用两点以上的多点标定。比如取0g、500g、1000g、2000g四个点用最小二乘法拟合一条直线yaxb把斜率和截距存进Flash。多点拟合的好处是能补偿传感器本身的非线性误差。虽然电阻应变式传感器线性度标称很好但实际用下来在量程两端误差会大一点多点标定能把整段精度都拉到±0.1%以内。3.3 计价功能与数据管理模式计价逻辑本身不复杂无非是总价等于净重乘以单价。但有几个细节必须处理到位。第一是去皮逻辑空容器放上去按去皮键记录当前重量为皮重显示净重必须为零总价也清零后续称重都减去这个皮重。第二是单价设定单价单位是元/千克用户通过键盘输入需要做数值范围校验和显示的实时刷新。第三是累计功能每次称完按累计键把本次总价加到累计金额里这个功能在菜市场连买多种商品时非常实用。数据管理方面单价、零点、斜率、累计金额这些参数在断电后都得保存。STM32F103C8T6没有自带EEPROM但有64K Flash可以用内部Flash模拟EEPROM。实现方法不复杂定义好存储结构体写之前先擦除对应扇区写完后再读回校验。Flash擦写寿命是一万次左右计价秤这种设备使用频率不高完全够用。注意写Flash时要关中断防止写入过程中被打断导致数据损坏这个细节在工程上很重要标准文档里不会强调。为了避免频繁擦写Flash我的策略是修改参数后延迟5秒再写入。也就是说用户调完单价或者标定完成后系统里的值先缓存在RAM中干活过了5秒确认稳定才落盘。这样就算用户反复修改也不会把Flash寿命消耗掉。3.4 基于状态机的按键交互逻辑按键处理最怕的就是连按、长按、抖动叠加在一起最后逻辑乱成一锅粥。我建议整个交互层用状态机建模按键事件驱动状态切换。系统状态至少包含正常运行态、单价输入态、标定态、累计显示态。每个状态下按键对应的功能不同这就是典型的状态机设计思维。比如在正常运行态下“设置”键进入单价输入态数字键输入单价“确认”键返回运行态“去皮”键只在运行态有效“校准”键长按3秒才能进入标定态防止平时误触。这些交互规则在代码里就是switch-case结构清晰明了也方便答辩时讲给别人听。矩阵键盘扫描时行线设置为推挽输出列线设置为下拉输入检测到低电平就说明有键按下。消抖用定时器轮询比如每10ms扫一次连续两次状态一致才认为是有效按键。这里要提醒一点GPIO引脚复用的时候特别容易出问题。比如你用PA0到PA15这些引脚要检查它们是否有其他复用功能占用。ADC通道、TIM2的PWM输出、USART2的TX/RX都是同一组引脚资源分配Pin脚时要先列一个资源表把每个功能用到的引脚、对应的复用功能、有没有冲突全部列清楚再开始画原理图或者写代码。我见过不少同学做到一半引脚不够用原因就是没做资源规划后面只能飞线折腾得很。4. 核心代码实现与调试过程4.1 初始化与主循环框架软件流程不复杂但框架要写清楚。系统上电后先做时钟初始化、GPIO初始化、HX711初始化、LCD初始化、按键初始化接着从Flash读回保存的标定参数和单价然后进入主循环。主循环里三个核心任务轮询HX711读数并滤波、刷新显示、扫描按键并处理事件。主循环的写法决定了系统的实时性。HX711读数本身是阻塞式的要等DOUT拉低才能开始串行读取如果主循环里磨磨蹭蹭按键响应就会变慢。所以我把称重滤波放在定时器中断里执行主循环只负责从缓冲区取最新滤波值和处理按键事件。具体实现是TIM2配置成1ms中断每1ms读取一次HX711原始值放进滑动滤波器主循环每100ms把滤波结果换算成重量并刷新LCD。这样按键响应再怎么也有10ms级别不会出现按键按下半天没反应的尴尬。这里必然要提到“STM32延时函数delay卡死”这个高频热词。很多人写delay用的是循环变量递减但如果你开了定时器中断而延时函数内部又依赖同一个定时器的计数值来判断时间到了没有就会互相干扰。另一种情况是这段时间内定时器中断没被正确响应或者中断服务函数里占用了过长时间导致外部事件一直得不到处理看起来就像延时卡死。务必要把延时函数和系统中断解耦不要让它们共用同一个硬件定时器做时间基准。4.2 HX711驱动代码的三种写法HX711的读时序是标准化的先把PD_SCK拉低等待DOUT变为低电平然后产生24个时钟脉冲每个脉冲的上升沿读出一位数据第25个脉冲用于增益设置和掉电模式控制。这个时序用GPIO模拟最直观代码也好理解。我给出最常用的标准写法框架unsigned long HX711_Read(void) { unsigned long value 0; unsigned char i; GPIO_ResetBits(HX711_SCK_GPIO, HX711_SCK_PIN); // SCK拉低 while (GPIO_ReadInputDataBit(HX711_DOUT_GPIO, HX711_DOUT_PIN) ! RESET); // 等待DOUT变低 for (i 0; i 24; i) { GPIO_SetBits(HX711_SCK_GPIO, HX711_SCK_PIN); delay_us(1); value value 1; if (GPIO_ReadInputDataBit(HX711_DOUT_GPIO, HX711_DOUT_PIN)) value; GPIO_ResetBits(HX711_SCK_GPIO, HX711_SCK_PIN); delay_us(1); } // 第25个脉冲选择通道A、增益128 GPIO_SetBits(HX711_SCK_GPIO, HX711_SCK_PIN); delay_us(1); GPIO_ResetBits(HX711_SCK_GPIO, HX711_SCK_PIN); delay_us(1); return value; }读出来的24位数据是有符号数要把无符号值转换成带符号的重量值。因为HX711的满量程输出对应一个正负范围直接按无符号处理会导致负重量变成巨大的正数。转换方法很简单如果数据最高位是1补码负数就先减掉0x1000000。这一步不做空秤时你一碰传感器数据就乱跳看着像坏了其实是符号位没处理。另一个细节是读取速率。HX711默认输出速率是10Hz可选80Hz。DOUT从高变低表示新数据准备好了。如果上一个数据还没读完下一个数据不会覆盖这个机制很省心。但在低功耗场景下要注意掉电模式是通过持续拉高SCK超过60微秒触发的恢复时要再输入一个低脉冲。毕设项目一般不涉及知道有这回事就行。4.3 重量换算与单价计算的实现要点重量换算的数学公式非常简单但工程实现有几个数值陷阱。原始ADC值减去零点后乘上标定斜率得到的是以克为单位的重量值。注意斜率单位是“克/ADC码”不是“ADC码/克”换算方向不要搞反。这个公式在定点运算时要防止溢出2000克满量程对应的ADC差值大约在几十万这个量级无符号32位变量足够。为了省事我推荐直接用浮点运算。STM32F103没有硬件浮点单元但72MHz的主频做这个量级运算还是绰绰有余完全不必为性能担心。显示的时候做四舍五入保留一位小数就够用。价格计算时为了减少浮点误差积累我的做法是先算总价元到分再拆开显示而不是在浮点上四舍五入两次。关键代码逻辑如下float weight_gram (raw_value - cal.zero_value) * cal.scale; float net_gram weight_gram - tare_value; float total_price_yuan net_gram / 1000.0f * unit_price;单位换算要严格统一。传感器量程一般标的是千克HX711标定是用克算更直观。别在代码里一会儿用千克一会儿用克到时候显示乱套查半天也不知道哪里出问题。所有内部计算统一用克和元只在显示层转换成需要的格式这样最干净。4.4 LCD1602显示驱动的移植与定制LCD1602是经典的字符型液晶驱动时序基于HD44780控制器老掉牙但非常可靠。买来的模块通常已经焊好上拉电阻和背光直接用。驱动方式有8位和4位两种为了省引脚用4位模式就够了需要11个引脚RS、RW、E、D4到D7、背光、对比度。RW如果直接接地就只用10个引脚读写操作只做写不做读很多例程就是这种精简接法。以STN32为例GPIO配置全部设为推挽输出E引脚的高低电平持续时间按数据手册留足写命令后延时几十微秒写数据后延时几十微秒。LCD初始化时要按顺序发送功能设置、显示开关、清屏、输入模式四条指令顺序乱了屏幕就出现乱码或不显示这是热词里“c51单片机接lcd1602显示不出字符”这类问题的根源。显示模块的代码实现要注意爆内存。在中断里频繁调用液晶刷屏函数尤其要避免把复杂字符串格式化放在中断里做。printf这类重定向函数很吃栈空间我在调试时发现不开优化的情况下堆栈设置默认1K可能不够用现象是程序跑一段时间后莫名其妙进HardFault后来把启动文件里的Stack_Size改成0x10004K就再没出过问题。这个坑非常隐蔽排查了很久分享出来帮大家避开。4.5 掉电保存与系统稳定性设计掉电保存用的是FLASH模拟EEPROM我把参数结构体定义成固定大小的字节数组写入时先擦除页再把数据逐字节写入。读写完成之后再做一次校验和检查防止写入过程中系统掉电导致参数损坏下次上电时如果发现校验失败就恢复默认值并提示重新标定。这个“校验失败用默认值兜底”的思想不管做什么设备都通用。系统稳定性方面除了电源退耦和地线处理软件上要加看门狗。STM32F103内置独立看门狗IWDG超时周期设为1秒左右主循环里喂狗。万一传感器卡死、I2C挂死或者某个中断进死循环看门狗能把系统拉回来这个功能在答辩演示时非常加分因为现场演示最容易出状况。还有一个小细节HX711的DOUT引脚要配置成上拉输入SCK配置成推挽输出如果你把DOUT配成浮空输入线材比较长的时候容易误触发。5. 常见问题与排查技巧实录5.1 HX711读数漂移和跳变的排查顺序这个问题在群里被问烂了。读数漂移通常分两种一是上下跳变幅度大二是有规律的爬坡或下降。遇到这个问题别急着改代码按以下顺序排查先看供电纹波用万用表测HX711的AVDD对地电压同行会接一颗100uF电解电容和104瓷片电容组合确保模拟电源干净再看传感器接线端子是否松动杜邦线氧化也是常事重新插拔处理一下最后看传感器本身有没有受压变形放上去重物之后松手读数能不能回到零点回不到说明传感器弹性体受损了。如果这些都正常最大嫌疑就是滤波窗口太短。原始数据波动是正常的关键是滤波系数调没调对。我把滤波算法简化一下new_value old_value * 0.6 current_value * 0.4就是低通滤波但滑动平均的窗口写法比这个更直观易调。一般把窗口设成30到50次效果就很明显了。5.2 超量程保护与线性度校正的实战经验超量程保护一定要做。传感器过载后轻则数据不准重则塑性形变导致彻底报废。代码里要判断滤波后的ADC值超过满量程对应的值直接显示“OVER”并蜂鸣器报警不允许继续计价。满量程判断值可以设定为标定斜率的1.3倍比如标定1kg用了1000个码那500kg对应的码值就是1300超过就报警预留一点余量防止瞬时冲击误报。线性度校正问题我在教学实验里发现多数国产悬臂梁传感器在量程的20%以下误差偏大而在80%以上也略有偏差。所以我建议至少做三个点的标定然后用最小二乘法拟合。最小二乘法的代码不过几十行在单片机上跑也没有压力。做完三点标定之后实测全量程误差基本能控制在0.2%以内对于家用和商用计价秤来说已经非常够用了。5.3 上电不运行、程序下载失败与时钟配置的常见问题“程序下载失败”是另一个高频问题。下载失败分两种情况一是芯片锁死原因是非法代码或低功耗模式导致SWD引脚被占用解决办法是先把BOOT0拉高进入系统存储器模式此时内核运行的是ROM里的引导程序那里面不会有用户代码干扰SWD再重新连接下载一次成功后再把BOOT0拉回低电平即可。二是接线太长或接触不良ST-Link的SWDIO和SWCLK线超过20厘米就容易出问题用杜邦线时尤其明显直接换短线或者焊接线解决。“上电不运行”多半是 BOOT0 没接对或者复位电路的电容选得太大导致上电复位时间过长偶尔按一下复位键就正常了。还有一种是外部晶振没起振程序里配置了HSE等待超时跑飞或者停在启动文件的SystemInit里出不来。排查方法是先用ST-Link Utility连接芯片读取DBGMCU的IDCODE确认芯片通讯正常再看RCC的时钟状态寄存器如果是HSI启动但你想用HSE那八成是晶振没焊好或者电容值不对。时钟配置方面用标准库就是RCC_HSEConfig、RCC_WaitForHSEStartUp这几行。如果你发现程序死在“等待外部时钟就绪”的while循环里先量一下OSC_IN和OSC_OUT引脚有没有振荡波形波形没有就检查晶振并联的1MΩ电阻有些设计需要、负载电容和引脚焊盘是否连锡。F103的时钟树配置核心就是搞清楚SYSCLK来源、AHB预分频、APB1和APB2预分频这几个寄存器位域别把APB1最大36MHz的限制忘了给USART2、TIM3这些外设配置时钟时超频了就会导致工作异常。5.4 快速排查速查表我把平时带学生调试时用到的排查点整理成一张表遇到问题先照着查能省下大量时间现象可能原因排查方法LCD无显示对比度没调好、初始化时序错误调节对比度电位器检查RS/RW/E引脚接线LCD花屏乱码数据引脚错位、电源不稳逐位核对D4-D7接线检查供电电容重量读数反向传感器信号线接反交换S和S-接线读数缓慢漂移传感器长期受压、温漂重新做零点标定检查是否过载按键偶尔失灵消抖参数不合适、电平冲突调整消抖时间为10ms到30ms掉电参数丢失Flash写入时序错误、校验失效检查写Flash前是否关中断校验逻辑是否完整6. 调试经验与一份可以直接上手做的小建议整个项目做下来我的体会是电子秤项目最花时间的不是写代码而是标定和调噪声。做第一版时我花了两天时间在HX711的跳数问题上后来发现是模块供电压降过大导致ADC参考电压不稳。从那以后我的经验是传感器供电和MCU供电必须分开走线或者至少共用稳定的稳压源后加磁珠和电容隔离。还有一点传感器固定方式特别重要悬臂梁传感器必须固定在刚性的底板或者支架上如果秤盘和传感器之间用螺丝锁不紧轻微晃动就会让读数来回跳这个跟算法无关纯机械问题。给正在做毕设的同学一个实用建议先不要急着追求外观第一版用核心板加模块把整个功能链路跑通然后再考虑画PCB和做外壳。功能链路跑通的定义是放上标准砝码显示值和实际值的误差控制在两克以内单价输入和总价计算完全正确断电重启后参数还在。能做到这三点答辩基本就稳了。这个项目后续要扩展也非常顺手。方案一加一个ESP8266或ESP32模块通过串口把称重数据上传到手机或云平台做物联网称重方案二加一个语音播报模块称完直接报出重量和价格商用场景就很完整了方案三加蓝牙模块和微信小程序对码做一套个人健康饮食秤。这些扩展都以这套核心代码为基础改造成本很低。你把这套基本功练踏实了后面的路会顺畅很多。
