一、项目概述
本空气净化器项目基于STM32F4系列微控制器,整合多传感器数据采集、环境参数显示、网络通信及执行机构控制等功能,实现智能化空气质量管理。项目采用FreeRTOS实时操作系统进行多任务调度,结合TFT触摸屏实现人机交互,通过ESP8266接入阿里云物联网平台实现远程监控。本文将从硬件架构、软件设计、关键模块配置等方面进行深度解析。
二、硬件系统架构
1. 核心控制器
采用STM32F407ZGT6,基于Cortex-M4内核,168MHz主频,集成FPU和丰富外设资源,满足实时控制需求。
2. 传感器模块
- SGP30:I2C接口,检测CO₂和TVOC浓度
- PM2.5传感器:模拟输出,ADC采集颗粒物数据
- DHT11:单总线数字温湿度传感器
- PAJ7620U2:手势识别传感器,I2C通信
3. 执行机构
- SG90舵机:控制净化器盖板开合
- 直流风扇:PWM调速控制风量
- UV杀菌灯:GPIO开关控制
4. 人机交互
- 2.4寸TFT液晶屏(240x240),SPI接口
- 矩阵键盘输入
- 蜂鸣器状态提示
5. 通信模块
- ESP8266 WiFi模块:AT指令接入MQTT协议
- HC-05蓝牙模块:备用本地通信
6. 系统框架图
+-------------------+ +-----------------+
| 传感器采集层 |<--->| STM32F4主控 |
| (CO₂/PM2.5/温湿度) | | (FreeRTOS调度) |
+-------------------+ +-----------------+
| | |
+-----------+ | +-----------+
| | |
+----------------+ +-----------+ +------------+
| 执行控制层 | | 通信层 | | 人机交互层 |
| (风扇/PWM/舵机) | | (WiFi/BLE)| | (TFT/按键)|
+----------------+ +-----------+ +------------+
三、软件开发环境搭建
1. 工具链配置
-
IDE:Keil MDK-ARM V5
-
编译器:ARMCC V6
-
调试工具:J-Link V9
库支持
:
- STM32标准外设库/HAL库
- FreeRTOS V10.3.1
- LVGL图形库(可选)
2. 工程结构规划
c
Copy
Project/
├── CMSIS/ // 内核支持文件
├── Drivers/
│ ├── STM32F4xx_HAL_Driver/
│ └── BSP/ // 板级支持包
├── Middlewares/
│ └── FreeRTOS/ // RTOS源码
├── Application/
│ ├── Inc/ // 头文件
│ ├── Src/ // 应用源码
│ └── Tasks/ // FreeRTOS任务
└── Utilities/ // 调试工具
四、FreeRTOS任务设计
1. 任务划分原则
- 高优先级:关键控制任务(如PWM输出)
- 中优先级:网络通信、传感器采集
- 低优先级:界面刷新、非实时任务
2. 典型任务定义(文档1)
c
Copy
static TaskHandle_t app_task_init_handle = NULL;
static TaskHandle_t g_app_task_mqtt_handle = NULL;
static void app_task_init(void* pvParameters) {
// 硬件初始化
while(1) {
vTaskDelay(1000); // 1s周期
}
}
void RTOS_TaskCreate(void) {
xTaskCreate(app_task_init, "Init", 128, NULL, 4, &app_task_init_handle);
xTaskCreate(app_task_mqtt, "MQTT", 256, NULL, 3, &g_app_task_mqtt_handle);
// ...其他任务
}
3. 任务间通信
- 队列(Queue):传输传感器数据包
- 信号量(Semaphore):同步网络连接状态
- 事件组(Event Group):多任务协同
五、关键模块配置详解
1. TFT显示屏驱动(文档4、5)
SPI配置要点:
c
Copy
void SPI1_Init(void) {
SPI_InitTypeDef SPI_InitStruct = {0};
// 时钟极性/相位配置
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
SPI_Init(SPI1, &SPI_InitStruct);
}
DMA优化刷屏:
c
Copy
void lcd_fill(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color) {
lcd_addr_set(x, y, x+w-1, y+h-1);
HAL_SPI_Transmit_DMA(&hspi1, (uint8_t*)&color, 2);
}
2. SGP30气体传感器(文档6、7)
I2C读时序实现:
c
Copy
uint8_t SGP30_Read(uint8_t reg, uint8_t *buf, uint8_t len) {
I2C_Start();
I2C_Send_Byte(SGP30_ADDR_WRITE);
I2C_Send_Byte(reg);
I2C_Start();
I2C_Send_Byte(SGP30_ADDR_READ);
while(len--) {
*buf++ = I2C_Read_Byte(len == 0);
}
I2C_Stop();
return 0;
}
数据校验处理:
c
Copy
if(crc8(&data[0], 2) != data[2]) {
// CRC校验失败处理
}
3. PM2.5传感器(文档14、15)
ADC采集配置:
c
Copy
void PM25_ADC_Init(void) {
ADC_ChannelConfTypeDef sConfig = {0};
hadc1.Instance = ADC1;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DMAContinuousRequests = ENABLE;
HAL_ADC_Init(&hadc1);
sConfig.Channel = ADC_CHANNEL_4;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
}
4. 舵机控制(文档8、9)
PWM生成配置:
c
Copy
void SG90_Init(TIM_HandleTypeDef *htim, uint32_t channel) {
TIM_OC_InitTypeDef sConfigOC = {0};
htim->Instance = TIM4;
htim->Init.Prescaler = 84-1; // 84MHz/84 = 1MHz
htim->Init.CounterMode = TIM_COUNTERMODE_UP;
htim->Init.Period = 20000-1; // 20ms周期
HAL_TIM_PWM_Init(htim);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 1500; // 初始1.5ms
HAL_TIM_PWM_ConfigChannel(htim, &sConfigOC, channel);
HAL_TIM_PWM_Start(htim, channel);
}
六、网络通信实现
1. ESP8266 AT指令流程(文档29、30)
c
Copy
bool ESP8266_ConnectAP(const char *ssid, const char *pwd) {
SendATCommand("AT+CWMODE=1", "OK", 2000);
sprintf(cmd, "AT+CWJAP=\"%s\",\"%s\"", ssid, pwd);
if(SendATCommand(cmd, "OK", 10000)) {
return true;
}
return false;
}
2. MQTT协议接入(文档31、32)
阿里云三元组配置:
c
Copy
#define PRODUCT_KEY "a1F3hCBQ4Uk"
#define DEVICE_NAME "smartdevice2"
#define DEVICE_SECRET "68e0ed6daea86eb0b26521b3d96d1fffaa1c03cb6f135c6cbaedd3d7ca5dc1aa"
void MQTT_Connect(void) {
// 生成clientID/username/password
// ...HMAC-SHA256加密过程
mqtt_client.connect(clientId, username, password);
}
数据上报格式:
json
Copy
{
"id": "123",
"params": {
"PM25": {"value": 35},
"CO2": {"value": 450},
"Temp": {"value": 25.6}
},
"version":"1.0"
}
七、系统整合与调试
1. 任务优先级分配表
任务名称 | 优先级 | 堆栈大小 | 功能描述 |
---|---|---|---|
App_TaskPWM | 4 | 128 | 风扇/PWM控制 |
App_TaskSensor | 3 | 256 | 传感器数据采集 |
App_TaskMQTT | 2 | 512 | 网络通信 |
App_TaskGUI | 1 | 1024 | 界面刷新 |
2. 调试技巧
- 传感器数据异常:使用逻辑分析仪抓取I2C波形
- WiFi连接失败:AT指令手动调试+串口日志输出
- 内存溢出:FreeRTOS堆栈检测函数uxTaskGetStackHighWaterMark()
3. 功耗优化策略
- 动态调整采集频率
- 空闲任务自动进入STOP模式
- 网络心跳包间隔优化
八、项目总结与扩展
本项目实现了空气净化器核心功能,后续可扩展:
- 增加手机APP控制(接入阿里云生活物联网平台)
- 实现语音控制(集成LD3320语音模块)
- 添加滤芯寿命监测
- 开发节能模式(根据环境自动调节)
通过本项目的实践,开发者可掌握STM32在多任务环境下的开发方法、传感器数据融合处理技术及物联网系统的构建流程,为复杂嵌入式系统开发奠定坚实基础。