☰
STM32智能行李箱毕业设计:GPS定位、称重与蓝牙控制全方案
2026/10/21 8:15:02 网站建设 项目流程

简介:本资源是一套基于STM32微控制器的智能行李箱系统完整开发套件,面向高等院校计算机、电子、自动化等专业本科生及嵌入式初学者,专为毕业设计、课程设计与实践项目打造。系统涵盖主控逻辑、LCD人机交互、电机驱动、传感器数据采集等核心功能模块,代码经实测稳定运行,文档详尽覆盖硬件选型、原理图说明、软件架构与调试指南,支持快速复现与二次开发。压缩包共286个文件,含40余个C源文件(.c)、42个头文件(.h)、41个编译中间文件(.o)、40个依赖文件(.d)及Keil工程配置(.uvproj、.uvopt)、烧录镜像(.hex)、启动脚本(.bat)等,结构规范,便于理解嵌入式项目构建全流程;整体大小8.68MB,轻量易用。已有55人学习下载,配套资料可直接用于答辩材料整理、实验报告撰写与原型演示,显著降低毕业课题实施门槛。 带毕业设计性质的STM32智能行李箱,听起来功能很多,其实拆开看就是一套很典型的单片机综合应用——传感器采集、电机控制、无线通信、电源管理,全部揉在一块板子上。如果你正在找这类项目的源码和开发文档参考,或者准备做类似的课程设计、毕业设计,这篇分享尽量把完整的方案、选型理由、代码逻辑、调试坑点和文档组织方式都讲透。

我按毕业设计最常见的功能组合来讲:GPS定位防丢、行李称重、蓝牙APP控制、电子锁和报警提示,主控用STM32F103C8T6,所有代码模块化组织,能直接移植到自己的工程里。下面按从方案设计到实际验收的顺序逐步展开。

1. 需求拆解与总体方案设计

1.1 智能行李箱到底要做什么:功能清单与边界

先别急着写代码,拿到题目之后第一步是明确系统边界。很多人在毕业设计里实现了一堆功能,最后发现没有一个做得扎实,答辩时被老师追问就露馅。智能行李箱的功能不是越花哨越好,而是要有清晰的逻辑闭环:感知、决策、执行、反馈。

我按毕设常见需求整理了一张功能表:

功能模块实现效果硬件基础优先级
GPS定位防丢行李箱位置通过手机APP查询GPS模块+蓝牙核心
行李称重实时显示重量,超重提醒HX711+压力传感器核心
蓝牙控制解锁/上锁、查询状态、触发报警蓝牙模块+电子锁核心
电子锁控制手机远程开锁,也可按键开锁电磁锁/舵机锁核心
报警提示剧烈振动或非法移动时本地声光报警蜂鸣器+振动传感器加分项
电量监测锂电池电压显示与低电量预警ADC分压检测加分项

为什么不做自动跟随和人脸识别?因为视觉跟随涉及OpenMV或者摄像头识别算法,成本高、难度大,而且行李箱拉着跑在校园里本身就是安全隐患。我见过好几个学弟试图做视觉跟随,最后要么摄像头识别不稳定,要么跟随逻辑不够安全被老师质疑,不如把GPS、称重、蓝牙这几个模块做得可靠、数据做得精确。

核心原则是:每个功能都能用“输入-处理-输出”讲清楚,每个模块都有对应的测试数据。

1.2 主控选型:为什么是STM32F103C8T6

STM32F103C8T6在同类项目里几乎是标准答案。这是一块Cortex-M3内核、主频72MHz的芯片,64KB Flash、20KB RAM,48引脚封装,资源对于这个项目来说刚好够用,不会像用F4那样大材小用,也不会像用51那样算力和外设都捉襟见肘。

最核心的考虑是生态。F103系列在网上的例程、库函数文档、论坛问答数量几乎是所有单片机里最多的,这对毕设来说非常友好。你在调试中遇到任何问题,基本都能搜到前人的解决方案。我当时用标准外设库开发,因为参考代码最多,HAL库的代码也能找到,但标准库整理起来的项目结构更清晰。

各模块的资源占用情况:

外设模块通信方式占用资源
GPSUSART19600波特率,中断接收
蓝牙USART29600波特率,中断接收
称重传感器HX711(GPIO模拟时序)2个GPIO(DOUT/PD_SCK)
OLED显示屏I2CI2C1,地址0x3C
电子锁/蜂鸣器GPIO输出各1个GPIO
振动传感器GPIO外部中断1个GPIO,上升沿触发

Flash和RAM的占用大概在60%左右,留出了后续加功能的空间。如果后面需要记录历史位置数据,20KB的RAM不够存太多,但作为毕设演示场景完全够用。

1.3 系统整体框架:硬件拓扑与数据流向

整个系统可以看成两条独立数据链路,加上一条共享电源总线。

第一条链路是“位置链路”:GPS模块通过串口把NMEA 0183协议数据发给STM32,STM32解析出经纬度、UTC时间、速度等信息,格式化之后通过蓝牙模块发送到手机APP,APP端做地图路径展示。

第二条链路是“重量链路”:称重传感器(电阻应变片桥式电路)输出的差分毫伏信号,经过HX711放大和24位ADC采样,变成数字量,STM32读取之后通过校准系数转换成克数,在OLED和手机端同步显示。

数据流向可以概括为:传感器采集 → STM32处理 → 屏幕显示/蓝牙传输 → 手机控制/查看。主循环采用前后台架构,前台是串口中断和外部中断负责及时接收数据,后台主循环负责解析和处理,不需要引入操作系统,代码逻辑更直观,也更好解释。

2. 硬件电路搭建与关键器件选型实战

2.1 电源系统设计:电池、升压、稳压

智能行李箱要移动使用,供电是第一个要解决的问题。我用的方案是一节18650锂电池(标称3.7V,容量根据箱子空间选5000mAh到10000mAh),通过升压模块升压到5V,再经过LDO稳压到3.3V给单片机供电。为什么中间要加一级5V?因为GPS模块和HX711传感器模块的工作电压范围虽然支持3.3V,但5V供电时GPS模块的接收灵敏度和HX711的激励电压更稳定,测量结果波动更小。

升压模块用的是常见的MT3608方案,便宜、纹波能接受,注意要把输出电压调准在5.0V再接入后续电路。LDO用的是AMS1117-3.3,压差只有1V左右,输入5V输出3.3V效率还行。

实测下来整个系统待机电流约80mA(OLED点亮、GPS工作、蓝牙连接状态),报警和开锁瞬间电流会到500mA以上,18650电池容量2500mAh能坚持大概8到10小时,如果换成两节并联容量翻倍,实测续航在15小时以上。这个实验数据写进论文里是加分项。

2.2 GPS模块选型与接线细节

GPS模块我选的是ATGM336H,比老牌的NEO-6M体积更小、功耗更低、冷启动速度也更快。模块通过串口输出NMEA 0183格式的数据,默认波特率9600,这个和STM32的USART1直接对接就行,注意共地是必须的,模块的TX接单片机RX,模块的RX接单片机TX,交叉连接,别接反。

天线位置是GPS模块最容易出错的地方。模块通常带陶瓷有源天线,最好的安装位置是行李箱顶部或侧面的塑料壳内侧,不能放在金属壳里面,因为金属会屏蔽卫星信号。我最初把模块装在箱子底部靠近金属拉杆的地方,搜星数从12颗直接掉到4颗,挪到顶部后恢复正常。如果你的行李箱是金属材质,需要把天线通过延长线引出到塑料面板再固定。

2.3 称重模块:HX711与电阻应变片的连接

称重部分用的是HX711模块和铝制悬臂梁式压力传感器。传感器的工作原理是电阻应变片粘贴在悬臂梁上,受力时梁发生形变,应变片电阻值随之变化,惠斯通电桥输出一个微小的差分电压。这个电压在毫伏级别,单片机ADC根本没法直接采,所以需要HX711做信号放大和模数转换。

HX711和单片机之间是两线接口:DOUT数据输出和PD_SCK时钟输入。单片机通过特定时序从HX711读出24位数据,增益可以通过PD_SCK的脉冲序列选择,我用的是128倍增益,对应通道A。

接线时特别注意:传感器有五根线,红黑是电源(E+和E-),绿白蓝分别是信号正、信号负和屏蔽线。不同厂家的传感器颜色定义不完全一样,买来后第一件事是查规格书确认每条线的定义,不要想当然。HX711模块的AVDD供电建议直接用5V,这样传感器激励电压稳定在约为4.2V左右,称重数据跳动比3.3V供电要小很多,这个是我实测试出来的差距。

2.4 蓝牙模块、电子锁和报警电路

蓝牙模块我试过两种。HC-05经典蓝牙配置简单但功耗大,而且现在很多手机已经不再兼容蓝牙2.0。后来换成HM-10的BLE4.0模块,功耗降了一半,手机连接也更稳定。HM-10默认波特率9600,发送AT指令可以修改串口参数,注意AT指令模式的进入方法是上电时按住模块上的按键直到LED慢闪,再用USB转TTL连接电脑,或者通过单片机串口发送。

电子锁的实际选型我做过对比:

方案优点缺点建议
电磁锁响应快、力度大瞬时电流大(1A),需要驱动电路行李箱锁舌改造难
SG90舵机控制简单、电流小扭矩有限,锁舌需要轻适合自制锁扣结构
微型电磁插销锁体积小,5V直接驱动动作声音大最推荐,接线简单

我最后用的是微型电磁插销锁,5V供电,高电平触发弹出锁舌,直接推拉就能复位。用STM32的GPIO接一个NPN三极管(S8050)驱动,继电器都省了,因为插销锁工作电流大约500mA,三极管完全能扛住。

报警电路最简单,一个5V有源蜂鸣器加一个NPN三极管驱动,GPIO输出高电平就响。有源蜂鸣器内部自带振荡源,不需要PWM,代码里一个GPIO翻转就搞定,而且声音足够大,行李箱被人拖走时能起到明显的警示作用。

2.5 接线清单与PCB布局建议

把整套系统的接线整理成一张表,方便照着接线。注意这里所有模块的地线最终要汇聚到同一个电源地,避免形成地环路。

模块STM32引脚说明
GPS TXPA10 (USART1_RX)交叉连接
GPS RXPA9 (USART1_TX)交叉连接
HM-10 TXPA3 (USART2_RX)交叉连接
HM-10 RXPA2 (USART2_TX)交叉连接
HX711 DOUTPB0推挽输入
HX711 PD_SCKPB1推挽输出
OLED SCLPB6 (I2C1_SCL)上拉电阻4.7K
OLED SDAPB7 (I2C1_SDA)上拉电阻4.7K
电磁锁驱动PA4通过S8050控制
蜂鸣器驱动PA5通过S8050控制
振动传感器PB3外部中断输入
电池电压检测PA0 (ADC1_IN0)分压电阻后接入

PCB布局方面有两点建议:HX711的模拟信号线要尽量短,远离电机驱动或电磁锁这种大电流线路;电池电压检测的分压电阻用1%精度的金属膜电阻,否则检测到的电压偏差会超过0.1V。如果只是毕设,用洞洞板焊接完全够用,注意把HX711模块用铜柱垫高,避免背面焊点和下面走线短路。

3. 软件模块化设计与核心代码逻辑

3.1 工程结构与模块划分

软件部分我按照模块化思想组织,每个外设功能放在独立的源文件里,主程序只负责模块间的调度和数据流转。这样做的好处是调试方便,比如GPS不工作,单独测试gps模块就行,不会影响其他功能。

工程目录划分:

  • main.c:主循环调度、状态机管理
  • gps.c / gps.h:串口接收、NMEA帧解析、经纬度换算
  • hx711.c / hx711.h:称重传感器驱动、滤波算法
  • ble.c / ble.h:蓝牙数据接收、指令解析
  • oled.c / oled.h:OLED屏初始化、界面刷新
  • lock_alarm.c / lock_alarm.h:电子锁控制、蜂鸣器报警逻辑
  • adc_bat.c / adc_bat.h:电池电压采样和电量计算
  • delay.c / delay.h:延时函数

每个模块对外只提供2到3个接口函数,比如HX711模块对外就是HX711_Init、HX711_Get_Weight、HX711_Tare这三个函数,主程序根本不需要关心模块内部怎么实现。这种设计在答辩讲代码结构的时候也是加分项,老师会觉得你有软件工程思维。

3.2 初始化顺序与主循环设计

main函数里的初始化顺序是有讲究的,不能随意排。我建议先初始化时钟和延时,然后是GPIO、串口、I2C,初始化外设模块,最后打开全局中断。GPS模块和蓝牙模块上电后需要几百毫秒的时间才能进入正常工作状态,所以初始化之后最好加一个1秒的延时再开始发送数据。

主循环采用一个简单的状态机,每个周期大约50ms:

  • 检查GPS是否收到新数据,有则解析并更新位置
  • 调用HX711读取任务进行称重采样,每200ms采一次
  • 检查蓝牙是否有新指令,有则执行解锁/报警/查询操作
  • 刷新OLED显示
  • 检查振动传感器标志位,触发报警

循环里执行时间控制在80ms以内,不能让某个模块占用太长时间,不然GPS数据缓冲区会溢出。GPS模块的串口接收我在中断里用一个环形缓冲区,主循环再解析,这样既不会丢数据,也不会阻塞其他功能。

3.3 GPS数据解析:从NMEA协议到可直接使用的位置信息

GPS模块输出的NMEA 0183协议里有多种帧,最常用的是GPRMC帧,包含了定位状态、纬度、经度、速度、航向和UTC时间。解析流程是这样的:

  1. 在串口接收缓冲区里搜索“$GPRMC”开头的行
  2. 按逗号分隔字段
  3. 检查第2个字段,不是“A”表示定位无效,直接丢弃
  4. 如果有效,提取纬度和经度字段以及方向标识、UTC时间
  5. 把度分格式(ddmm.mmmm)转换成十进制度数,方便APP端显示

度分转十进制的公式我直接写进代码里:十进制 = 整数部分 + 小数部分除以60。比如gps读取到3041.5823,整数30是度,41.5823是分,转换后就是30 + 41.5823/60 = 30.693038度。

下面是我当时用的核心解析代码,注释里写清楚了每一步的逻辑:

// 从GPRMC帧中提取经纬度信息 void GPS_ParseGPRMC(char *buffer, GPS_Info *info) { char *p = buffer; int field = 0; int i = 0; if (strncmp(buffer, "$GPRMC", 6) != 0) return; // 跳过帧头 p += 7; field = 1; while (*p && field < 10) { if (*p == ',') { field++; p++; continue; } // 第2个字段:定位状态,A表示有效 if (field == 2) { info->pos_status = *p; } // 第4个字段:纬度 if (field == 4) { if (i < 15 && *p != '.') { info->latitude_raw[i++] = *p; } } // 第6个字段:经度 if (field == 6) { if (i < 15 && *p != '.') { info->longitude_raw[i++] = *p; } } p++; } p = NULL; }

实际使用中,GPRMC帧里第5个字段(N/S)和第7个字段(E/W)是方向标识,分别表示北纬/南纬和东经/西经。中国国内用不到南纬西经,但代码里还是要处理,直接忽略会导致跨半球时位置跑到海上去。我当时代码里把方向字段也解析出来,根据N/S和E/W给经纬度加正负号,这样一个简单的处理就让程序带了更强的通用性。

3.4 HX711称重算法:毛重、净重、去皮与滤波

HX711的读取原理是用时钟脉冲把24位数据逐位移出来。每给PD_SCK一个上升沿,DOUT引脚输出一位数据,等24个位读完,再把PD_SCK拉高,触发下一次转换。这个过程中时序需要严格满足芯片手册要求,最简单的方式是直接用GPIO模拟,代码控制在微秒级别,不需要用到定时器。

称重算法上最容易犯的错是直接拿原始ADC值当作重量使用。HX711输出的是带符号的24位数据,要转成实际克数需要校准。校准方法很简单:先用标准砝码(我用厨房秤校准过的1kg铁块)测出原始读数,毛重除以读数得到的系数就是每个ADC单位的重量。

我建议把读数和重量转换分开。原始读数经过一个低通滤波后,再通过系数换算成克数并减去去皮零点。滤波用的是简单的滑动平均,取最近5次采样平均,实测波动从±15克降到±3克以内。重量小于某阈值时直接清零,避免传感器在无负载状态下输出极小的漂移值。

以下是HX711模块的核心读取代码片段:

// 读取HX711的24位ADC值 uint32_t HX711_Read(void) { uint32_t count = 0; uint8_t i; // 等待DOUT变为低电平,表示数据准备好 while (HX711_DOUT_READ()); for (i = 0; i < 24; i++) { HX711_SCK_HIGH(); delay_us(1); count = count << 1; if (HX711_DOUT_READ()) { count++; } HX711_SCK_LOW(); delay_us(1); } // 第25个上升沿,返回通道A、增益128 HX711_SCK_HIGH(); delay_us(1); HX711_SCK_LOW(); return count; }

读取完成后要注意符号扩展。HX711用的是24位有符号数,最高位是符号位,如果直接当作32位无符号数使用,负数时会得到巨大的正值。正确做法是判断第23位是否为1,是的话把高8位补成0xFF再做有符号转换。

3.5 蓝牙指令协议设计

蓝牙模块和APP之间的数据交互需要自定义一套简单的通信协议。不要直接发裸字符串,否则APP端解析容易出错。我用的协议帧格式如下:

帧头功能码数据长度数据校验
0xAA1字节1字节N字节1字节校验

指令从单片机发给APP:0xAA 0x01 0x04 重量高字节 重量低字节 电量 状态 校验和。

APP发给单片机的指令更简单:0xAA 0x02 0x01 0x01 校验和,功能码0x02表示控制指令,数据0x01解锁、0x02上锁、0x03报警。校验和用最简单的累加和,SUM = (帧头+功能码+长度+所有数据) & 0xFF。不用CRC是因为指令长度短,累加和够用且实现简单,答案也容易解释。

解析时要注意防粘包和断包。串口中断收到的一帧数据可能不完整,也可能一次收到两帧,所以主循环里的解析函数需要按帧头查找、按长度裁剪,校验不对就丢弃。

3.6 报警逻辑与低功耗处理

报警模块的触发逻辑是:系统处于上锁状态时,振动传感器检测到持续3秒以上的抖动就触发蜂鸣器报警,并同时发送报警状态到手机APP。为什么加3秒的延时?因为拖动行李箱时会产生连续振动,而搬一下或者触碰会产生短促振动,3秒阈值能很好区分两种场景,减少误报。

低功耗方面,因为GPS模块本身就是耗电大户,没有用睡眠模式,所以我做了两个优化:OLED屏每分钟自动熄屏,按键或蓝牙指令触发唤醒;蓝牙连接断开后,系统自动降低采样频率,GPS模块用软件方式切换到低功耗模式(模块手册里有PMTK指令可以用来配置),实测电流从80mA降到35mA左右。

当然,如果行李箱长期不用,建议直接断电。我加了一个物理电源开关,实际演示时大家都是开箱插电再操作,低功耗模式主要写在论文里体现设计思考,答辩时能讲清楚原理就行。

4. 调试阶段遇到的典型问题与完整排查过程

4.1 GPS搜星慢且定位飘移:天线位置与电源干扰

GPS问题是最折磨人的。第一次上电测试,模块开机5分钟都没定位成功,拿到阳台才勉强搜到5颗星,定位误差大到几百米。

我的排查链路是这样的:

  1. 先用模块自带的USB转TTL小板直接用电脑看数据,排除STM32串口配置问题
  2. 确认模块能输出GGA和GPRMC帧,但状态一直为“V”(无效)
  3. 把模块拿到窗外,等了3分钟终于变成“A”(有效),但位置始终在附近漂移
  4. 检查天线,发现我把天线放在了锂电池旁边,电池的金属外壳严重干扰了信号
  5. 把天线移到箱子塑料挡板外侧,搜星数量从5颗直接跳到11颗
  6. 恢复定位正常,但漂移依然存在,换成户外开阔地测试,漂移范围缩小到10米内

结论:GPS模块必须远离金属物体和锂电池,天线最好贴在外壳内壁;测试地点尽量选开阔区域。箱子里如果已经装了金属结构件,天线要尽量往高处走。

电源线的干扰也要注意。GPS模块供电最好加一个10uF的退耦电容,我用的是模块上的VCC和GND之间并联电容,实测能降低定位数据的跳动幅度。

4.2 称重读数漂移:共地问题与软件滤波

HX711称重模块在单独测试时读数很稳定,装进箱子里接上STM32就发现读数不停跳动,从600克到900克之间乱跳。

排查过程:

  1. 检查传感器接线,确认是差分输入且屏蔽线接到HX711的AGND,没问题
  2. 用万用表测量HX711的输出电压,发现GND和AVDD之间的电压有200mV的波动,异常
  3. 发现HX711模块的AVDD是从5V供电,而STM32板子的5V来自USB供电,USB供电电压本身就带纹波
  4. 在HX711的AVDD和GND之间加一个100uF的电解电容,同时把传感器屏蔽线单独接到电源地,波动降到20mV以内
  5. 软件里加了滑动平均滤波之后,显示稳定到±3克以内

重点总结:模拟电路和数字电路要共地,但模拟电源要做好滤波。HX711模块不要直接和电机或者电磁锁共用电源线,如果条件允许,用独立的LDO给传感器供电。

4.3 蓝牙连上但指令不响应:从参数到接线的排查

HM-10蓝牙模块用手机连接成功,但是在APP里点击解锁没反应。检查过程如下:

  1. 用串口助手直接接STM32的串口2,给蓝牙模块发AT指令,指令正常,模块回应OK
  2. 手机连上蓝牙后,尝试通过串口监视器看STM32是否有收到数据,完全没有
  3. 排查后发现HM-10模块的TX接的是PA3(USART2_RX),但HM-10的TX引脚实际电压平时是低电平,如果STM32的RX配置成浮空输入,可能被拉低造成接收异常
  4. 把蓝牙模块的TX和STM32的RX之间加了一个1K电阻串联,并且把STM32的RX配置成内部上拉输入
  5. 问题解决,APP控制正常

关键点:接线不是简单的“TX接RX”就行,还要考虑电平匹配和引脚的默认状态。如果用的是5V单片机的板子接3.3V蓝牙模块,还要注意电平转换,STM32的引脚都可以配置成开漏输出加外部上拉,这种方式通吃。

4.4 电池供电时单片机反复重启:电磁锁动作瞬间的电源跌落

前期用USB供电调试一切正常,换锂电池供电后,发现每次电磁锁动作的瞬间,单片机就会复位重启,OLED屏幕闪一下。

排查结果:

  1. 用示波器测5V电源轨,发现电磁锁触发瞬间电压从5V跌到3.2V,持续几十毫秒
  2. 原因:电池加升压模块的瞬时输出能力不足,电磁锁启动电流500mA以上,MT3608升压模块的响应速度跟不上
  3. 解决:在5V母线上加一个470uF的大电容,作为瞬间储能缓冲;同时软件上把电磁锁触发时间从一直拉高改成200ms脉冲,锁舌伸出到位后关闭驱动
  4. 另一个优化:GPIO拉高前先检查电池电量,低于3.5V时拒绝开锁并蜂鸣提示,避免电池被瞬间拉垮

这个问题是最典型的实际工程问题,写在论文的“问题与解决方案”一节里非常有说服力,老师也很喜欢听这类真实的调试经历。

5. 系统实测结果与数据整理

5.1 各功能模块的测试用例与结果

整机测试我设计了以下用例,每个都记录了实测数据,这部分内容可以直接整理成论文的测试章节:

测试项目测试方法预期结果实测结果结论
GPS定位户外开阔地开机3分钟定位成功冷启动82秒,搜星11颗通过
称重精度标准1kg砝码测试5次误差±20g误差±5g通过
蓝牙开锁APP点击解锁,观察锁舌1秒内动作<500ms通过
报警响应拖动行李箱5秒内报警约3秒触发通过
续航满电连续工作≥8小时实测9小时50分钟通过
通信距离手机连接后走远≥15米稳定开阔地25米稳定通过

5.2 实测数据表现:从性能到体验

GPS定位精度这块,在开阔场地静态测试的CEP大概是5到8米,动态移动时误差会稍微大一些,主要是手机和行李箱之间数据刷新频率导致的滞后。定位输出的频率是1Hz,也就是一秒更新一次位置,刚好满足“找箱子在哪个方向”的需求,不会让人觉得卡顿。

称重部分的重复性表现不错:同一物体反复放上秤台,读数波动在±5克以内。不过这里有个使用场景要注意,压力传感器是悬臂梁式,承重范围我选的是50kg量程,超过50kg会输出饱和,实测压到60kg的时候读数就不再上升了,所以说明文档里一定写清楚量程,避免用户误操作损坏传感器。

蓝牙通信的延迟在室内实测大约300到500ms,主要是手机端APP轮询状态造成的,实际使用基本无感。

5.3 如何把测试数据做成答辩材料

测试数据不能只记录数字,要整理成“测试条件-操作过程-实测记录-结果分析”的完整报告。答辩时每个数据都放在这4个维度下讲,老师问起来才有底气。

我的建议是:制作一张大的整机测试汇总表,把测试环境(温度、手机型号、测试地点)、步骤(操作、时间点)、结果(数据、截图)都放进去,然后再用图表的形式展示称重校准曲线和GPS定位轨迹,这样比一堆干巴巴的数字直观得多。这块内容不需要很高大上,只要逻辑清晰、数据真实,就能给整个毕设增色不少。

6. 毕业设计开发文档的结构组织与答辩准备

6.1 完整开发文档包含哪些内容

很多人做毕业设计,代码写完了但文档拖到最后才写,最后只能熬夜赶工,质量可想而知。完整开发文档应该和开发过程同步推进,目录结构我建议这样组织:

  1. 需求分析:功能需求、性能指标、可行性分析
  2. 系统总体设计:系统框图、工作流程、模块划分、通信协议设计
  3. 硬件设计:主控选型、各模块原理图、PCB设计、接线表、电源计算
  4. 软件设计:工程架构、初始化流程、核心算法流程图、关键代码说明
  5. 系统测试:测试环境、测试用例、测试数据、问题与解决方案
  6. 总结与展望:工作成果、创新点、不足与改进方向

其中“问题与解决方案”这一节最容易出彩,把你调试过程中遇到的每个问题、排查思路、解决方案记录下来,老师看了会觉得你真正动手做过,而不是网上找代码糊弄。

6.2 代码工程打包和资料整理技巧

源码打包之前一定要做几个动作:加注释、整理README、写模块说明。代码注释不需要每行都写,但要保证重要逻辑(协议解析、数据处理、中断处理)旁边都有3到5行说明,让人能看明白设计意图。

README文件里要写清楚:系统功能简介、开发环境(Keil版本、库版本)、硬件清单、接线表、编译烧录步骤、使用方法,以及代码文件结构和每个文件的作用。这样拿到代码的人很快就能跑起来,答辩时老师要求在电脑上演示也能快速操作。

代码仓库里我建议按“硬件资料”、“软件源码”、“文档报告”三个目录组织,硬件资料放原理图PDF和接线图,软件源码放完整的Keil工程,文档报告放开发文档和测试报告。这样整个资料包结构清晰,拿到手不用翻半天。

6.3 答辩现场容易被问的问题和应答思路

根据我的经验,老师很喜欢在智能类项目上问几个固定问题,提前准备能让答辩过程顺利很多:

问:为什么选STM32F103C8T6,不选更便宜的51单片机?答:51单片机主频低、外设少,GPS解析和后续扩展都受限,STM32的USART、I2C、外部中断等资源适配合适,性价比高,资料丰富。

问:GPS定位的精度是多少?为什么在室内不能用?答:静态CEP可达2.5米(取决于模块型号),动态使用误差在5-10米左右。GPS靠卫星信号,在室内信号被建筑遮挡,基本无法定位,实际使用时可以结合手机基站定位辅助。

问:称重传感器的量程和精度是多少?怎么校准的?答:量程50kg,实际测量误差±5g,校准用标准砝码测量,先测出ADC单位与克数的换算系数,再在代码里做去皮和滤波。

问:整个系统的功耗大概多少?能续航多久?答:正常工作电流80mA,优化后待机35mA,2500mAh电池实测续航约10小时,使用优化策略和更大容量电池可以进一步提升。

问:这个系统有什么实际应用场景?答:机场出行防丢提示、货物称重提醒、可结合手机APP做位置追踪,这些场景都是自己实际测试验证过的基本功能,展开讲就行。

回答问题的核心原则是:用数据说话,用事实作答。每个问题都用“我实测的数据是……”开头,比任何理论都更有说服力。

写在最后:一份扎实资料背后的真实积累

智能行李箱这个项目做完之后,我最大的体会是:这类嵌入式综合项目的价值不在功能多炫酷,而在把每个模块做扎实,把每个问题弄清楚。GPS为什么搜不到星、称重为什么漂移、电磁锁为什么导致复位,这些问题背后的原理比代码本身更有意义。

整理源码和开发文档的过程其实是最耗精力的,但它能让你的设计更有说服力,也让后来的人少走弯路。如果你自己要做一个类似的STM32项目,建议也按这套思路走:先画系统框图、列接口清单,再动手焊板子、写驱动,最后把遇到的问题和解决方案记录成文档。这个过程本身就是最好的毕业设计答辩准备。

最后分享一个小技巧:开发过程中给每个模块单独建一个测试demo工程,单独验证通过后再整合到主工程。这样“拼车”时出了问题,你能立刻知道是哪个模块的问题,不用整板调试找Bug,能省下大量时间。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询