一、項目概述
本空氣凈化器項目基于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 = 1MHzhtim->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.5msHAL_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在多任務環境下的開發方法、傳感器數據融合處理技術及物聯網系統的構建流程,為復雜嵌入式系統開發奠定堅實基礎。