
从题目看这是一套比较典型的 STM32 物联网毕业设计/大赛作品组合STM32F103C8T6 做主控ESP01S 负责联网数据上云到 OneNET再用微信小程序或手机 APP 做远程展示同时附带 PCB 设计。这类项目最大价值是“链路完整”传感器采集、单片机处理、Wi-Fi 传输、云平台存储、移动端展示全部打通很适合用来作为毕业设计、电子设计竞赛作品或者嵌入式岗位的面试练手项目。这篇文章先讲清楚整条数据链路怎么走再给出硬件选型、接线、PCB 设计、STM32 固件、ESP01S 联网、OneNET 配置、小程序端开发的完整实操流程最后整理最常见的踩坑点。整体按“先跑通再优化再出板子”的顺序组织。1. 核心能力速览能力项说明系统组成STM32F103C8T6 主控 ESP01S Wi-Fi 模块 OneNET 云平台 微信小程序/APP 端核心功能厨房烟雾/可燃气体浓度检测、温湿度采集、蜂鸣器本地报警、远程数据上报与查看通信方式ESP01S 通过 2.4G Wi-Fi 连接网络使用 MQTT 或 HTTP 方式与 OneNET 平台交互本地报警STM32 驱动蜂鸣器与 LED浓度超过阈值时现场告警云端功能OneNET 设备数据流存储、历史查询、API 接口调用移动端微信小程序或手机 APP 展示实时数据、报警状态、历史曲线PCB 设计原理图绘制、PCB Layout、布局走线、丝印调整、Gerber 导出打样适合人群电子/嵌入式方向的在校生、毕业设计、电子设计大赛、嵌入式求职作品准备硬件门槛常规 STM32 开发板 传感器模块 ESP01S整体成本较低上手难度中等需要掌握 STM32 基础外设、AT 指令、云平台配置和小程序开发从功能划分看这个系统可以拆成感知层、控制层、传输层、平台层和应用层。感知层负责采集厨房里的烟雾、可燃气、温湿度控制层由 STM32 完成数据处理和阈值判断传输层用 ESP01S 把数据送到 OneNET平台层存储和管理设备数据应用层就是手机小程序或 APP。理解这条链路比记具体代码更重要后端换平台、前端换框架都不影响整体设计思路。2. 系统架构与数据链路2.1 整体工作流程系统的数据流可以概括为传感器采集 - STM32 ADC/GPIO 读取 - 本地阈值判断 - 串口 AT 指令交给 ESP01S - Wi-Fi 上报 OneNET - 小程序调用云平台 API 拉取数据 - 手机端展示厨房里的烟雾传感器和可燃气体传感器输出模拟电压信号STM32 通过 ADC 采样把电压值转换成气体浓度对应的数值。DHT11 这类温湿度传感器走单总线协议STM32 用 GPIO 模拟时序读取温湿度。转换后的数据一方面用于本地判断如果超过报警阈值就打开蜂鸣器另一方面通过串口发送给 ESP01S。ESP01S 内部是 ESP8266 芯片出厂一般自带 AT 固件。STM32 通过串口向 ESP01S 发送 AT 指令让模块连接家里的路由器然后建立与 OneNET 平台的网络连接把温度、湿度、烟雾浓度、燃气浓度打包上传。OneNET 收到数据后会按照设备 ID 和数据流名称存储生成实时数据和历史数据。小程序端并不直接和 STM32 通信而是通过 OneNET 开放的 HTTP API 拉取设备最新数据点和历史数据点。这也是物联网项目里比较标准的做法设备只做上报云端做存储和转发应用端从云端取数。好处是设备端不关心 APP 形态以后想换成安卓 APP、网页或者大屏展示只需要在 OneNET 侧接入不需要改单片机代码。2.2 为什么选这套方案先说 STM32F103C8T6。这颗 MCU 是 Cortex-M3 内核主频 72MHzFlash 64KBRAM 20KB片内资源足够跑完这个项目。资料多、学习成本低、性价比高毕业设计答辩和竞赛备赛阶段都容易找到参考代码。用标准库开发就可以了不追求上 RTOS裸机轮询加定时器中断就能实现。ESP01S 是 ESP8266 的最小封裝模块只有 8 个引脚比 NodeMCU 开发板小型化很多适合做成产品形态嵌到自绘 PCB 上。缺点是引脚引出少So GPIO 资源紧张所以本项目只让它干联网一件事。出厂 AT 固件模式下单片机通过串口控制它固件开发工作量最小时更关注系统集成。OneNET 是物联网云平台提供设备接入、数据存储、API 读取。它有比较标准的设备接入流程支持 MQTT 协议也有 HTTP API 可以查询数据流。对教学和竞赛来说OneNET 最友好的地方是控制台能直接看到设备上下线状态和数据点上报记录联调时“有没有上传成功”一目了然。小程序端使用微信开发者工具开发逻辑上只需要封装 OneNET 的 API 请求再把数据渲染到页面上。很多毕设团队不会小程序原生开发其实这部分不复杂核心就是wx.request拉 JSON 数据然后setData更新界面。3. 适用场景与使用边界3.1 适合做什么这类系统比较适合以下场景毕业设计题目名称自然后期可以扩展指纹解锁、火焰识别、继电器控制排风扇等。电子设计竞赛展示链路完整度传感器 MCU 无线 云平台 移动端全都有。嵌入式求职作品能体现 ADC 采集、串口通信、AT 指令解析、物联网协议、前后端联调的综合能力。个人学习把课本里的 GPIO、USART、ADC、定时器串成真实项目。3.2 不适合做什么需要说明的是这套系统是教学和演示级别的安全监测系统不能直接替代国家标准的家用燃气报警器。MQ 系列气体传感器属于半导体式传感器存在预热时间长、温漂、交叉敏感等问题测出来的数值适合做相对浓度变化判断不适合直接当 ppm 精确定量仪器。如果要做真实安全产品需要换电化学传感器或催化燃烧式传感器并对报警阈值做严格标定。3.3 安全与合规边界厨房安全监测涉及燃气、烟雾、用电等场景开发和测试时必须注意以下几点测试烟雾和可燃气体浓度时使用低浓度、短时间、通风良好的环境不要用明火直接烤传感器。传感器需要预热MQ 系列刚上电的前几分钟输出并不稳定代码里要设计启动延时。报警阈值要结合传感器数据手册和实际测试确定不要照搬网上代码里的魔数。如果项目涉及人像、声音、位置等个人信息采集必须获得授权并做脱敏处理。本系统不能作为唯一安全手段提醒用户同步安装合规家用燃气报警器并定期检查。4. 硬件选型与材料清单本章列出一套可以直接照做的硬件清单。元器件采购时注意传感器模块的供电电压有 3.3V 版本和 5V 版本选型时和 STM32 的 ADC 参考电压匹配。4.1 主控与下载器器件型号用途主控 MCUSTM32F103C8T6 最小系统板数据采集、逻辑处理和串口控制下载调试器ST-Link V2程序下载和在线调试USB 转 TTL 模块CH340/CP2102串口日志输出、ESP01S 独立测试STM32F103C8T6 最小系统板价格低、引脚丝印清楚适合前期调试。后期如果画了自绘 PCB可以直接把 STM32F103C8T6 芯片焊在板子上不再使用现成开发板。4.2 传感器模块传感器型号接口类型说明气体浓度传感器MQ-2 / MQ-7 模块模拟输出AO 数字输出DOMQ-2 侧重烟雾和液化气MQ-7 侧重一氧化碳温湿度传感器DHT11 / DHT22单总线DHT11 精度一般但教程多DHT22 精度更好可选火焰传感器红外火焰检测模块数字输出DO检测附近有无明火作为扩展功能MQ 传感器模块上一般自带一个可调电位器用来调整数字输出 DO 的触发阈值。本项目在 STM32 端使用 ADC 读取 AO 引脚这样可以获得连续变化的数据而不是只有 0 和 1。电位器仍然保留可以用于模块级报警阈值预调整。4.3 通信与指示器件ESP01S 模块、蜂鸣器模块、LED、OLED 显示屏属于可选推荐加上 0.96 寸 I2C OLED 显示当前温湿度和气体浓度方便现场调试。OLED 使用 I2C 接口只占用 SCL、SDA 两根引脚代码量也不大。4.4 电源方案器件说明手机充电器 5V/1A 以上给系统供电AMS1117-3.3 稳压模块把 5V 转为 3.3V 给 STM32、ESP01S、OLED 供电100uF 100nF 滤波电容防止 ESP01S 发射瞬间拉低电压ESP01S 在 Wi-Fi 发射时瞬时电流可能接近 200-300mA如果供电能力不足会出现模块反复重启、连接不上路由器的情况。调试时优先使用独立 3.3V 电源给 ESP01S 供电STM32 和 ESP01S 之间加逻辑电平匹配或分压电阻。STM32 的串口 TX 输出 3.3V 高电平大部分 ESP01S 可以直接识别但 ESP01S 的 TX 输出到 STM32 的 RX 也没有问题如果使用的是 5V 单片机的串口必须加电阻分压否则可能烧模块。5. 硬件接线与 PCB 设计要点5.1 面包板阶段接线表先用面包板或杜邦线验证逻辑再接 PCB。下面是一套常用的接线关系STM32F103C8T6 引脚外设引脚说明PA0MQ-2 AOADC 通道采样烟雾/可燃气体浓度PA1MQ-7 AO可选ADC 通道采样 CO 浓度PB5DHT11 DATA单总线数据线需要接 4.7k 上拉PB6I2C1_SCLOLED 时钟线PB7I2C1_SDAOLED 数据线PA2ESP01S RXSTM32 发送数据到 ESP01SPA3ESP01S TXESP01S 发送数据到 STM32PB12蜂鸣器 IN有源蜂鸣器高电平或低电平触发需看模块PB13LED报警指示灯3.3VESP01S VCC/CH_PDCH_PD 使能脚必须拉高注意 ESP01S 的 VCC 要求 3.3V绝对不能接 5V。CH_PD 引脚是芯片使能悬空时模块可能不工作需要接一个 10k 欧姆电阻到 3.3V。5.2 原理图设计PCB 阶段用嘉立创 EDA 或 Altium Designer 画原理图。原理图设计要点电源树要清晰5V 输入 - 保险丝 - 稳压 3.3V - 各负载每个芯片电源引脚就近放 100nF 去耦电容。STM32 的 BOOT0 引脚通过 10k 电阻下拉到 GND保证 Flash 启动BOOT1 可以悬空或用电阻下拉。NRST 复位引脚接 100nF 电容到 GND提高复位可靠性。8MHz 晶振两个负载电容取 20pF 左右并联 1M 欧姆电阻。ESP01S 模块的 TX、RX、VCC、GND、CH_PD 全部引出预留串口测试排针。蜂鸣器如果是有源模块加一个 NPN 三极管驱动继电器等大功率负载需要光耦隔离和续流二极管。5.3 PCB Layout 要点画 PCB 时重点不是好看而是保证信号完整性和电源稳定。下面几个点需要优先处理电源线加宽3.3V 和 GND 走线至少 1mmESP01S 供电走线可以更宽。晶振靠近 STM32 摆放走线尽量短晶振下方不要走其他信号线。MQ 传感器的模拟输出线远离 ESP01S 天线区域避免无线发射干扰 ADC 采样值。顶层大面积铺 GND底层尽量也铺地降低地阻抗。ESP01S 天线区域不要覆铜天线下方挖空否则会影响 Wi-Fi 信号。蜂鸣器、继电器这类感性负载远离传感器避免开关瞬间干扰 ADC。板子面积不大时器件密度不要太高预留测试点3.3V、GND、串口 TX/RX、ADC 输入。完成 Layout 后需要检查 DRC 电气规则确认没有短路、悬空引脚和间距错误。打样前导出 Gerber 文件在嘉立创下单页面预览每一层重点确认顶层丝印没有反字、没有漏字符、板框尺寸正确。PCB 丝印模糊的现象多数是字体太小或者丝印和焊盘重叠把丝印宽度调整为 0.15mm 以上可以改善。6. STM32 固件开发工程搭建与传感器采集6.1 开发环境准备推荐使用 Keil MDK5 加 STM32 标准库。工程搭建步骤安装 Keil MDK5。通过 Keil 的 Pack Installer 安装 STM32F1 系列芯片支持包。下载 STM32F10x 标准外设库复制到工程目录。新建工程选择 STM32F103C8 型号。配置 C/C 宏定义USE_STDPERIPH_DRIVER, STM32F10X_MD。在工程中添加启动文件、系统文件、外设源文件和自己的用户代码。如果电脑上之前装了支持 C51 的 Keil需要注意 Keil C51 和 STM32 的 ARM 编译器是不同工具链。新版 Keil 可以在一个软件里同时管理 C51 和 ARM 两个 Pack安装时勾选对应编译器即可工程切换时不会冲突。6.2 传感器数据采集代码框架系统的核心代码包括系统时钟初始化、GPIO 初始化、ADC 初始化、DHT11 读取、串口初始化、ESP01S 指令发送与解析、主循环逻辑。ADC 采样代码示例/* ADC 初始化PA1 作为模拟输入规则通道采样 */ void ADC1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE); GPIO_InitStructure.GPIO_Pin GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN; GPIO_Init(GPIOA, GPIO_InitStructure); ADC_InitStructure.ADC_Mode ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode DISABLE; ADC_InitStructure.ADC_ContinuousConvMode DISABLE; ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel 1; ADC_Init(ADC1, ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5); ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while (ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while (ADC_GetCalibrationStatus(ADC1)); } /* 读取一次 ADC 转换值 */ uint16_t Read_MQ_Sensor(void) { ADC_SoftwareStartConvCmd(ADC1, ENABLE); while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) RESET); return ADC_GetConversionValue(ADC1); } /* 主循环中换算电压值 */ float gasVoltage 3.3f * Read_MQ_Sensor() / 4096.0f;DHT11 读取部分是典型的单总线时序代码较长核心是先拉低总线至少 18ms 发送起始信号然后释放总线等待响应再按序读取 40 位数据。这里建议使用软件延时计时因为标准库的Delay函数要基于 SysTick 实现。采集完成的温湿度可以直接拼接成上报字符串。6.3 串口发送 ESP01S 指令STM32 通过串口向 ESP01S 发送 AT 指令时需要做一层简单的指令封装。核心思路是发送指令、等待响应、判断是否返回期望关键字。主循环里不能阻塞等待时间太长否则传感器采集会不及时。/* 发送 AT 指令并等待 OK 响应 */ uint8_t ESP_SendCommand(const char *cmd, const char *ack, uint16_t timeout) { char buffer[128]; uint16_t count 0; uint32_t tickStart GetTickMs(); USART_SendString(USART2, cmd); while (GetTickMs() - tickStart timeout) { if (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) ! RESET) { char ch USART_ReceiveData(USART2); if (count sizeof(buffer) - 1) { buffer[count] ch; } } if (count 0) { buffer[count] \0; if (strstr(buffer, ack) ! NULL) { return 1; } } } return 0; }代码里的串口编号和缓冲区大小需要根据实际工程调整。实际使用时建议把“Wi-Fi 连接”“MQTT 连接”作为系统状态机处理而不是死等。否则网络异常时 MCU 会卡在等待循环传感器采集和报警功能都会受影响。7. ESP01S 联网与 AT 指令配置7.1 模块工作模式出厂 AT 固件的 ESP01S 默认工作在 AT 指令模式。先把模块接到 USB 转 TTL 模块上在串口助手里发AT如果返回OK说明模块正常。接着依次配置工作模式、连接路由器、建立与 OneNET 的 TCP 连接。常用 AT 指令序列AT ATCWMODE1 ATCWJAP路由器SSID,路由器密码 ATCIPSTARTTCP,183.230.40.39,80 ATCIPSEND第一行测试模块是否响应第二行设置 Station 模式第三行连接家里的 2.4G Wi-Fi第四行建立到 OneNET 平台的 TCP 连接第五行进入透传模式后面直接发送数据内容发送完发退出透传。注意 OneNET 的服务器地址和端口以新版控制台获取的接入信息为准不同区域接入点可能不同。为了避免教程过期最稳妥的方式是在 OneNET 产品详情页里查“设备接入”信息把 IP、端口、设备 ID、鉴权信息抄下来再填到配置里。7.2 上报数据内容OneNET 支持多种接入协议。用 HTTP 方式上报时请求内容里通常要包含 APIKey、设备 ID 和数据流信息用 MQTT 方式时需要把设备鉴权信息填在连接参数里发布到指定 topic。上报数据的格式一般是 JSON{ temp: 25.5, humi: 60, smoke: 720, gas: 310, alarm: 1 }这个 payload 里的键名需要和 OneNET 控制台里创建的数据流名称对应。比如创建了数据流temp、humi、smoke那么 JSON 里也要用相同的键名平台才能正确解析。如果数据流名称对不上平台显示“最新数据”时会是空值。7.3 ESP8266 连接 OneNET 失败的常见原因热词里很多人搜“esp8266连接onenet失败”这是这个项目里最经典的坑。失败原因基本集中在以下几个方面失败现象主要原因AT 返回乱码串口波特率不对ESP01S 常见 115200 或 9600ATCWJAP 返回 ERROR路由器 SSID 或密码错误、2.4G/5G 频段选择问题能连路由器但 CIPSTART 失败OneNET 接入地址端口填错或网络到服务器不通透传模式下发送无响应没有先拼接完整 HTTP 报文或者发送长度和内容不匹配连接成功但云端看不到数据APIKey 错误、设备 ID 不匹配、数据流名称不一致、JSON 格式错误排查时建议分层测试先测试 AT 指令再测试路由器连接再用电脑网络 ping 一下 OneNET 地址能不能通最后才联调数据上报。把问题卡在某一层效率会高很多。8. OneNET 云平台产品与设备配置8.1 创建产品和设备OneNET 控制台可能在不同版本之间变化但核心流程是一致的注册并登录 OneNET 开发者账号。进入控制台选择“多协议接入”或“设备接入”。创建产品选择接入协议MQTT 或 HTTP。在产品下添加设备设备标识符和鉴权信息要自己保存好。生成或复制 APIKey记录产品 ID、设备 ID。热词里有“onenet生成apikey”指的是在控制台访问管理或产品管理页面拿到 APIKey。这个 Key 相当于访问设备的钥匙小程序端调用 API 查数据时需要把它放进请求头里。APIKey 泄露后别人可以读取或控制设备所以代码里不要写死明文至少放到配置文件或环境变量里。8.2 创建数据流在设备详情页为每个需要上报的物理量创建一个数据流名称建议直接使用英文temp、humi、smoke、gas。数据流的数据类型设置为浮点数或整数具体看传感器输出。数据流创建完成后设备上报对应的 JSON 数据时OneNET 会自动把键名和值对应到数据流。8.3 查看上报结果设备上报成功后在 OneNET 设备详情页可以看到“最新数据点”和“历史数据点”。同时可以在接入日志或调试工具里查看设备连接时间、断开时间、最近消息详情。这步非常关键。很多同学发完数据就在小程序端折腾但小程序显示不出来最后查出来是设备端根本没上报成功。建议严格按顺序验证先用 OneNET 控制台作为数据终点看到数据点之后再开始写小程序。9. 微信小程序与 APP 端数据展示9.1 小程序页面结构小程序端不需要自己搭建服务器直接调用 OneNET 对外开放的 API。页面建议分成三个 tab首页实时数据、历史曲线、设备信息。首页实时数据区域展示当前温度、湿度、烟雾浓度、燃气浓度和报警状态。数据通过接口获取后用setData更新界面。历史曲线可以借助小程序端的ec-canvas组件绘制折线图数据源取 OneNET 返回的时间序列。9.2 调用 OneNET APIOneNET 的云端 HTTP API 一般长这样但具体域名、路径、请求头需要根据当前控制台版本填写wx.request({ url: https://api.iot.10086.cn/v5/device/datapoints, method: GET, header: { Authorization: apikey apiKey, Content-Type: application/json }, data: { device_id: deviceId, datastream_id: temp, limit: 50 }, success(res) { console.log(当前温度数据, res.data); } });以上代码是通用调用示例OneNET 老版本和新版本的域名、鉴权头字段可能有差异要以实际控制台 API 文档为准。如果返回 401说明 APIKey 不对返回 404说明设备 ID 或数据流名称不对返回 200 但没有数据说明设备端还没有成功上报过。9.3 定时刷新与报警推送小程序端每隔几秒轮询一次接口即可轮询间隔不要太短否则会触发平台频率限制。报警推送功能如果依赖微信订阅消息需要在小程序后台申请模板并让用户订阅订阅消息不是无条件推送的。如果只是毕设展示用页面内红色报警状态 震动提示就足够了。如果要把它做成 APP可以继续用 DCloud 的 uni-app 或原生安卓本质上都是走同一个 HTTP API。云平台选 OneNET、阿里云 IoT、腾讯云 IoT 核心都是类似逻辑更换平台时只需要改设备接入地址和数据上报封装。10. 联调测试与效果验证10.1 分模块测试顺序不要一上来就全部连接在一起跑容易分不清是哪个环节出问题。建议按以下顺序做测试单独测试传感器读取 ADC 值或 DHT11 数据看数值是否随环境变化。单独测试 STM32 串口输出只打印传感器数据确认 MCU 逻辑正常。单独测试 ESP01S用 USB 转 TTL 连接模块手动发 AT 指令确认模块能连路由器、能连 OneNET。STM32 ESP01S 联调上电后观察串口日志确认 AT 指令逐条执行成功。STM32 ESP01S OneNET开机后查看 OneNET 设备是否上线、数据点是否入库。接入小程序查看页面能否拉取云端数据。这样每做一步都有明确验证结果出了问题也能快速定位在哪一层。10.2 判断测试成功标准测试项目预期现象通过标准传感器采集串口打印电压值和换算浓度数值稳定随外部环境变化本地报警浓度超过阈值时蜂鸣器响响、停逻辑正确阈值可调ESP01S 连接串口日志回显 OK、CONNECT模块状态从“未连接”变为“在线”数据上报OneNET 控制台出现最新数据点数据流名称和数值正确小程序显示首页出现当前温湿度和浓度数据与云端一致刷新正常断电恢复重新上电后系统自恢复不需要人工干预即可自动连接10.3 测试环境准备测试厨房安全场景时不要在未通风的小房间进行推荐使用打火机气体短暂喷向传感器观察数值上升后立刻移开同时打开门窗通风。如果有人体红外、火焰等扩展传感器测试时保持安全距离避免触发误报或损坏传感器。整个测试时间不宜过长MQ 系列传感器长时间接触高浓度气体容易加速老化。11. 常见问题与排查方法问题现象可能原因排查方式解决方案Keil 下载程序时提示No STM32 Target FoundST-Link 驱动异常、接线错误、目标板供电不足检查 ST-Link 是否识别、SWDIO/SWCLK 是否反接重新装驱动检查 SWD 接线按住复位键重新下载编译报错找不到芯片头文件未安装 STM32F1 系列 Pack 或宏定义错误查看 Pack Installer 是否安装了 F1 支持包升级 Keil 并安装 STM32F1 系列器件包Windows 设备管理器 STM32 Virtual COM 端口带黄色叹号串口驱动未安装或驱动版本不匹配查看设备管理器中是否是未知设备安装对应 USB 转串口驱动并重插 USB串口打印乱码波特率不匹配确认代码初始化和串口助手波特率一致统一改为 115200 或 9600ESP01S 不工作、指示灯不亮供电不足、CH_PD 未拉高测量 VCC 电压检查 EN 引脚使用独立 3.3V 电源CH_PD 接 10k 到 3.3VESP01S 连不上路由器2.4G/5G 频段不匹配、密码错误先用手机热点或串口测试 ATCWJAP确保路由器开启 2.4G SSID检查密码格式OneNET 平台看不到数据点APIKey 错误、设备 ID 不匹配、JSON 键名不一致在设备日志里查看最近上报记录核对鉴权信息和数据流名称按平台格式重新上报小程序端拉取数据报 401APIKey 没有放入请求头或 Key 错误打印请求头和返回体检查 Authorization 字段格式传感器数值波动很大供电纹波、天线干扰、传感器预热不足查看波形或串口多次采样取平均增加去耦电容ADC 做中值滤波预热 3-5 分钟后校准蜂鸣器误报阈值设置太低、传感器温漂观察 ADC 基线值启动后读取 10 次取平均作为基线阈值做成偏移量断电重启后模块连不上云ESP01S 启动速度比 STM32 慢上电后加延时再发第一条 AT 指令代码里延时 3-5 秒或增加重试机制PCB 打样后器件装不上去封装方向错误、焊盘间距不对对照数据手册核对封装原理图阶段核对封装打样前 DRC 检查上面表格里没有覆盖所有异常情况但排查思路是一致的先缩小范围到底层硬件、驱动、配置、协议、云平台、应用端中的某一层再单独验证该层不要同时改多个环节。12. 最佳实践与合规提醒12.1 工程管理无论做毕设还是竞赛代码和文档都建议从一开始就分目录管理。推荐目录结构Project/ ├── Doc/ // 原理图、芯片手册、接线说明、答辩文档 ├── Hardware/ // 原理图工程、PCB 工程、Gerber 文件 ├── Firmware/ // Keil 工程源码 ├── App/ // 微信小程序源码 └── Test/ // 串口调试脚本、测试报告模型文件、日志、输出文件不要和源码混在一起。做到这一步不仅自己调试省时间答辩时评委看工程目录也会觉得结构清晰。12.2 代码健壮性建议所有 AT 指令等待超时都要有超时处理不能让 MCU 死等。WiFi 连接状态要进入状态机断线后自动重连。传感器数据上报前先做简单滤波比如连续采样 5 次去掉最大最小值再取平均。报警阈值做成变量支持串口指令或配置文件方式修改。设备端代码增加软件看门狗防止死机后无法自恢复。12.3 合规与隐私提醒本项目涉及厨房环境监测如果后续接入真实家用场景需要注意燃气、烟雾报警器属于安全防护类设备正式使用前需要经过标定和测试不能直接拿 DIY 电路作为家庭唯一安全措施。云平台账号、APIKey、设备 ID 不要上传到公开代码仓库发布教程时用占位符替换。如果系统远程采集家庭环境数据需要明确告知用户数据用途并做好访问权限控制。任何涉及人脸、声音、个人生物特征的功能必须获得明确授权并符合当地法规本项目不包含这些功能不需要解决该问题。不要在厨房燃气管道附近进行带电测试和改装避免产生明火或火花。12.4 竞赛和答辩展示技巧毕设和竞赛评审时评委最常问的是“为什么选这套方案”和“遇到什么坑”。建议准备一张系统框图把数据链路画清楚再准备一个 1 分钟现场演示脚本流程是上电 - 传感器采集 - 温度湿度变化 - 气体浓度上升 - 蜂鸣器报警 - 小程序看到报警状态。这个流程能直观证明整个系统是通的。13. 总结与下一步这套基于 STM32 ESP01S OneNET 微信小程序的厨房安全监测系统最值得尝试的地方是它把嵌入式、通信、云平台、移动端四大模块串成了一条完整链路。项目难度适中硬件成本低逻辑清晰非常适合作为毕业设计或者竞赛项目起步框架。建议先按照面包板方案把整条链路跑通再画 PCB、再扩展功能顺序不要颠倒。最容易踩的坑基本集中在两个地方一个是 ESP01S 的供电和 AT 指令联调另一个是 OneNET 数据流名称和上报 JSON 键名不一致导致云平台收不到数据。先把这两个点打通项目基本就完成了一半。后续可以继续扩展的方向不少将 MQ-2 换成带温湿度补偿的数字气体传感器提升精度增加 OLED 本地显示和按键阈值设置接入 ESP32-C3 实现 WiFi BLE 双模把 OneNET 换成 MQTT Broker 自建私有化平台在小程序端增加历史曲线和微信报警推送。这些扩展都能在现有架构上平滑叠加不影响主控逻辑和数据链路。如果正在准备毕设或电子设计大赛建议以“能运行、能演示、能说清原理、有 PCB 实物”为目标而不是追求功能堆砌。把基础链路做扎实比挂一堆跑不动的外设模块更有说服力。