1. 项目概述
作为一名嵌入式开发工程师,我最近完成了一个基于STM32和OneNET平台的物联网项目实战。这个项目不仅实现了基础的MQTT通信功能,更在数据上报、远程控制、异常处理和多设备协同等方面做了深度优化,达到了工业级应用水平。
在项目开发过程中,我发现很多教程只停留在基础接入层面,对于实际工程中会遇到的数据冗余、连接不稳定、指令安全等问题鲜有涉及。因此,我决定将这次实战经验完整记录下来,希望能帮助更多开发者少走弯路。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件环境搭建
2.1 硬件选型与配置
项目采用了两套STM32F103C8T6最小系统板作为主控,搭配ESP8266-12F WiFi模块实现网络连接。传感器方面选择了:
- DHT11温湿度传感器:用于环境监测
- 光敏电阻:通过ADC采集光照强度
- MQ2烟雾传感器:检测空气质量
外设部分包括LED指示灯和蜂鸣器,用于状态显示和告警提示。特别需要注意的是,ESP8266模块需要独立3.3V电源供电,避免与STM32共用电源导致电流不足。
2.2 网络拓扑设计
系统采用星型网络拓扑结构:
code复制STM32设备1 ↔ ESP8266 ↔ WiFi路由器 ↔ OneNET云平台
STM32设备2 ↔ ESP8266 ↗
这种设计既保证了设备间的独立性,又通过云平台实现了数据共享和协同控制。
3. 软件架构设计
3.1 系统初始化
系统初始化主要包括以下几个部分:
c复制void System_Init(void) {
SystemInit(); // 系统时钟初始化(72MHz)
USART1_Init(); // 串口1(与ESP8266通信)
LED_Init(); // LED初始化
Beep_Init(); // 蜂鸣器初始化
Sensor_Init(); // 传感器初始化
printf("系统初始化完成!\r\n");
}
3.2 数据采集模块
数据采集采用批量采集方式,包含温湿度、光照和烟雾浓度数据:
c复制uint8_t Sensor_Collect(void) {
memset(&sensor_data, 0, sizeof(Sensor_Data_TypeDef));
// 采集温湿度
uint8_t dht11_ret = DHT11_Read(&sensor_data);
if(dht11_ret == 0) {
printf("DHT11采集失败\r\n");
sensor_data.data_valid = 0;
return 0;
}
// 采集光照和烟雾(5次采样取平均)
uint32_t light_sum = 0, smoke_sum = 0;
for(uint8_t i=0; i<5; i++) {
light_sum += ADC_Read_Light();
smoke_sum += ADC_Read_Smoke();
