ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

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

基于STM32与HX711的智能计价电子秤设计与实现 做毕设想选一个既有硬件味道、又能讲清楚完整业务逻辑的题目智能计价电子秤绝对算一个。它不像纯控制类项目那样只在板子上点灯也不像纯上位机那样脱离物理世界而是把传感器采集、信号放大、ADC转换、数据处理、人机交互、计价逻辑全部串在一起一套流程下来单片机核心知识基本都能覆盖。而且题目的应用场景明确答辩时随便拿出一张收银小票、一次称重校准都能讲出实际价值。我调试这套基于STM32的智能计价电子秤时最大的感受是难点不在STM32本身而在“称得准”这三个字上。很多同学用HX711模块接上传感器读个原始值就以为完事了结果放上砝码数值漂移、换了量程非线性严重、按键按下单价却跳动这些问题几乎每个人都会遇到。这篇文章我就把自己的完整设计、选型逻辑、软件实现和踩坑记录整理出来希望能给做类似毕设的同学省掉几个通宵。1. 项目整体设计与思路拆解1.1 需求拆解这个秤到底要完成什么任务先把需求说透。智能计价电子秤不是普通的体重秤它的核心业务是“称重算钱”。用户把商品放上去系统识别重量操作者通过键盘输入单价屏幕显示重量、单价、金额。听起来简单但展开后至少有下面几个功能点称重通过电阻应变式压力传感器感知重量量程常见5kg、10kg、30kg精度要求通常到1g或者0.1g级别。计价重量乘以单价得到总价支持小数位处理单价单位一般是元/斤也有用元/kg的这个要提前定好。去皮放上包装盒或容器后按去皮键把当前重量清零只计算商品净重。累加可能需要支持多次称重、累计金额方便按批次结算。显示与键盘清晰的重量、单价、金额显示界面按键输入数字、小数点、确认、清除、去皮等。校准与精度保障传感器有零点漂移和增益误差必须提供校准流程保证不同传感器、不同安装条件下都能准确称重。这里有个容易忽略的点成本敏感。毕设预算有限不可能用工业级称重仪表所以整套方案必须在常用模块的基础上完成。这也引出了选型的逻辑。1.2 方案选型为什么是STM32F103C8T6HX711电阻应变式传感器主控选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 - STM32GPIO模拟时序读取数据、换算重量、处理按键、控制显示 - 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是5VDOUT高电平是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/GAIN4.3mV在范围内。如果传感器灵敏度是2mV/V满量程输出就是8.6mV还在范围内。如果激励电压是5V增益128满量程差分输入就是4.3mV?等等重新算。激励电压取AVDD4.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*8388608180万里最大不对20mV对应83886084.3mV对应180万。180万码对应5kg每克约360码这个分辨率足够了。如果传感器精度是0.05%FS5kg的误差约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类型保存显示时转成整数或带一位小数。标定过程我做了三步空秤稳定后按键读取零点保存。放上标准砝码比如500g读取稳定原始值自动计算标定系数。存储到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并且满量程输出超过20mVADC就会饱和。计算一下你的传感器灵敏度如果满量程输出接近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年答辩时你完全可以从容展示老师问到你精度怎么保证、温漂怎么解决你都能接得住。
返回列表