资讯详情

基于STM32与机智云的智慧厨房环境监测与报警系统设计

📅 2026/9/13 13:07:28 | 华诺云谱 👁 阅读
基于STM32与机智云的智慧厨房环境监测与报警系统设计
简介基于STM32F103C8T6的智慧厨房系统完整工程面向嵌入式初学者、毕业设计、课程设计及工程实训人群也可作为初期项目立项参考。系统采集烟雾、火焰、一氧化碳、煤气等多路气体传感器数据经ESP8266模块上传至机智云平台用户可通过手机APP远程查看数据并自由设置报警阈值及报警开关适用于厨房燃气泄漏、火灾隐患等场景的实时监测。压缩包共114个文件以46个.h头文件与42个.c源文件为主配合8个启动汇编文件、Keil工程配置、hex固件及引脚接线说明整体仅507KB轻量易部署。压缩包内含完整工程目录与各模块接线定义覆盖多通道ADC采集、I2C驱动OLED、串口与ESP8266通信等关键代码代码注释清晰可直接烧录验证或二次开发。目前已有209人学习对希望快速上手STM32物联网云平台开发的读者有较高参考价值。1. 智慧厨房系统用stm32加机智云到底先解决什么问题厨房环境监测和燃气报警这类项目真正难的不是把传感器数据读出来而是三件事数据怎么稳定上传、报警阈值怎么随时调整、报警功能怎么在误报和漏报之间取平衡。基于stm32实现的智慧厨房系统选型思路就是把主控、感知、平台、APP四个环节拆开用stm32做本地逻辑管理用机智云做设备接入和数据中转手机APP只看结果和下发指令。这个方案对于熟悉stm32但不想自己折腾服务器和APP开发的人来说最实用毕业设计、比赛作品和小型产品原型都能套用。阈值设置、报警开关这类功能本质上不是stm32主动做的而是云端把APP下发的数据点写进设备端由stm32的协议解析层接收后写入本地变量再参与报警判断。本文按硬件接线、平台数据点建模、stm32上报和回调、ESP8266联调、APP验证这条完整链路展开重点写清楚哪里容易掉线、哪里数据对不上。2. 基于stm32的智慧厨房设备端架构以及数据点在机智云上的建模2.1 主控与外设选型为什么是stm32而不是ESP8266直连传感器常见的低成本做法是直接用ESP8266接传感器代码少、链路短但有两个问题一是ESP8266的ADC只有1路接完烟雾传感器就没法同时接火焰、温度和湿度传感器二是它的GPIO驱动能力弱直接驱动蜂鸣器和风扇需要加三极管逻辑一旦复杂代码维护起来很吃力。基于stm32实现的智慧厨房系统通常选用STM32F103C8T6作为主控它有3个ADC、最多10个通道PA0到PA7、PB0和PB1都可以做模拟输入3路UART可以分别给ESP8266、调试串口和传感器预留。资源上完全够用价格在8到12元之间开发资料也最全。传感器配置方面常用组合是MQ-2烟雾传感器加DS18B20温度传感器有条件的再加一个火焰传感器。MQ-2输出两种信号AO是模拟电压和可燃气体浓度成正比接到stm32的ADC引脚DO是数字信号超过电位器设定的浓度后输出低电平可以当备用报警触发源。DS18B20走单总线协议只需要一个GPIO口而且支持多点挂载厨房里测环境温度和燃气管道表面温度可以挂两个。继电器模块用于控制排风扇或电磁阀stm32的GPIO输出高电平控制继电器通断注意继电器线圈需要外部供电不要直接从stm32的3.3V引脚取电。2.1.1 stm32与ESP8266的UART连接要点ESP8266在智慧厨房系统里只承担网络透传职责stm32把数据通过串口发给它它再通过TCP长连接上报到机智云。接线固定为stm32的PA2USART2_TX接ESP8266的RXDPA3USART2_RX接ESP8266的TXDGND必须共地。这里常见的坑是ESP8266模块的工作电流峰值接近300mA如果直接从stm32开发板的3.3V引脚取电WiFi发射瞬间会把电压拉低到2.8V以下导致模块反复重启。正确做法是单独用一颗AMS1117-3.3从5V降压给ESP8266供电stm32和ESP8266之间只连TX、RX、GND三根线。另一路USART1的PA9、PA10接USB转TTL用于打印调试日志。2.2 机智云数据点定义从传感器采集值到APP可读对象的基础机智云平台的核心概念是“数据点”。数据点定义了设备和APP之间传输数据的格式stm32端代码里的变量、ESP8266上报的JSON字段、手机APP界面上显示的控件都围绕数据点展开。定义数据点时要先想清楚哪些数据是只读的哪些必须是可写的。以智慧厨房系统为例需要建立的数据点如下表格所示数据点标识名名称数据类型读写属性取值范围说明temp环境温度数值型只读-20 到 80单位摄氏度上报当前温度smoke烟雾浓度数值型只读0 到 4095原始ADC值或换算后的电压值temp_alarm温度报警阈值数值型可写30 到 70手机APP设置的温度上限smoke_alarm烟雾报警阈值数值型可写100 到 4000手机APP设置的烟雾浓度上限alarm_enable报警开关布尔型可写0 或 10关闭报警1开启报警alarm_status报警状态布尔型只读0 或 1stm32本地判断后上报可写的数据点会在APP界面上自动生成输入控件数值型对应输入框或滑动条布尔型对应开关。这里有一个容易搞混的概念阈值和开关虽然由APP下发但判断逻辑必须做在stm32端。原因很简单如果依赖云端判断报警条件网络一断报警就失效了智慧厨房就失去了最核心的安全保障。stm32本地先把阈值存进变量每轮采集数据后与阈值比较达到条件立即驱动蜂鸣器和继电器同时把报警状态上报。2.3 stm32工程代码结构采集、滤波、报警、上报四个模块划分基于stm32和机智云的工程代码我习惯按功能拆成四个文件sensor.c负责ADC采集和DS18B20读取filter.c做滑动平均滤波alarm.c做阈值判断和继电器控制gizwits_app.c处理与机智云的数据交互。main函数只做初始化和循环调度。// main.c 伪代码 int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); MX_USART2_UART_Init(); ADC_Init(); DS18B20_Init(); Gizwits_Init(); while (1) { Read_Temp(); // 读取温度 Read_Smoke(); // 读取烟雾ADC值 Filter_Data(); // 滑动平均滤波 Check_Alarm(); // 判断是否报警 Gizwits_Handle(); // 处理协议收发 HAL_Delay(100); } }代码逻辑说明主循环每100ms执行一次采集和处理上报不在这里直接做而是在Gizwits_Handle里根据数据变化决定是否触发上报。这样设计有三个好处一是CPU占用低stm32F103在72MHz主频下跑这套逻辑占用不到20%二是ADC采样有足够的建立时间采集值更稳定三是在处理函数里可以统一处理云端下发的指令。参数说明USART2的波特率建议固定9600这是ESP8266与stm32通信最常见的速率USART1用115200方便快速看日志。3. stm32传感器数据采集和第二层报警逻辑3.1 MQ-2烟雾传感器ADC采集与温度读取的代码实现在基于stm32的智慧厨房系统里传感器数据的准确性直接影响报警体验。MQ-2属于半导体气敏传感器加热电阻需要预热刚上电的30秒内输出值会虚高代码上要做两件事上电后跳过前20个采样点以及后续每次采集中做多次采样取平均。uint16_t Read_Smoke(void) { uint32_t sum 0; for (uint8_t i 0; i 16; i) { sum HAL_ADC_GetValue(hadc1); // 每100us读一次ADC HAL_Delay(2); } return sum / 16; }代码逻辑说明ADC1的通道0对应PA0引脚连续采样16次取平均可以有效滤除瞬时干扰。MQ-2上电后加热需要时间因此主循环里使用了状态机前20个采样周期只推进状态不更新上报值。注意MQ-2的ADC输出范围是0到3.3V对应0到4095但不同批次的传感器在纯净空气中的基线电压不同常见范围在0.3V到0.8V之间换算成ADC值在372到993之间波动。如果发现上电之后烟雾浓度一直显示400以上可以先看基线的实际值再决定是否需要在代码里减掉一个偏移量。DS18B20温度读取采用单总线协议时序要求严格建议直接使用现成的延时函数驱动。读取过程分为初始化、跳过ROM、启动温度转换、读取暂存器四个步骤实测精度在正负0.5摄氏度以内完全满足厨房环境监测需求。3.1.1 采样值到浓度的换算方式要不要把ADC值换算成真实的ppm浓度取决于你上报到机智云的数据点类型。如果smoke数据点用的是数值型直接上报0到4095的原始ADC值即可APP端把阈值范围也设成100到4000两端都用原始值就不用做拟合。因为MQ-2的浓度曲线是非线性的手册上给的ppm对照表在项目里很难校准。简单可靠的方案是把ADC原始值当作“烟雾强度指示值”阈值设置为经验值1800左右。这个值在传感器距离燃气灶30厘米、正常通风时不会触发而用打火机不点火只放气测试时会超过2500有明确区分度。3.2 stm32本地报警阈值判断与继电器控制报警逻辑要放在stm32上的根本原因是响应速度云端判断需要经过采集、上报、云端处理、下发回控的全链路至少1秒以上本地判断可以在毫秒级完成。代码里用两个变量存储APP下发的阈值当温度或烟雾超过阈值且报警开关开启时置位报警标志同时操作蜂鸣器、继电器和LED。void Check_Alarm(void) { if (alarm_enable 1) { if (temp temp_alarm) { alarm_status 1; HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(FAN_GPIO_Port, FAN_Pin, GPIO_PIN_SET); } else if (smoke smoke_alarm) { alarm_status 1; HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(FAN_GPIO_Port, FAN_Pin, GPIO_PIN_SET); } else { alarm_status 0; HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(FAN_GPIO_Port, FAN_Pin, GPIO_PIN_RESET); } } else { alarm_status 0; HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(FAN_GPIO_Port, FAN_Pin, GPIO_PIN_RESET); } }代码逻辑说明HAL_GPIO_WritePin的三个参数分别是指定GPIO端口、指定引脚编号、设置高或低电平。蜂鸣器和继电器都是低电平触发所以报警时写GPIO_PIN_RESET。注意报警判断不要用if和else if串行判断温度和烟雾两个条件因为如果温度超过阈值处理了温度分支烟雾即使也超标也不会再检查这样烟雾报警会被温度报警覆盖。我用两个独立if语句分别判断只要任一超标就报警除非两个条件都不是超标才进入复位分支。3.3 数据点状态管理与上报JSON封装基于stm32工程接入机智云上报的本质是把数据点的当前值按平台协议封装成JSON通过串口发给ESP8266ESP8266再通过TCP长连接发到云端。数据点标识需要与平台上定义完全一致一个字符都不能差否则云端解析不成功现象就是设备在线但APP上控件数值不动。void Gizwits_Report_Data(void) { // 按机智云协议格式封装数据实际开发中直接使用平台自动生成的模板文件 Set_Report_Value(temp, 200); // 向云端上报temp数据点值为200 Set_Report_Value(smoke, smokeRaw); // 向云端上报smoke数据点 Set_Report_Value(alarm_status, alarm_status); // 调用协议栈发送函数将封装好的数据透传给ESP8266 }代码逻辑说明Set_Report_Value是数据点赋值通用函数第一个参数是数据点ID第二个参数是实际值。机智云平台自动生成的代码中会有类似currentDataPoint结构体把温度、烟雾、报警状态分别赋给对应成员再调用上报函数。上报内容包含报警状态很重要APP界面可以实时显示“正在报警”或“正常”的状态。需要特别留意的是数据长度。数值型数据点默认用int型传输温度可以精确到小数点后一位但上报时如果用整数会丢失精度。机智云支持数据点的小数点位数定义如果定的是0位小数上报39和上报39.5在云端解析结果都是39建议小数点位数定义1位代码里赋值时用乘以10的方式传给协议栈。4. 机智云平台配置与ESP8266透传的联调细节4.1 在机智云开发者中心创建产品和数据点进入机智云开发者中心后选择“创建新产品”产品名称填智慧厨房技术方案选择“WiFi/移动网络方案”通信方式选WiFi数据传输协议选“机智云协议”操作系统选择“无OS”或“FreeRTOS”。创建完成后进入产品详情页找到“数据点”菜单逐个添加第2章表格里定义的六个数据点。创建数据点时要注意标识名、数据类型、读写属性的配合。标识名是设备端代码和APP端通用的唯一标识不能修改。读写属性里“可写”表示数据点可以由APP下发指令修改报警阈值和报警开关必须选可写温度和烟雾浓度是设备上报值APP不需要修改选只读。报警状态同理stm32本地判断后上报给APP展示选只读。设备端代码可以从平台“MCU开发”菜单下载选择硬件平台为“STM32F103C8Tx”软件平台为“Keil MDK”或“STM32CubeMX”平台会自动生成一份包含数据点定义、协议处理、串口收发的基础工程。这份工程生成的代码里已经把物联网协议栈封装好了只需要把我们自己写的传感器采集代码集成进去。4.2 ESP8266固件烧录与AT指令透传stm32接入机智云用的ESP8266模块必须烧写机智云的GAgent固件而不是乐鑫官方AT固件。GAgent固件在机智云官网的下载中心可以找到文件名类似“ESP8266_GAgent”按模组型号ESP-01、ESP-12F等选择对应版本。烧录工具用乐鑫官方的FLASH_DOWNLOAD_TOOLS接线为ESP8266的TXD接USB转TTL的RXDRXD接TXDGND共地GPIO0拉低进入下载模式波特率建议115200。烧录成功后用串口助手打开ESP8266对应的串口会看到GAgent的启动日志。关键看两行一行是mac地址另一行是产品Product Key。如果日志里没有出现Product Key说明固件是通用版需要在平台上把设备的MAC地址和Product Key绑定。之后做一次透传测试在串口调试助手里发送模版里的注册包返回success说明ESP8266与云端连接正常。4.2.1 机智云配置是esp8266灯灭了的常见原因“机智云配置是esp8266灯灭了”这一现象出现在模块进入配网状态或固件异常时。ESP8266模块上的红灯是电源指示绿灯是状态指示不同固件版本状态含义不同。遇到灯灭先检查三点第一模块供电是否稳定用手摸一下模块表面温度如果发烫说明3.3V稳压可能已经损坏先换模块第二检查GPIO0是否被外部电路拉低拉低会让模块进入下载模式表现为灯全灭且串口无任何输出第三使用串口工具发送AT测试指令无响应则说明固件损坏需要重新烧录。4.3 stm32上报周期与流量控制的最小参数ESP8266通过TCP长连接与机智云服务器通信上行的数据量直接影响平台的限流策略。建议上报周期设置为3秒一次如果厨房没有人员活动可以拉长到5秒。更省流量的做法是“变化触发上报”温度变化超过0.5摄氏度才上报烟雾浓度变化超过50时才上报报警状态只要改变就立即上报。参数项建议值说明基础上报周期3000ms保证APP显示不过期温度变化触发阈值0.5摄氏度低于此值不上报烟雾浓度变化触发50 ADC值避免抖动导致频繁上报报警状态上报立即报警和解除都要秒级到达串口波特率9600stm32与ESP8266通信稳定型测试阶段先保持3秒周期确认链路稳定后再加变化触发逻辑。频繁上报会消耗机智云平台给的免费流量配额实测3秒周期连续跑8小时大约消耗2到3MB流量控制在这个量级是安全的。上报日志里如果出现ack timeout说明上报频率超过云端处理能力需要拉长周期或增加变化判断。5. 手机APP端报警阈值设置与报警开关的实现路径5.1 基于机智云公版APP改自己的控制页面手机APP的部分有两种做法一是直接使用机智云官方APP“机智云”进行设备绑定和控制不用写一行APP代码二是下载机智云公版APP源码用Android Studio重新打包修改界面。工程实践上建议先两步走联调阶段用官方APP确认数据通路正常再改源码替换成自己的UI。公版APP源码支持扫码绑定设备、在界面上展示数据点。数据点的位置决定展示形式数值型和布尔型的可写数据点会自动生成输入框和开关控件读写属性由平台决定。不过公版APP默认布局比较简陋可以直接打开源码中对应产品的Activity页面找到控件绑定的代码把输入框换成SeekBar这样阈值滑动设置体验更好。5.2 设备配网与绑定流程手机APP要控制基于stm32的智慧厨房设备必须先把设备绑定到账号下。第一步长按stm32上的按键2秒触发ESP8266进入AirLink配网模式第二步手机连接家庭WiFi打开APP点击添加设备输入WiFi密码第三步APP通过广播把WiFi的SSID和密码发给ESP8266ESP8266连接到路由器后上报设备上线APP中会弹出发现设备并完成绑定。stm32在本地通过某个GPIO检测按键长按超过2秒后调用协议栈的配网函数。没有按键时也可以用串口命令触发配网在USART1的串口助手中发送指定格式的指令即可。绑定时手机和ESP8266必须处于同一个WiFi网络下如果ESP8266已经上过网重新上电后会自动连接之前保存的路由器不需要重新配网。5.2.1 手机上看不到设备时的排查步骤依次检查三处。第一ESP8266的绿灯状态如果绿灯不闪说明没有连接WiFi可能是密码错误或路由器信道不支持。第二设备列表页面如果显示设备在线但数据不刷新按下stm32的复位键观察ESP8266是否重新上线。第三确认APP账号所在服务器区域和机智云平台注册时选择的区域一致中国版、国际版账号数据不互通。997错误码的出现代表设备绑定关系异常到平台后台解绑后重新绑定。5.3 数据通路验证从手机设置阈值到stm32串口打印手机上下发阈值和开关之后要验证stm32确实收到了数据可以使用USART1串口打开调试打印功能。在stm32的协议处理回调函数里加上打印语句收到可写数据点后打印其ID和值。// 打印日志的示例代码 printf(recv cmd: temp_alarm%d\r\n, temp_alarm); printf(recv cmd: smoke_alarm%d\r\n, smoke_alarm); printf(recv cmd: alarm_enable%d\r\n, alarm_enable);代码逻辑说明printf经过重定向后从USART1输出用USB转TTL接电脑串口助手查看。手机APP把温度报警阈值调到60摄氏度并保存stm32串口应立即打印一行temp_alarm60说明云端到设备端链路完全打通。如果手机设置了值而串口没有打印说明ESP8266到stm32的USART2链路有问题或者平台数据点的读写属性设置成了只读APP没法下发。这里有个理解上的要点手机APP设置的是“报警阈值”和“是否开启报警”这两个功能在设备端对应的操作完全不同。阈值设置是云端把数值写到stm32的RAM变量中报警开关是置位或清零一个标志位。stm32的报警判断代码每100ms检查一次标志位而不是接收完指令后只判断一次。这样设计才能保证阈值修改后立即生效。6. 给基于stm32的智慧厨房项目收尾的三个调试技巧6.1 数据变化触发上报的完整实现基础上报逻辑是每3秒无条件上报一次这在实际部署中会产生不必要的流量而且APP界面的数值会不停跳动。优化方案是“变化超过死区才上报”尤其针对温度和烟雾这类缓变信号死区设置合理能让上报频率下降60%以上。if (HAL_GetTick() - last_report_time 3000) { if (abs(new_temp - last_temp) 5 || abs(new_smoke - last_smoke) 50 || alarm_status ! last_alarm_status) { Gizwits_Report_Data(); last_temp new_temp; last_smoke new_smoke; last_alarm_status alarm_status; } last_report_time HAL_GetTick(); }代码逻辑说明温度死区设为0.5摄氏度对应代码里乘以10后的5烟雾死区设为50个ADC值报警状态变化始终触发上报。这使得正常无人环境下可能半小时都不需要上报一旦数据变化超过阈值立即上报。6.2 阈值范围校验与APP输入保护可写数据点必须做范围校验。如果APP端或黑客组包发送了一个超过传感器量程的阈值比如温度阈值设为200摄氏度会导致报警永不触发。在stm32收到云端下发数据后立即校验。if (temp_alarm 70) temp_alarm 70; if (temp_alarm 30) temp_alarm 30; if (smoke_alarm 4000) smoke_alarm 4000; if (smoke_alarm 100) smoke_alarm 100;代码逻辑说明这能防止因数据异常导致的静默失效。报警开关的布尔值也要校验非0即1避免误传入2导致判断逻辑混乱。这些代码需要放在协议栈回调函数的最前面先校验再赋值给报警判断变量。6.3 检查ESP8266的在线状态并用状态灯提示测试过程中ESP8266偶发掉线是所有WiFi方案的普遍问题。除了硬件上确保供电稳定软件上应该增加一个看门狗思路stm32和ESP8266通信时如果连续1分钟没有收到ESP8266的反馈就判定为掉线此时控制报警为本地silent模式并让LED快闪提示用户。等恢复通信后立即上报一次完整数据把离线期间累积的报警状态补传。最后在串口日志里抓取ESP8266发送过来的错误码如果是8002之类与云端连接相关的错误码优先后台看产品与设备的校验信息。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。