
简介本资源是一套面向本科毕业设计的完整嵌入式安防系统实战方案适用于STM32初学者及电子类专业毕设学生解决智能仓库环境监测、多源入侵报警与远程协同管控等典型工程问题。压缩包共524个文件涵盖86个.h头文件与74个.c源码含STM32F103底层驱动与应用逻辑、44份PDF文档含完整论文参考、原理图说明、元件清单、2个PCB工程文件、2个原理图文件、1个可直接安装的Android APK应用及配套MP4演示视频整体达684.32MB结构清晰、模块解耦明确便于分阶段学习与调试。已有835人下载学习资源提供从硬件设计含可编辑PCB、固件开发、APP通信到论文撰写的全链路支撑特别包含GSM短信报警触发逻辑、WIFI透传协议适配代码、多传感器数据融合显示等关键实现细节是少有的兼具工程规范性与教学完整性的毕设级项目范例。1. 先把“智能仓库”拆成你能交付的东西做毕设第一个坑就是一上来就想“我要做一个智能仓库”然后打开STM32CubeMX发呆。仓库监测和安防拆开来看其实是三块互相独立、又能拼在一起的功能环境感知温湿度、烟雾/可燃气体这些数据要实时采集还要能看历史趋势否则“远程监测”没有落地。安防报警人体红外、门窗磁、火焰检测触发之后要声光报警同时把告警事件推到远程端。远程通道仓库里没有人在但数据要能传到手机或电脑网页上这套系统才叫“远程”。把这三个功能列出来选题的框架就清楚了传感器采集端用STM32F103C8T6做主控外挂DHT22温湿度、MQ-2或MQ-135烟雾/可燃气体、HC-SR501人体红外、火焰传感器模块加上OLED显示屏做本地看板远程通信用ESP8266走MQTT协议上云或者走局域网TCP也行报警执行端用有源蜂鸣器和继电器模块。整套系统供电用12V适配器板载AMS1117-3.3转换成3.3V给MCU和传感器用。选择STM32F103C8T6而不是F407或者GD32原因很实在例程多、资料全、CubeMX一键生成工程芯片价格也稳定。本科毕设最怕的不是技术难是卡在一个问题上三天没人问而F103系列的踩坑记录几乎全网都是这对毕设进度的保障比性能参数重要得多。这块板子本身资源也够用64KB Flash跑得下全部固件20KB RAM足够缓冲多路ADC采集数据和MQTT报文USART、I2C、SPI、ADC外设应有尽有控制这类传感器绰绰有余。PCB部分这一篇我会详细讲。因为很多人以为画完原理图拉完线投板就结束了实际上布局、布线规则、电源完整性、丝印处理这些才是真正拉开差距的地方。2. 环境感知模块选型别只看“能用”要看“好调”仓库环境监测最常见的参数就是温湿度和空气质量。二者选型的逻辑完全不一样分开说。2.1 温湿度传感器DHT22AM2302的性价比与坑DHT22单总线协议一根数据线搞定通信便宜、资料多非常适合本科毕设。我也见过有人用SHT30或者AHT20I2C接口精度更高、稳定性更好但DHT22足够应付仓库环境且例程遍地都是不需要自己抠时序。但DHT22有它的毛病采样周期必须大于2秒。很多人一上来就死循环里读结果读出来的数据全是0或者跳变。这是因为DHT22内部上电后需要时间完成转换你读得太快传感器根本来不及响应。正确做法是在主循环里搞一个状态机或者简单的定时器标志2秒读一次就够了。仓库环境本来就是个慢变量2秒刷新绰绰有余。另外一个坑是上拉电阻。DHT22的数据线需要接一个4.7kΩ到10kΩ的上拉电阻到VCC如果模块自带电平转换电路就无所谓但你裸片焊在PCB上的时候忘了加上拉数据线在空闲状态是高阻态通信必然失败。我在PCB设计那一节会专门画出来。2.2 气体传感器MQ-2还是MQ-135MQ-2可检测丙烷、丁烷、液化气、烟雾MQ-135对氨气、硫化物、苯系蒸汽更敏感同时也对烟雾有响应。对于仓库场景我推荐MQ-135原因不是灵敏度而是它的交叉响应更适合做“空气质量综合指标”——你要的不是精确到“某种气体浓度是多少ppm”而是“仓库空气是不是变质了”MQ-135输出一个随空气污染程度变化的模拟电压阈值可调逻辑简单。而MQ系列传感器有个所有新手都会忽视的问题它内部有加热电阻上电后需要预热。冷启动的几分钟内输出是不稳定的可能乱跳也可能一直高电平。所以程序里不要在初始化后立刻读ADC要延时个3到5分钟再开始判断否则误报率极高。另外这类传感器工作电流不小加热丝大概150mA左右不能用单片机3.3V引脚直接供最好单独用5V供电PCB上留一颗100uF电解电容给它储能缓冲。MQ-135输出的是模拟电压连接到STM32的ADC引脚。信号量与浓度是非线性的但毕设阶段不需要拟合精确曲线直接在程序里设阈值判断“正常/警告/危险”三档就好。真要显示浓度值可以把ADC值直接映射成“空气质量指数0-100”百分比显示人看得懂就行。2.3 ADC多通道采集的关键配置不是每个引脚都能随便接STM32F103C8T6的ADC是12位逐次逼近型最多支持16个外部通道。但要注意ADC引脚分布在PA0到PA7、PB0、PB1等特定引脚上不是任意GPIO都能当模拟输入。网上最常见的翻车就是把传感器输出接到了PA8或者PB3上软件里怎么配置都读不到有效值最后只能用万用表量电压发现引脚根本不通。我自己做这版系统用了ADC的扫描模式连续转换DMA搬运。MQ-135接PA0火焰传感器接PA1两个通道一起采样DMA自动把结果搬到内存数组里CPU完全不用参与等标志位即可。这个写法和轮询读ADC的代码量其实差不多但架构上舒服得多以后加传感器通道只需要改CubeMX配置。ADC初始化里有个关键参数是采样时间。STM32的ADC采样时间可以设1.5到239.5个周期如果引脚源阻抗高采样时间太短会导致采集电压偏低。MQ-135模块输出经过一个电压比较器或者直接分压输出源阻抗不算太低我建议把采样时间设为55.5周期以上稳定不漂。3. 安防子系统无源蜂鸣器与有源蜂鸣器千万别选错安防报警执行端很多人第一反应是“蜂鸣器呗”。但蜂鸣器分为无源和有源两种无源蜂鸣器需要外部提供一定频率的方波才能响有源蜂鸣器内部自带振荡源给个高电平就响。毕设系统里强烈建议用有源蜂鸣器否则你得用定时器输出PWM驱动麻烦且有源蜂鸣器的响度通常更大仓库环境需要响度。驱动方式上也不要直接用GPIO高电平触发就完事。有源蜂鸣器工作电流大概30mAGPIO引脚直接驱动会拉低电压也可能烧引脚。正确方案是加一颗S8050三极管做开关蜂鸣器接在5V和三极管集电极之间GPIO接基极串1kΩ限流电阻。PCB设计时这颗三极管的位置尽量靠近蜂鸣器走线短可以减少压降和干扰。人体红外模块HC-SR501输出的是数字信号触发时输出高电平。这个模块最容易被忽略的是它有两个可调电位器灵敏度调节和延时时间调节。延时时间调太长你测试的时候按一次触发它可能持续输出半分钟高电平逻辑上看起来就像“卡死了”。推荐把延时调到最小逆时针旋到底让它输出一个短暂脉冲便于程序判断边沿。火焰传感器也是模拟输出但它的光谱响应决定了它只能在一定距离内有效。距离几十厘米能测到打火机火焰再远就瞎了。所以整机联调的时候千万别把它放在仓库门口说“我看不到火焰”——物理特性摆在那里选型和安装位置本来就是系统方案的一部分。安防联动逻辑不能太复杂。我的策略是人体红外触发且持续10秒以上判定为非法闯入蜂鸣器响火焰传感器输出超阈值立即响MQ-135浓度超过警告阈值响一下提示而不是持续报警超过危险阈值持续报警。报警事件同时通过ESP8266推送到MQTT服务器手机上收到消息。有一个问题必须提前想好远程端网络断开了报警还灵不灵正确答案是本地报警必须任何时候都生效远程推送只是锦上添花。所以逻辑写成“检测到事件-本地声光报警-尝试网络推送”顺序不能反。仓库安防的本体是现场的响应能力不是手机上那条通知。4. 远程通道选型与数据协议设计ESP8266 MQTT 怎么搭才稳远程监测是本系统的灵魂这部分的方案选型一度让我纠结了很久最后定了ESP8266MQTT。先说为什么不用蓝牙BLE通信距离在仓库场景下太短穿墙之后基本废了。为什么不用GSM模块比如SIM800C资费问题、信号问题、还要备用卡毕设阶段没必要引入这种可变因素。ESP8266模块十几块钱WiFi覆盖率在校园里几乎百分百做局域网远程够了加一个云平台比如巴法云、OneNET就能实现互联网远程。4.1 ESP8266与STM32的通信协议STM32和ESP8266之间走串口AT指令通信波特率115200ESP8266默认是115200有些模块出厂是9600先确认。ESP8266要配成透传模式还是非透传模式我推荐使用非透传自定义帧协议而不是开透传。透传模式看着方便但数据没有任何帧头帧尾和校验一旦WiFi丢包或者串口误码上位机拿到一坨乱数据根本没辙。我设计的帧格式很简单帧头(0xAA) 长度(1字节) 数据负载 校验和 帧尾(0x55)负载里放传感器数据字符串例如TEMP:25.3,HUMI:60,SMOKE:12,FLAME:0,PIR:1STM32发完一帧后等ESP8266返回“OK”收到才发下一帧。这样链路上有基本的状态同步。4.2 MQTT消息设计主题分层是关键MQTT的Topic设计直接决定你扩展性。不要用一个大主题“data”把所有东西都塞进去按设备类型和设备ID分层wh/device01/env -- 环境数据 wh/device01/alarm -- 报警事件 wh/device01/status -- 在线状态遗嘱消息这样手机端APP只需要订阅wh/device01/#就能收到该设备所有消息。报警消息是遗嘱也好、主动推送也好都能区分。云平台你可以用巴法云免费、接入简单或者自己搭一个EMQX服务器。自己搭EMQX要多一台服务器作为毕设演示不划算。巴法云提供一个MQTT Broker地址和主题ESP8266直接连接就行微信小程序端用WebSocket接口同样连到巴法云就能刷出数据。不过这里要提醒一点巴法云是公众MQTT服务没有加密认证Topic名字不要用容易被猜的加个随机串后缀。同时也别指望它做数据持久化历史曲线展示建议自己在本地写个Python脚本订阅消息并存储这也能在答辩的时候展示你的“数据链路”理解。4.3 ESP8266本身是一个“小坑王”给ESP8266供电是个隐蔽的坑。它的峰值电流在发送WiFi数据时能到300mA甚至更高如果直接从STM32的3.3V稳压输出取电一发送数据电压就下坠串口通信立刻乱码。这也就是为什么很多人调试时发现ESP8266单独测试一切正常一接上STM32就疯狂输出垃圾字符。解决方法是ESP8266独立供电。在PCB上把3.3V走线分成两路一路给MCU和传感器一路单独给ESP8266模块两路在AMS1117输出端汇合但经过磁珠或0Ω电阻隔离。同时ESP8266模块旁边加一个470uF的电解电容和0.1uF的陶瓷电容给它“兜底”。串口连接上STM32的TX接ESP8266的RXSTM32的RX接ESP8266的TX如果模块是3.3V电平就直连F103的IO也是3.3V可以直连。别接反了接反的后果是上位机收到全0xFF。5. PCB设计实战从原理图到投板前我踩完的坑都在这这一节是本题的重头戏。智能仓库监测系统包含数字电路、模拟电路、电源和无线模块正好是练习PCB设计的绝佳载体。我用的是嘉立创EDA专业版免费、有海量元器件库、能直接生成Gerber下单对毕设来说完全够用。5.1 原理图设计模块化不要一坨连到底原理图不是连线工具是设计记录。我是按电源模块、主控最小系统、传感器接口、执行器接口、无线通信模块五个模块画的模块之间用网络标签Net Label连接不要用线跨过图纸拉成一团。这样不仅自己看得清评审老师扫一眼就知道你系统设计有条理。电源模块是原理图里最容易被忽略但又是最重要的部分。我用的拓扑是12V DC适配器输入 - 通过接线端子接入 - 一路直通继电器继电器线圈需要12V驱动另一路经MP1584降压模块转5V - AMS1117转3.3V。AMS1117输入输出各接一颗10uF钽电容和0.1uF陶瓷电容这是基本功但很多人漏。主控最小系统除了STM32F103C8T6本身之外最关键的是三颗电容和一颗10kΩ上拉电阻VDD引脚每颗就近放0.1uF去耦电容BOOT0引脚经10kΩ下拉到GND否则可能进不了Flash启动模式芯片跑不起来NRST复位引脚接10kΩ上拉到3.3V并联0.1uF电容到地。这些件每一颗都有存在的理由少了、位置放错了系统就可能概率性死机。STM32F103C8T6是LQFP48封装引脚间距0.5mm新手焊接容易连锡。如果你的焊接经验不足建议用QFN封装的替代型号不过一般不建议换或者直接买一块最小系统板插在PCB上留出排针接口。我个人建议还是直接焊毕竟毕设含PCB指的就是你亲手做板焊接一次LQFP48对你的动手能力提升非常明显不试一次太可惜了。5.2 PCB布局顺序比走线更决定成败拿到板框先别急着布线布局决定了你这个板子好不好走、性能稳不稳。我的布局顺序六步走固定接口件电源端子、传感器排针、ESP8266模块座、OLED排针放在板边方向朝外方便插线和操作。固定电源模块DC-DC和LDO靠近电源输入端子这样电源路径最短压降和纹波最小避免电源走线绕过大半个板子再回来给MCU供电那种走法板子电磁兼容一定不理想。放置主控STM32放在板子中心偏一侧所有IO外设朝向对应的接口方向避免交叉走线。VCAP引脚105对应的1uF电容放在引脚边上这个电容不能省。放置传感器接口MQ-135的引脚是从底部伸出来的注意封装方向要留出足够的空间给传感器本体。MQ-135本体会发热别跟温湿度传感器贴在一起否则DHT22测到的是MQ-135旁边的热空气数据必然偏高。这个坑我实测过温差能到4到5摄氏度。放置执行器件蜂鸣器和继电器放在远离模拟信号传感器的一侧防止电磁干扰影响ADC采样。继电器线圈断电瞬间会产生反向电动势PCB上要给继电器线圈并联一颗1N4007续流二极管注意方向否则可能把MCU旁边电路打挂。ESP8266布置到板边天线区正下方整层掏空不要走任何铜皮和走线否则WiFi信号被PCB铜皮挡住信号强度骤降远程通信会时不时断连排查起来非常头疼。5.3 布线规则电源、地、信号线的优先级布线之前先在规则管理器里把线宽设好信号类型建议线宽说明电源主干线12V、5V40mil以上走电流线宽不够压降大GND铺铜/走线20mil以上回流路径阻抗要低3.3V电源线15~20mil给MCU和传感器供电普通信号线10milIO、UART、I2C差分/高频信号无本系统无高频要求ESP8266走线尽量短布线这个环节我想强调三点第一布线顺序应该是先电源后信号。先把电源和地走完再走信号线最后统一铺地铜。很多人反过来信号线走得七扭八歪之后电源线没地方走了只能绕大圈结果就是电源回路长、压降大、纹波高。第二信号线不要走直角和锐角。直角走线在转角处会形成阻抗突变高速信号下有反射风险生产时酸液也可能在直角根部残留导致细线被蚀刻断。所有转角用45度斜角或者圆弧过渡EDA软件里都有这个设置。第三晶振要放在主控芯片附近晶振下面和周围不要走其他信号线。8MHz晶振给MCU提供时钟时钟线上的噪声会直接耦合进系统导致UART通信偶发乱码。晶振周围放了两个负载电容典型值20pF它们要靠近晶振引脚而不是靠近MCU引脚这是很多参考设计都没画对的地方。5.4 Gerber输出与投板检查投板之前做这几件事能省回来一版DRC检查必须清零。开短路、线距不足、钻孔距离近这些是硬性错误任何一个在生产环节都可能直接报废整板。嘉立创EDA的检查包含孔到线、线到线、孔到板边等规则跑完有红叉就得回去改。检查丝印位号大小。位号文字太小的话打印出来根本看不清。嘉立创EDA里面选中全部位号统一把字高改成60mil大概1.5mm左右就清晰了。这个细节在热搜词里有人专门问“如何批量修改位号尺寸”说明很多人前期被小字折磨过。生成Gerber文件之后用在线查看器预览一遍。只看PCB编辑器里的样子是不算数的因为EDA软件里隐藏了层到Gerber里看到的才是生产实际用的东西。预览时重点看所有层是否对齐、丝印有没有盖在焊盘上丝印压焊盘会导致焊接不良、钻孔文件是否包含所有孔位。确认PCB板厚和铜厚。常规1.6mm板厚、1oz铜厚对这块板是够用的。如果你把电源走线设计得特别细生产的时候就该发现并改粗了不要投板后才发现。5.5 PCB打样回来后的验证清单板子到手第一件事不是插电是先用万用表量一遍电源对地阻抗。3.3V和GND之间正常应该有几百欧姆以上如果用的是成品模块量出来短路的话先检查AMS1117有没有焊反。AMS1117封装是SOT-223引脚顺序是GND脚比输入输出长一截装反的概率极高。接着上电之后用手摸芯片温度。如果发热异常赶紧断电查反向连接。再然后才是烧录程序。调试顺序建议是先点亮电源指示灯 - 初始化OLED显示 - 读DHT22 - 读ADC - 测试UART与ESP8266 - 本地报警输出 - 远程平台联调。一步一步来每一步都有明确验证点出了问题能立刻锁定范围不会出现“整个系统没反应但不知道是哪的问题”。6. 系统联调顺序与常见问题排查表整个系统联调我踩的坑不少把最典型的列出来你可以按表自查。现象一OLED白屏或花屏。九成是I2C地址不对。OLED的I2C地址通常是0x3C但有些模块是0x3D在代码里先扫描一遍地址别硬编码。还有个原因是SCL和SDA接反了这种低级错误我犯过一次补了几秒才反应过来。现象二DHT22读出来永远是0。检查单总线引脚有没有接上拉检查引脚有没有在CubeMX里配成开漏输出模式。开漏输出配合上拉电阻才能实现真正的双向总线协议推挽模式下信号会被拉死。现象三ADC值满量程或者一直跳。MQ-135模块上通常有个电位器调节比较电压如果模块设计成“模拟输出数字输出”两路别接错引脚。模拟输出的电压范围是0到VCC如果读到409512位满量程多半是引脚悬空或者接错线了。另外前一版PCB如果ADC走线挨着继电器线采样值会在继电器动作瞬间跳变这是电磁耦合解决方法是加大走线间距或者加一个RC低通滤波10kΩ加0.1uF截止频率大概160Hz够用。现象四ESP8266发送AT没反应。这个问题先分两部分排查一是串口波特率是不是对的二是模块供电够不够。手头有USB转TTL的话把ESP8266单独接电脑上测试如果单独测试正常但接STM32不正常就是串口电平或者电源问题重点查TX/RX有没有接反、ESP8266电源是不是独立供的。现象五本地报警正常但远程收不到消息。先在PC上用MQTT客户端软件订阅对应主题看有没有消息进来。能收到的话问题在手机端APP收不到的话分段排查ESP8266有没有成功连接路由器连接上巴法云没有巴法云上创建的主题和代码里写的是不是完全一致MQTT是明文传输主题名打个大小写就能把你坑半小时。上面这些问题的共性都是先看硬件再看软件先查物理层再查协议层。很多人一上来就刷固件换代码结果换了半小时发现是杜邦线接触不良或者引脚定义搞错了很浪费时间的。7. 一个能提升答辩含金量的思路本地数据记录远程平台确实能看实时数据和报警但偶尔网络断开那几分钟的数据就丢了。所以我建议在STM32端加一个Flash存储模块或者简单的SD卡记录。STM32F103C8T6内部Flash只有64KB扣掉程序空间剩下的空间虽然不大但用协议组织好的话存几天的关键数据每分钟采样一次温湿度和气体浓度是够的。思路是把数据以固定长度结构体存储包含时间戳、温度、湿度、气体浓度、报警标志。存满一块区域就循环覆盖最旧的一条。如果板子上挂了ESP8266远程端断线重连后把离线期间的数据补传上去。这个设计成本极低但答辩的时候很能体现你的系统设计思维不是“实现了基本功能”而是你考虑到了真实环境中网络不可靠的问题并提出了降级方案。这在本科毕设里算是一个相当不错的加分项。实现方式上用片内Flash模拟EEPROM初始化时预留最后一页1KB做数据区擦除后按地址偏移写入。注意写Flash之前必须整页擦除这是STM32的物理特性只能按“页”操作。8. 走完一版之后我对这个系统的几个复盘点如果再来一遍有些地方我会调整这里写出来给你做个参考。第一MQ-135这个传感器在仓库场景其实不是最优解它更偏“空气质量综合指标”而不是“火灾烟雾检测”。如果你想更贴近“仓库安防”这个主题可以换成真正的光电式烟雾传感器比如MQ-2或者更专业的离子式烟雾报警器模块响应速度和灵敏度完全不在一个级别。但代价是贵一些、代码也要重新调。毕设选题是“安防系统”的话烟雾这块值得投入。第二ESP8266到云平台的接入虽然简单但答辩容易被追问数据安全。哪怕只是演示级系统也建议把Topic命名得看不出业务逻辑同时写一句“实际落地应使用TLS加密和设备认证”在论文的不足与展望部分。这句不是套话是真的会被问到。第三PCB版图上OLED的接口方向与外壳冲突是我在这版最后悔的地方。当时只想着放板边方便插线但没考虑整个装置如果放进有机玻璃外壳里排针朝上的话OLED就没法固定在外壳上。如果你的毕设有外壳设计PCB布局阶段就必须把外壳的结构尺寸拿过来对齐不然后期全是手工改造和热熔胶找补。第四在功耗上也有优化空间。仓库场景如果要对UPS供电或者感应取电整个系统的静态电流可以压到很低把OLED做成10秒刷一次、关掉ESP8266的空闲连接、用STM32的待机模式配合RTC定时唤醒。当时赶进度没做但这是“智能”两个字很值得展开的落点。最后再说一个做整机小技巧把上位机或者微信小程序端的界面截图、调测过程录屏、实物样机照片这三样提前整理到一个文件夹里写论文、答辩PPT和项目展示会用到不要到最后答辩前才到处翻。系统的功能演示流畅度比代码写得漂亮更直观。这套系统做下来嵌入式开发、传感器应用、无线通信、PCB设计这些本科能力点基本上都覆盖了。祝你的板子一版点亮跑完整个调测流程顺利过答辩。如果投板或调测过程中卡住了带着你的具体现象去对应板块找答案通常都能解决别蹲在那硬想。本文还有配套的精品资源点击获取