1. 项目背景与核心功能最近几年智能家居安防系统越来越火特别是用STM32和ESP8266这种性价比超高的方案。我自己做过好几个类似的项目今天就来分享一个完整的实现方案。这个系统不仅能检测环境异常还能自动处理危险情况最重要的是可以通过手机远程控制特别适合毕业设计或者初学者练手。整个系统的核心功能可以分为三大部分首先是环境监测用了DHT11温湿度传感器、MQ-2烟雾传感器、MQ-135有害气体传感器和火焰传感器相当于给家里装了个24小时值班的电子鼻子。我实测下来这些传感器反应都挺快的比如MQ-2检测到烟雾超标大概只要2-3秒。第二是自动控制部分包括继电器控制的风扇、水泵和模拟的天然气阀门。这里有个小技巧继电器最好用光耦隔离的我之前贪便宜用了普通继电器结果STM32的GPIO烧了好几个。最后是联网和手机控制ESP8266-01s虽然个头小但跑MQTT协议完全没问题。我在项目里用的是阿里云的物联网平台免费额度足够用了。手机App我用的是Android Studio开发的界面虽然不华丽但功能都很实用。2. 硬件选型与电路设计2.1 主控芯片选择STM32F103C8T6这个蓝色小开发板大家应该都不陌生江湖人称蓝莓派。我选它主要是因为72MHz主频完全够用64KB Flash和20KB RAM跑这个项目绰绰有余价格只要十几块钱有丰富的GPIO和外设有个坑要注意C8T6的ADC精度只有12位如果对检测精度要求高的话可以考虑用F4系列。不过对我们这个项目来说完全够用了。2.2 传感器模块详解火焰传感器我推荐用远红外型的检测距离可以达到1米左右。接线时要注意加个10KΩ的上拉电阻不然输出信号不稳定。MQ-2和MQ-135这类气体传感器需要预热建议上电后等待1-2分钟再读取数据。人体红外传感器我用的是HC-SR501这个模块有个很实用的功能——可以调节检测距离和延时时间。我一般把延时调到30秒左右这样不会误触发报警。2.3 执行器件连接继电器模块要特别注意驱动电流STM32的GPIO输出电流有限建议用ULN2003这类驱动芯片。水泵我用的是12V的直流微型水泵实测抽水效果还不错。风扇选的是5V的电脑散热风扇噪音小风量足。3. 软件架构设计3.1 主程序流程图整个程序跑在FreeRTOS上我分了三个主要任务传感器数据采集任务优先级最高网络通信任务执行器控制任务void SensorTask(void *pvParameters) { while(1) { readDHT11(); readMQ2(); vTaskDelay(500); } }3.2 MQTT通信实现ESP8266通过AT指令连接WiFi后我用的是Paho MQTT嵌入式客户端库。订阅和发布的主题要规划好比如订阅主题/device/control发布主题/device/status这里有个小技巧MQTT的keepalive时间不要设太短我一般用60秒否则ESP8266容易断连。3.3 报警逻辑处理报警条件判断我放在本地做而不是依赖云端这样响应更快。比如烟雾报警的伪代码if(mq2_value threshold) { turnOnFan(); triggerBuzzer(); sendMQTTAlert(); }4. 手机App开发要点4.1 界面设计我用Android Studio开发了个简单的控制App主要包含环境数据实时显示区阈值设置面板设备控制按钮报警信息通知栏布局文件用ConstraintLayout实现自适应这样在不同尺寸手机上显示效果都不错。4.2 MQTT客户端实现Android端我用的是Eclipse Paho客户端库要注意几点连接要放在子线程收到消息后要用Handler更新UI记得处理网络断开重连MqttAndroidClient client new MqttAndroidClient(context, tcp://broker.hivemq.com:1883, clientId);4.3 居家/离家模式实现这两个模式的逻辑是这样的居家模式开启所有传感器检测离家模式只保留人体红外检测模式切换通过App上的按钮控制状态会保存在STM32的Flash里断电也不会丢失。5. 系统集成与调试5.1 硬件组装技巧所有传感器最好用杜邦线连接方便调试。电源部分要特别注意我建议给STM32和ESP8266单独供电共用电源容易导致WiFi连接不稳定。PCB布局有个经验模拟信号线要远离数字信号线尤其是MQ-2的输出线不然ADC读数会有干扰。5.2 软件调试方法我常用的调试手段用串口打印关键变量值用逻辑分析仪抓取I2C时序用MQTT.fx工具模拟手机端遇到最头疼的问题是ESP8266偶尔会死机后来发现是看门狗没喂好加上硬件看门狗后就稳定多了。5.3 性能优化建议经过实测有几点优化很有效传感器数据采样间隔从1秒改为2秒MQTT消息采用QoS1而不是QoS2把频繁调用的函数加上inline关键字这些改动让系统运行更稳定内存占用也降低了不少。6. 项目扩展方向这个基础框架其实可以扩展很多功能比如增加摄像头模块实现图像监控加入语音识别实现声控对接智能音箱平台我最近正在尝试加入人脸识别功能用OpenMV这个嵌入式视觉模块效果还不错。另外也可以考虑用LoRa替代WiFi适合没有网络覆盖的场景。做这个项目最大的收获是学会了如何平衡功能和性能。刚开始总想加很多酷炫的功能结果系统跑起来各种不稳定。后来明白了一个道理在资源有限的嵌入式系统里做减法比做加法更重要。