ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

STM32智能家居毕设全攻略:从需求拆解到代码实现

STM32智能家居毕设全攻略:从需求拆解到代码实现 简介本资源是一套基于STM32F103平台实现的高完成度智能家居系统项目专为计算机、电子信息、自动化等专业学生设计适用于毕业设计、课程设计及期末大作业等实践场景尤其适合缺乏嵌入式项目经验但希望快速上手的初学者。项目经导师指导并获99分高分评审代码完整可直接编译运行配套PDF报告文档详述设计思路、硬件选型、通信协议与功能测试过程。压缩包共332个文件涵盖40个C源码、43个头文件.h、78张界面与电路截图.png、41个前端交互脚本.js、24个Vue组件及HTML/CSS页面另有Keil工程配置文件、Hex固件、APK安卓控制端、调试脚本bat及编译中间文件整体容量100.83MB。资源已获92人学习下载内容组织清晰模块划分明确含传感器采集、WiFi通信、本地控制、手机APP联动等核心功能附带实操演示MP4与详细注释显著降低调试门槛。1. 毕设题目怎么定才不算烂大街需求拆解与选题思路每年毕业季STM32 智能家居这个题目几乎能占到嵌入式方向毕设的半壁江山。你可能觉得这题目太大众化了但说实话大众化有大众化的好处参考资料多、方案成熟、不容易翻车。关键在于你怎么在这个老框架里做出自己的差异化而不是交一个谁都能写出来的万能智能家居。我拿到这个题目后的第一件事不是急着写代码而是先做需求拆解。所谓智能家居系统本质上就是一个以 MCU 为核心的嵌入式数据采集、处理、显示与控制系统。拆开来看至少包含四大块环境感知、人机交互、执行控制、数据通信。环境感知对应的是温湿度、光照、烟雾或空气质量这类传感器人机交互对应按键、屏幕或者手机 App 界面执行控制对应继电器、蜂鸣器、LED 这类被控对象数据通信则是决策数据指令在各个环节之间流转的通道。这个思路确定了你的题目方向就不会散。很多同学上来直接说我要做一个智能家居系统结果做完只有一块板子加两个传感器报告写得再长也撑不起这个题目。如果你想拿高分我建议在智能二字上做文章。比如加上本地语音识别模组做语音开关灯或者用 ESP8266 打通手机远程控制再或者增加一个简单的 OLED 显示界面展示环境数据曲线。这些点都能让评审老师一眼看出你在系统设计上是花了心思的而不是仅仅做完一个最小原型。题目拆解完成后下一步就是技术选型。主控芯片的选择上STM32F103C8T6 是最主流的方案这颗芯片价格便宜、资料多、引脚够用而且市面上几乎所有开发板都围绕它做教程。如果你用的是正点原子或者野火的板子很多外设驱动可以直接参考例程改写。有一点需要提醒开发板自带的资源测评报告里不要直接写使用了正点原子/野火开发板要写你自己设计的电路和外设接法这是很多同学在报告查重和答辩中被问倒的重灾区。用到的传感器和模块方面我建议选 DHT11 或 DHT22 做温湿度采集、BH1750 或光敏电阻做光照检测、MQ-5 或 MQ-135 做空气质量监测、HC-SR501 做人体红外感应再加上一个 OLEDSSD1306 驱动做本地显示继电器模组控制灯光或风扇。这套组合的成本不高但覆盖了采集、显示、控制三要素逻辑闭环也很清晰。如果你有富余预算可以加一个 ESP8266 模组走 MQTT 协议连上云平台这样就能在手机 App 端看到实时数据实现远程控制这个加分项。2. 系统框架怎么搭硬件选型、通信协议与软件分层框架设计是整个项目的地基地基打不好后面跑起来全是问题。我从硬件选型、通信协议和软件架构三个维度拆开来讲。2.1 硬件选型清单与理由拿我的方案来说核心物料如下模块型号接口作用主控STM32F103C8T63.3V/GPIO核心处理单元温湿度DHT11/DHT22单总线 GPIO环境温湿度采集光照BH1750 数字光强I2C光照强度采集空气质量MQ-135ADC(PA1)有害气体检测人体感应HC-SR501GPIO 外部中断人来自动开灯显示OLED 0.96寸 SSD1306I2C本地数据显示继电器2路/4路继电器模组GPIO控制灯光/风扇无线ESP8266-01SUSART2上云/手机控制这套选型有几个细节值得说DHT11 虽然精度一般但胜在协议简单适合把精力放在系统集成上BH1750 是 I2C 接口能和 OLED 共用一条 I2C 总线节省引脚MQ-135 输出的是模拟电压正好用 STM32 的 ADC 采集顺便把 ADC 多通道扫描的知识点带进去HC-SR501 输出电平变化用外部中断处理最合适还能体现你在中断设计上的能力。2.2 通信协议选择I2C、单总线、USART 与 MQTT 的取舍这个项目里你至少要接触三种通信方式这是报告的天然素材。I2C 总线用于连接 BH1750 和 OLED。两个设备共用一个 I2C 外设地址不同STM32 的硬件 I2C 在 F1 系列上偶尔有 Bug尤其在某些低功耗模式下所以我习惯用软件模拟 I2C管脚随便配时序自己控制代码虽然多了几十行但稳定性反而更好。当然如果你想展示自己会用硬件 I2C 且处理过总线锁死问题也可以尝试硬件方式然后在报告里写明你是如何用超时机制避免死锁的——这个细节非常加分。单总线用于 DHT11。单总线的关键点是时序要严格主机拉低总线发起起始信号后必须精确延时 18ms 以上然后释放总线等待传感器响应。DHT11 返回 40 位数据8 位湿度整数、8 位湿度小数、8 位温度整数、8 位温度小数、8 位校验和。读取时每一位的时序要用延时配合 GPIO 输入完成这也是经常出 Bug 的地方。USART 用于 ESP8266 通信。ESP8266 出厂默认波特率通常是 115200注意和 STM32 的串口波特率匹配。使用 AT 指令集进行配置常见流程是先 AT 测试指令通不通 → 设置 Wi-Fi 模式 → 连接路由器 → 开启透传模式 → 建立 TCP 连接。这套流程每一步都要等到模块返回 OK 或具体状态码再继续不能闷头往下发。MQTT 协议则是在 ESP8266 与云平台之间使用。云平台是你选择的物联网平台设备端通过 MQTT 发布主题比如dev/room1/temp手机端订阅该主题即可实时收到数据。如果不想自己搭服务器直接用公共的 MQTT Broker 也行记得改默认端口或者干脆用平台自带的移动端调试工具查看数据。2.3 软件分层不要把业务逻辑全部写进 main 函数很多新手爱把整个项目全都堆在 main.c 里。传感器初始化、轮询、按键扫描、屏幕刷新、串口打印全塞在一起几百行代码下来别说答辩了自己调试都头疼。软件分层这件事能做到的同学基本都是亮眼的存在。我的代码结构长这样SmartHome/ ├── Core/ │ ├── Inc/ │ └── Src/ │ ├── main.c │ ├── gpio.c │ ├── usart.c │ ├── i2c.c软件模拟 │ └── adc.c ├── Drivers/ │ ├── BSP/ │ │ ├── bsp_led.c │ │ ├── bsp_relay.c │ │ ├── bsp_key.c │ │ └── bsp_beep.c │ └── Middleware/ │ ├── dht11.c │ ├── bh1750.c │ ├── mq135.c │ ├── ssd1306.c │ ├── esp8266.c │ └── mqtt.c ├── App/ │ ├── app_sensor.c传感器数据采集与滤波 │ ├── app_control.c逻辑控制、阈值判断、状态机 │ └── app_display.cUI更新 └── Doc/ ├── 系统框图 ├── 原理图 └── 状态机说明这样分层的好处是硬件驱动放在 BSP 和 Middleware 层业务逻辑放在 App 层。以后你想给某个传感器换型号比如 DHT11 换成 DHT22只需要改对应的驱动文件而 App 层的控制代码完全不用动。答辩时老师问你你系统扩展性怎么样你就可以直接拿这个结构说事。3. 硬件电路设计主控、传感器接入与 OLED 显示硬件这一块很多同学会直接买一块开发板插几个传感器模块然后就开始写软件。这样确实省事但报告里就没什么硬件知识可以写了。想要拿高分少说也要画一个自己的最小系统板原理图再不济也要把传感器怎么接、为什么这么接说得头头是道。3.1 主控最小系统复位电路、晶振与 BOOT 设置STM32F103C8T6 的最小系统包含四部分电源、晶振、复位、BOOT。电源部分用 AMS1117-3.3 把 5V 稳压到 3.3V输入输出各并一个 10uF 和 100nF 电容去耦。晶振用 8MHz 无源晶振两个 20pF 负载电容这个 8MHz 是 HSE内部 PLL 倍频到 72MHz 供系统使用。复位电路就一个 10K 上拉电阻加一个按键电容。BOOT0 下拉到 GND从 Flash 启动BOOT1 随意。这里有个大坑如果你用的是最小系统板而不是开发板每次烧录程序后需要手动复位才能运行。很多同学第一次用 ST-Link 下载后发现程序不跑就是这个原因。解决方法是把 ST-Link 的 RST 引脚也连到板子的 NRST 上烧录后 ST-Link 会自动复位运行。相关热词里有 stm32 st-link utility 和 stm32 禁用jtag这两个点都是调试中会碰到的坑后面我再展开。3.2 传感器接入电路的细节DHT11 的数据线需要接一个 4.7K 上拉电阻到 3.3V。别小看这个电阻没有它单总线的高电平会拉不起来读取的数据全是 0xFF。另外 DHT11 的数据脚一定要选一个支持推挽输出的引脚不推荐用开漏模式去靠外部上拉驱动。BH1750 和 OLED 挂在同一条 I2C 总线上SDA 和 SCL 都需要接 4.7K 上拉电阻。如果你用的是现成模块模块上通常已经有上拉电阻了就不用额外加自己画板子的话千万别漏。还有个小细节BH1750 的 ADDR 引脚如果接低电平I2C 地址是 0x23接高电平是 0x5C。OLED 一般固定是 0x3C所以两者不会冲突。这个地址区分问题在报告里写一下就很有含金量。MQ-135 模块有一个模拟输出AOUT和一个数字输出DOUT。接 STM32 的 ADC 时用 AOUTDOUT 单独接一个 GPIO 做阈值报警也行。不过我更推荐用 ADC 实时采集然后在软件里做阈值判断这样系统更灵活因为你不需要物理调整模块上的电位器来改报警阈值。MQ-135 上电后需要预热几分钟前几秒读数会偏大软件里可以做个上电延时丢弃前面几次采样。HC-SR501 模块上有两个可调电位器一个调灵敏度检测距离一个调延时时间。接 MCU 的引脚最好设置为上拉输入或者外部中断模式。模块输出高电平时表示检测到人体低电平表示没有。3.3 执行器接口继电器与蜂鸣器继电器模组是低电平触发还是高电平触发取决于模块上的光耦设计。市面上常见的 1 路/2 路继电器模组大多是低电平触发IO 拉低继电器吸合。这个一定要看模块的丝印或者原理图别想当然。如果你用高电平触发去写逻辑结果发现继电器不工作排查半天。继电器线圈是感性负载断电瞬间会产生反向电动势所以继电器模组上必须有续流二极管。如果你用的是现成模组可以不管自己画板子必须在继电器线圈两端并联一个 1N4007 二极管。STM32 的 GPIO 输出电流能力有限最大 25mA不能直接驱动继电器线圈模组上一般已经带了 PNP/NPN 三极管或 ULN2003 驱动电路这也是为什么大家都爱用继电器模组而不是裸继电器。蜂鸣器分有源和无源两种有源蜂鸣器通电就响无源蜂鸣器需要给不同频率的方波才能发出不同音调。毕设项目里用有源蜂鸣器就够了接一个 NPN 三极管比如 S8050驱动。引脚输出高电平三极管导通蜂鸣器响。注意蜂鸣器声音很响如果放在宿舍测试建议先用杜邦线接一个按键把蜂鸣器报警功能做成手动触发测试避免一直吵室友。3.4 OLED 显示与 UI 布局OLED 0.96 寸 128x64 分辨率SSD1306 控制器I2C 接口。你需要把官方 SSD1306 驱动移植过来通常包括初始化、设置光标、显示字符/字符串、清屏等函数。4 针 I2C 接法GND、VCC3.3V、SCL、SDA。如果是 7 针 SPI 版本就复杂一些不建议选。UI 布局方面我的建议是做一个简单的多页面切换而不是一页把所有数据塞满。第一页显示温湿度和空气质量第二页显示灯光/风扇状态和控制方式自动/手动第三页显示 Wi-Fi 连接信息。按键切换页面KEY1 翻页KEY2 切换自动/手动模式KEY3 手动模式下切换继电器。如果你想让 OLED 显示的东西更出彩可以研究一下显示中文字库通常需要自己取模或者画个简单的曲线图把温湿度历史变化画出来。这些在答辩时都是实打实的亮点。4. 核心代码实现从初始化到控制闭环代码是项目的灵魂。这部分我不给你贴完整的工程代码而是把核心模块的实现思路和关键代码片段讲清楚让你拿到后能直接照着改。4.1 系统时钟与 GPIO 初始化STM32F103 上电默认使用 HSI8MHz 内部高速时钟如果你不配置时钟树主频只有 8MHz外设运行会很慢。使用 STM32CubeMX 可以图形化配置HSE 选择 Crystal/Ceramic ResonatorPLL 倍频系数 9 倍System Clock 设为 72MHz。GPIO 初始化注意点继电器、LED、蜂鸣器推挽输出初始电平为不动作状态继电器断开、LED 灭、蜂鸣器不响按键上拉输入按下为低电平可以开启内部上拉省去外部电阻DHT11 数据线在读取过程中要切换输入/输出方向建议用宏定义封装一下 GPIO 模式切换OLED/BH1750 的 I2C 引脚开漏输出 外部上拉或者直接推挽输出也行软件 I2C 无所谓4.2 多传感器采集与滤波算法传感器数据采集不是 read 一下就完了。DHT11 的时序要求很严格我之前提到过 40 位数据每位高电平的时间长度决定该位是 0 还是 1。核心读取函数大致逻辑uint8_t DHT11_ReadByte(void) { uint8_t i, data 0; for (i 0; i 8; i) { // 等待低电平结束开始位 while (DHT11_PIN_READ() 0); // 延时 30us delay_us(30); if (DHT11_PIN_READ() 1) { data | (0x80 i); // 高位在前 } // 等待高电平结束 while (DHT11_PIN_READ() 1); } return data; }这段代码的关键在于 30us 的判断阈值。DHT11 的数据位0高电平约 26~28us1高电平约 70us。你延时到 30us 左右再去读引脚电平读到 1 说明是1读到 0 说明是0。这个延时可以用 SysTick 实现也可以用简单的循环空转。但注意编译优化级别别开太高否则循环会被优化掉导致延时失效。MQ-135 的 ADC 采集用 STM32 的 ADC1 通道。F103 的 ADC 是 12 位分辨率参考电压 3.3V所以采集值 V ADC_Value / 4096 * 3.3。你拿到的电压值还需要换算成 PPM 或者直接做阈值比较。很多项目里并没有把电压转成真正的 PPM而是直接用电压值或者一个比例值来判断空气质量好坏。这也没关系报告里说清楚你的判断逻辑就行。数据滤波也是一个加分点。我用了滑动平均滤波维护一个长度为 5 或 10 的缓冲区每次采样后将新值放入队尾去掉队首然后求平均值。这样做能明显减少 MQ-135 输出值的波动显示在 OLED 上的曲线也会平滑很多。代码很简单uint16_t MovingAverage(uint16_t newValue, uint16_t *buffer, uint8_t len, uint8_t *index) { buffer[*index] newValue; *index (*index 1) % len; uint32_t sum 0; for (uint8_t i 0; i len; i) sum buffer[i]; return sum / len; }4.3 业务逻辑状态机设计智能家居的智能体现在哪就是系统能根据传感器数据自动做出决策而不是只能手动操作。我用了一个简单状态机来管理自动模式状态 IDLE空闲实时采集并显示数据状态 LIGHT_ON检测到人体HC-SR501 高电平或光照低于阈值比如 50 lux自动开灯状态 FAN_ON温度高于 28℃ 或 MQ-135 读数超过阈值自动打开风扇状态 ALARM温湿度或空气质量超过安全范围蜂鸣器报警状态机的好处是逻辑清晰不会出现多条 if 语句互相冲突的情况。比如你拿多条 if 去判断开灯和开风扇很容易出现一个动作被重复执行。用状态机后每次进入一个状态只执行一次对应的动作拉高/拉低 GPIO状态不切换就不重复执行。void App_Control_Update(void) { switch (currentState) { case STATE_IDLE: if (人体检测到 光照不足) 状态切换到 LIGHT_ON; else if (温度过高 || 空气质量差) 状态切换到 FAN_ON; else if (温湿度超限 || 空气严重污染) 状态切换到 ALARM; break; case STATE_LIGHT_ON: 执行开灯动作; 进入 LIGHT_ON 后 如果条件不满足 恢复 IDLE; break; // 其他状态同理 } }手动模式就简单多了按键直接翻转继电器状态并通过 OLED 显示当前状态。自动/手动切换用 KEY2 实现每次按键在两种模式之间翻转。4.4 ESP8266 上云AT 指令解析与数据上报如果你要给项目加分ESP8266 是一个性价比极高的选择。ESP8266-01S 引脚比较少但接 STM32 的 USART2 足够。接线VCC 接 3.3V注意 ESP8266 的峰值电流很大最好单独供电不要和 STM32 共用同一个 3.3V LDO 输出否则 Wi-Fi 连上一瞬间电压跌落会导致系统复位GND 共地RX 接 STM32 的 TXTX 接 STM32 的 RX。ENCH_PD引脚必须拉高。AT 指令发送要注意每个指令后带\r\n。我封装了一个ESP8266_SendCmd()函数发送指令后等待模块返回OK或ERROR超时 2 秒后重试。连接云平台的流程ATRST ATCWMODE1 ATCWJAPWiFi名称,WiFi密码 ATCIPMUX0 ATCIPSTARTTCP,MQTT服务器地址,端口 ATCIPMODE1 ATCIPSEND之后所有发到串口的数据都会被透传到服务器。注意千万别漏了透传模式设置否则每次发送数据都要先发 ATCIPSEND 再等提示符。云端这一侧你可以用现成的物联网平台它支持自定义数据流和设备管理。创建一个智能家居项目添加温度、湿度、光照、空气质量四个数据流然后生成一个设备 ID 和 API Key。ESP8266 通过 HTTP POST 或者 MQTT 上报数据到云端然后手机 App 或网页端就能看到实时数据。HTTP 方式最简单通过 AT 指令发一个 HTTP 请求把 JSON 数据 POST 上去但每次请求都要建立/断开 TCP 连接效率低一些。MQTT 方式需要自己在 MCU 端实现 MQTT 客户端协议或者使用现成库稍微复杂但更符合物联网场景。相关热词里有个 stm32 http库 和 stm32 作为主机挂载U盘前者可以用在这个场景后者我建议不要轻易尝试F103 的 USB 外设做 Host 挂 U 盘坑太多了毕设时间不够用。5. 联调阶段最容易翻车的地方我的踩坑记录说实话这个项目写代码可以很快但联调阶段才是真正烧时间的地方。我把自己踩过的大坑列出来希望你提前避开。5.1 STM32 被锁死与 JTAG 禁用问题相关热词里出现了 stm32 禁用jtag 和 stm32 st-link utility这俩是真有关系。如果你在代码里把 PB3、PB4、PA15 这些引脚配置成了普通 GPIO 输出而这些引脚恰恰是 JTAG 接口的部分信号那么恭喜你下次烧录程序时 ST-Link 可能连不上芯片了。具体原因是STM32F103 上电后PB3JTDO、PB4NJTRST、PA15JTDI默认复用为 JTAG 调试功能。如果你把它们当作普通 GPIO 使用必须先把 AFIO 寄存器里的 JTAG 配置改成 SW-DP 模式GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE)。但是如果你在代码里执行完这个操作后程序没跑起来或者进入了死循环JTAG 已经被关闭了ST-Link 就再也连不上了。解决办法是按住板子上的复位键在 ST-Link Utility 里点击 Connect然后再松开复位键在芯片启动早期把调试口抢回来。具体操作是先连接 ST-Link目标板保持复位状态点击 Connect 的同时释放复位。如果这招不行就只能用串口 ISP 方式全片擦除了。经验教训不要在项目初期就急着禁用 JTAG。如果你必须用 PB3/PB4/PA15 做 GPIO先把代码其他部分调通最后再启用这些引脚并且确保程序不会一上电就死机。我的做法是加一个延时 500ms 再禁用 JTAG这样每次复位后至少还有 500ms 的调试窗口万一出了问题也能抢连。5.2 STM32 延时函数 delay 卡死热词里有 stm32 延时函数delay卡死我猜你也遇到过。最常见的卡死原因是 SysTick 中断优先级没配置好。如果你在主循环里用HAL_Delay()而此时来了一个更高优先级的中断比如外部中断、串口中断在中断服务函数里调用了HAL_Delay()那么就会死锁因为 SysTick 中断被高优先级中断阻塞而高优先级中断又在等 HAL_Delay 完成。解决办法有两种一是确保所有中断服务函数里不要调用 HAL_Delay二是把 SysTick 中断优先级调到最高。在 CubeMX 里SysTick 中断优先级默认是 15最低但我习惯把它改成 0最高并且在中断服务函数里不用阻塞延时改用状态机或者定时器计数。这样能避免绝大多数卡死问题。另外还有一种卡死原因DHT11 的读取时序里如果使用while (GPIO_PIN 0)这类死等语句而传感器没有正确响应比如线没接好、上拉电阻丢了程序就会一直卡在 while 循环里。所有涉及外部设备响应的地方都必须加超时退出机制。比如uint16_t timeout 10000; while (DHT11_PIN_READ() 0 timeout--);5.3 ESP8266 串口通信乱码与数据冲突很多同学会遇到 STM32 和 ESP8266 通信时串口输出乱码。原因大概率是波特率不匹配或者接线错误。ESP8266-01S 默认是 115200但有些模块固件版本可能默认 9600所以先用 USB-TTL 接模块独立测试一遍确认波特率和 AT 指令响应正常再往 STM32 上接。另一个隐蔽的问题是串口冲突。如果你把 ESP8266 接在 USART1 上而 USART1 又是调试打印口那么 STM32 打印调试信息时会把数据发给 ESP8266ESP8266 会把它们当成 AT 命令解析返回 ERROR 或者进入奇怪状态。所以调试打印和 ESP8266 通信要分两个串口调试用 USART1PA9/PA10ESP8266 用 USART2PA2/PA3。CubeMX 配置时还要注意 PA2/PA3 的复用功能。5.4 OLED 白屏与地址问题OLED 白屏几乎可以断定是 I2C 地址不对或者初始化时序问题。先用 I2C 扫描程序查一下总线上设备的实际地址。如果是 0x3C 那没问题如果扫描不到检查接线、上拉电阻和供电。然后初始化函数要严格按照 SSD1306 的时序来不能省略前面的延时。还有一点容易忽略OLED 的 VCC 必须稳定在 3.3V不要用 STM32 的 3.3V 引脚去供多个模块尤其是 ESP8266 如果和 OLED 共用同一个 3.3VWi-Fi 发射瞬间的大电流很容易把 OLED 拉复位导致白屏。供电要分开或者说独立给 ESP8266 供电。5.5 ADC 多通道扫描采样的坑热词里提到 stm32 adc 多通道扫描循环采样 dma这是高级玩法了。如果你的项目里不只 MQ-135 一个模拟量比如还要采集光敏电阻或者其他传感器那么多通道 DMA 采样确实很优雅。但用起来有两个坑第一多通道扫描模式下ADC 的转换序列要正确配置。F103 的 ADC 1 最多有 16 个外部通道你可以用ADC_RegularChannelConfig()逐个配置通道和采样顺序。采样时间不要都用默认的 1.5 周期有些高阻抗信号源需要更长的采样时间否则数值不稳定。第二DMA 传输完成后要清标志。DMA 循环模式下数据会持续填充到缓冲区但你的主循环可能只拿到了上一次的数据。CubeMX 的 ADC DMA 配置相对简单但你需要理解 DMA 半传递/全传递中断并维护自己的缓冲区索引。如果你不想在这个地方花太多时间最简单的做法是先不用 DMA直接在循环里HAL_ADC_Start(hadc1); HAL_ADC_PollForConversion(hadc1, 100);依次读几个通道数据量不大完全够用。DMA 只是锦上添花不要为了炫技把自己困住。6. 项目报告怎么写才能拿到高分文档框架与图表建议源码容易写报告难写。很多同学源码写得很漂亮代码能跑但报告写得像流水账最后答辩被老师说分析不深入、工作量不够。这里我分享一个报告框架按这个结构写基本不会出大问题。6.1 报告的整体结构我建议把报告分成六个章节第一章 绪论研究背景与意义、国内外研究现状、本文主要工作。研究现状不用写太深点到为止重点突出本文在现有基础上做了哪些改进。第二章 系统需求分析功能需求数据采集、自动控制、远程监控、非功能需求响应时间、稳定性、功耗。第三章 系统总体设计硬件架构图、软件架构图、通信协议设计、状态机设计。这章是整个报告的核心图表要多。第四章 硬件详细设计主控最小系统、各模块电路设计、PCB 设计说明如果有的话。第五章 软件详细设计各驱动模块设计、核心算法设计数据滤波、状态机、异常判断、云端通信设计。第六章 系统测试与结果分析单元测试、集成测试、性能测试稳定性、响应时间、功耗给出测试数据和截图。6.2 图表怎么画才专业报告中的图至少包含系统总体框图、系统硬件接线图、软件流程图、状态迁移图、界面设计图、实物连接图。系统框图用 Word 的 SmartArt 或者 Visio 画都可以。分三层感知层传感器、处理层STM32 主控、执行层继电器/蜂鸣器和应用层OLED 显示、手机 App。层与层之间用带箭头的线连接标明数据流向。软件流程图主要画主循环流程和中断服务流程。注意流程图的符号规范起止框用圆角矩形、处理框用矩形、判断框用菱形。别用 PPT 随意画几个方块就行格式越规范越显得专业。状态迁移图是这个项目报告里的亮点图。把状态机用图形化表示出来每个状态一个圆圈状态之间用带箭头的线连接线上标注触发条件。这张图画出来老师一眼就知道你的业务逻辑是结构化的不是简单 if-else 堆出来的。6.3 测试部分要有数据、有对比测试不是写系统运行正常功能全部实现就完了。要像发论文一样严谨给出测试环境室温、供电方式、设备列表、测试步骤每个功能点的操作方式、预期结果和实际结果。还有一个关键点——性能测试数据。例如传感器采集周期每 1 秒采集一次温湿度实际抖动 5msOLED 刷新率每 500ms 刷新一次无闪烁继电器响应时间从传感器数值越过阈值到继电器动作 200ms设备 24 小时连续运行无死机、无数据丢失这些数据从哪里来就是你自己在联调阶段实测记录的。所以我在你调试过程中劝你一定要加串口打印时间戳方便统计毫秒级的响应时间。没有数据的测试结果等于白测。6.4 报告的避坑点不要直接照搬开发板例程最容易被老师识破的代码风格和开发板例程一模一样注释都没改。千万别这样。你可以参考例程的写法但变量名、函数名、注释、代码风格都要改一遍最好是自己重新组织逻辑哪怕功能一样代码结构也要不同。否则不仅查重过不了答辩时老师随便问一个你写的函数你说不出来那基本就坐实了抄代码。另外报告语言要规范别用口头语。比如眨眼功夫就显示出来了要改成系统响应时间小于 100 毫秒满足实时性要求。还有引用文献至少 8 篇以上中文核心期刊、硕士论文、IEEE 论文都可以不要只引用开发板的教程帖子。6.5 源码交付时文件组织建议认真负责的学长会教你报告交一份源码压缩包交一份两者规范命名。源码包建议包含SMART_HOME_SOURCE/ ├── README.md编译环境、烧录步骤、接线说明 ├── STM32_Project/整个工程文件 ├── 硬件资料/原理图PDF、引脚分配表 ├── 上位机或云平台配置说明/设备ID、数据流创建步骤 └── 参考资料/数据手册、芯片手册README 一定要写清楚用什么 IDEKeil MDK 5.3x 还是 STM32CubeIDE、芯片型号、配置外设、默认引脚分配、下载方式ST-Link 还是串口 ISP、波特率、Wi-Fi 配置信息等。这一步看着不起眼但老师验收项目时不用自己摸索接线和配置第一印象就会好很多。就我个人经验来看毕设项目拿到高分的关键不在于功能有多花哨而在于逻辑闭环 细节完整。你的系统可能只是温湿度采集加继电器控制但如果你把需求分析、原理图设计、软硬件分层、状态机设计、测试数据、问题排查过程全部讲清楚这就是一个完整的工程级项目而不是一个课设 Demo。反过来哪怕你功能再多但代码一团乱、报告没有图表、测试数据为零老师也一样不会给高分。按我上面这套思路来做一个月之内把代码、实物、报告全部落地问题不大。本文还有配套的精品资源点击获取
返回列表