从零构建智能家居监控系统STM32与微信小程序的云端联动实战清晨醒来时卧室的窗帘自动拉开空调根据室内温湿度调节到舒适模式咖啡机开始工作——这样的智能家居场景已不再遥远。本文将带您亲手搭建一个具备温湿度监测与远程控制功能的智能家居原型系统使用STM32作为核心控制器通过OneNet云平台实现数据上传与指令下发并开发专属微信小程序作为交互终端。无论您是硬件爱好者、物联网开发者还是希望快速验证创意的产品经理这套低成本、高灵活性的解决方案都能为您打开智能家居开发的大门。1. 系统架构设计与核心组件选型一套完整的智能家居监控系统需要硬件终端、云端平台和用户交互界面三部分协同工作。我们选择的方案组合是硬件层STM32F103C8T6开发板性价比高资源丰富 DHT11温湿度传感器精度±2℃/±5%RH 0.96寸OLED显示屏本地数据显示 SG90舵机模拟门锁控制 有源蜂鸣器报警提示通信层ESP8266 WiFi模块AT指令固件版本1.6.2以上负责设备与云端通信云平台中国移动OneNet物联网开放平台免费基础服务支持HTTP/HTTPS协议用户界面微信小程序无需安装跨平台使用系统工作流程如下图所示[传感器数据] → [STM32处理] → [ESP8266上传] → [OneNet云端] ←→ [微信小程序] ↑____________本地显示___________| ↑______远程控制指令______|关键性能指标对比组件型号关键参数成本MCUSTM32F103C8T672MHz Cortex-M3, 64KB Flash15-25WiFi模块ESP8266-01S802.11 b/g/n, 支持STA/AP模式10-15温湿度传感器DHT11测量范围20-90%RH, 0-50℃5-8显示模块SSD1306 OLED128x64分辨率, I2C接口12-182. 硬件搭建与固件开发2.1 硬件连接与初始化按照以下引脚连接方案组装硬件DHT11DATA→PA1VCC→3.3VGND→GNDOLEDSCL→PB6SDA→PB7VCC→3.3VESP8266TX→PA3RX→PA2VCC→3.3V舵机信号线→PC13VCC→5V蜂鸣器IO→PB12VCC→3.3V使用STM32CubeMX生成基础工程时需要配置USART2用于ESP8266通信115200bpsI2C1用于OLED显示ADC1_IN1用于DHT11数据采集TIM3 Channel4生成PWM控制舵机注意ESP8266模块需要单独供电时确保与STM32共地。舵机工作电流较大建议使用外部5V电源。2.2 关键驱动实现温湿度采集代码示例基于DHT11#define DHT11_PIN GPIO_PIN_1 #define DHT11_PORT GPIOA void DHT11_Start(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; GPIO_InitStruct.Pin DHT11_PIN; GPIO_InitStruct.Mode GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(DHT11_PORT, GPIO_InitStruct); HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_RESET); HAL_Delay(18); HAL_GPIO_WritePin(DHT11_PORT, DHT11_PIN, GPIO_PIN_SET); delay_us(30); GPIO_InitStruct.Mode GPIO_MODE_INPUT; HAL_GPIO_Init(DHT11_PORT, GPIO_InitStruct); } uint8_t DHT11_ReadByte(void) { uint8_t data 0; for(int i0; i8; i) { while(HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) GPIO_PIN_RESET); delay_us(40); if(HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) GPIO_PIN_SET) { data | (1 (7-i)); while(HAL_GPIO_ReadPin(DHT11_PORT, DHT11_PIN) GPIO_PIN_SET); } } return data; }OneNet数据上传函数实现void OneNet_UploadData(float temp, float humi) { char cmd[256]; sprintf(cmd, ATCIPSTART\TCP\,\api.heclouds.com\,80\r\n); ESP8266_SendCmd(cmd); char http_data[128]; sprintf(http_data, {\temperature\:%.1f,\humidity\:%.1f}, temp, humi); sprintf(cmd, POST /devices/%s/datapoints?type3 HTTP/1.1\r\n api-key: %s\r\n Host: api.heclouds.com\r\n Content-Length: %d\r\n\r\n %s, DEVICE_ID, API_KEY, strlen(http_data), http_data); sprintf(cmd, ATCIPSEND%d\r\n, strlen(cmd)); ESP8266_SendCmd(cmd); ESP8266_SendData(http_data); }3. OneNet平台配置与数据流管理3.1 设备接入配置在OneNet控制台完成以下关键步骤创建新产品选择HTTP协议数据格式为JSON添加设备并记录设备ID和API Key在数据流模板中定义两个数据点temperature单位℃humidity单位%RH在触发器设置中添加温湿度报警规则如温度30℃触发报警平台关键接口说明接口类型URL格式请求方法说明数据上传/devices/{device_id}/datapointsPOST类型3表示JSON格式命令下发/cmds?device_id{device_id}POST需要设备主动查询数据查询/devices/{device_id}/datastreamsGET可获取历史数据3.2 命令下发处理机制STM32端需要定期查询云端命令建议间隔5秒void OneNet_GetCmd(void) { char cmd[128]; sprintf(cmd, ATCIPSTART\TCP\,\api.heclouds.com\,80\r\n); ESP8266_SendCmd(cmd); sprintf(cmd, GET /cmds?device_id%s HTTP/1.1\r\n api-key: %s\r\n Host: api.heclouds.com\r\n\r\n, DEVICE_ID, API_KEY); sprintf(cmd, ATCIPSEND%d\r\n, strlen(cmd)); ESP8266_SendCmd(cmd); // 解析返回数据中的cmd内容 if(收到新命令) { if(strstr(cmd, open_door)) { Servo_Control(90); // 舵机转到开门位置 } else if(strstr(cmd, close_door)) { Servo_Control(0); // 舵机转到关门位置 } // 确认命令已执行 OneNet_CmdResp(cmd_received); } }4. 微信小程序开发实战4.1 开发环境准备注册微信小程序账号需要未绑定过微信公众平台的邮箱在「开发」→「开发设置」中添加服务器域名https://api.heclouds.comhttps://wx.qlogo.cn下载开发者工具建议稳定版项目目录结构说明miniprogram ├── app.js // 小程序逻辑 ├── app.json // 全局配置 ├── pages │ └── index │ ├── index.js // 页面逻辑 │ ├── index.json // 页面配置 │ ├── index.wxml // 页面结构 │ └── index.wxss // 页面样式 └── project.config.json // 项目配置4.2 核心功能实现页面布局文件index.wxml关键代码view classcontainer view classcard text classtitle当前环境/text view classdata-row text温度: {{temperature}} ℃/text text湿度: {{humidity}} %/text /view canvas canvas-idenvChart classchart/canvas /view view classcard text classtitle门锁控制/text button bindtapopenDoor typeprimary开门/button button bindtapcloseDoor typewarn关门/button /view /view数据交互逻辑index.jsPage({ data: { temperature: 0, humidity: 0 }, onLoad() { this.getDeviceData(); setInterval(() { this.getDeviceData(); }, 5000); }, getDeviceData() { wx.request({ url: https://api.heclouds.com/devices/your_device_id/datastreams, header: { api-key: your_api_key }, success: (res) { this.setData({ temperature: res.data.data.find(i i.id temperature).current_value, humidity: res.data.data.find(i i.id humidity).current_value }); } }); }, openDoor() { wx.request({ url: https://api.heclouds.com/cmds?device_idyour_device_id, method: POST, header: { api-key: your_api_key, Content-Type: text/plain }, data: open_door, success: () { wx.showToast({ title: 开门指令已发送 }); } }); } });5. 系统优化与功能扩展5.1 性能提升技巧数据上传优化采用差分上传策略当温湿度变化超过阈值如±0.5℃或±2%RH时才上传本地缓存STM32端存储最近24小时数据支持断网续传功耗控制使用STM32的Stop模式通过ESP8266的GPIO唤醒5.2 功能扩展方向多传感器集成添加MQ-2烟雾传感器实现安防监控接入PIR人体红外传感器检测室内活动语音控制通过小程序语音识别接口扩展语音指令对接智能音箱平台需额外开发技能数据分析利用OneNet的数据可视化工具生成日报设置自动化场景规则如湿度70%自动开启除湿器硬件扩展接口参考传感器类型接口协议典型应用场景光照强度I2C (BH1750)智能灯光控制空气质量UART (SGP30)新风系统联动水浸检测GPIO数字输入漏水报警实际部署中发现采用模块化设计可以大幅提高系统可维护性。例如将传感器采集、网络通信、设备控制等功能分离为独立任务通过消息队列进行交互。当需要更换温湿度传感器型号时只需修改采集模块而无需调整整体架构。