1. 项目概述:基于STM32的智能空气处理系统设计
作为一名在嵌入式领域摸爬滚打多年的工程师,我最近指导了一个本科生的毕业设计项目——基于STM32的智能空气处理系统。这个项目完美结合了硬件控制、传感器技术和物联网应用,是学习嵌入式开发的绝佳实践案例。系统通过多传感器实时监测环境参数,当空气质量超标时自动启动通风和报警装置,同时支持手机APP远程监控和手动控制。
整个系统的核心是STM32F103C8T6单片机,它负责协调各个模块的工作:
- 环境监测:DHT11温湿度传感器+MQ135空气质量传感器
- 人机交互:0.96寸OLED显示屏+蜂鸣器报警
- 执行机构:直流风扇+舵机(模拟窗户开关)
- 通信模块:ESP8266 WiFi模块+HC-05蓝牙模块
提示:STM32F103C8T6作为Cortex-M3内核的经典型号,具有72MHz主频和丰富的外设接口,性价比极高,特别适合作为学生项目的核心控制器。
2. 硬件系统设计与实现
2.1 核心控制器选型与配置
我们选择STM32F103C8T6作为主控芯片,主要基于以下考虑:
- 性价比:零售价约10-15元,远低于同性能的ARM芯片
- 开发资源:STM32生态完善,有标准库和HAL库支持
- 外设丰富:具有多个USART、I2C、SPI接口,方便连接各类传感器
关键引脚分配如下表所示:
| 外设模块 | 接口类型 | 引脚分配 |
|---|---|---|
| OLED显示屏 | I2C | PB6(SCL), PB7(SDA) |
| DHT11传感器 | GPIO | PA0 |
| MQ135传感器 | ADC | PA1 |
| 风扇控制 | PWM | PA8 |
| 舵机控制 | PWM | PA9 |
| 蜂鸣器 | GPIO | PB0 |
| WiFi模块(ESP8266) | USART1 | PA9(TX), PA10(RX) |
| 蓝牙模块(HC-05) | USART2 | PA2(TX), PA3(RX) |
2.2 传感器模块集成
2.2.1 环境监测传感器
DHT11温湿度传感器采用单总线协议,其数据采集流程如下:
- MCU拉低总线18ms作为起始信号
- DHT11响应80us低电平+80us高电平
- 随后传输40bit数据(16bit湿度+16bit温度+8bit校验和)
MQ135空气质量传感器需要特别注意:
- 预热时间:首次上电需预热24小时以上才能稳定
- 数据处理:建议采用滑动平均滤波算法
- 标定方法:在洁净空气中记录基准值,作为判断阈值的基础
c复制// MQ135数据采集示例代码
#define MQ135_PIN PA1
uint16_t read_MQ135(void) {
uint16_t adc_value = 0;
for(int i=0; i<10; i++) { // 10次采样取平均
adc_value += analogRead(MQ135_PIN);
delay(10);
}
return adc_value/10;
}
2.3 执行机构驱动设计
2.3.1 风扇控制电路
采用NPN三极管驱动风扇,电路设计要点:
- 基极串联2KΩ限流电阻
- 集电极接风扇正极(12V供电)
- 发射极接地
- 反并联续流二极管防止反电动势
2.3.2 舵机控制参数
选用SG90微型舵机,控制要点:
- PWM频率:50Hz(周期20ms)
- 脉冲宽度:
- 0.5ms → 0度
- 1.5ms → 90度
- 2.5ms → 180度
c复制// 舵机角度控制函数
void set_servo_angle(TIM_HandleTypeDef *htim, uint32_t Channel, uint8_t angle) {
uint16_t pulse = 500 + angle * 2000 / 180; // 计算脉冲宽度(us)
__HAL_TIM_SET_COMPARE(htim, Channel, pulse);
}
3. 软件系统架构与实现
3.1 主程序流程设计
系统采用状态机架构,主程序流程图如下:
-
系统初始化
- 外设初始化(GPIO、USART、ADC、TIM等)
- 传感器校准
- 连接WiFi/蓝牙
-
主循环
- 读取传感器数据
- 数据处理与阈值比较
- 执行控制逻辑
- 更新显示
- 数据上传云端
c复制int main(void) {
// 硬件初始化
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_ADC1_Init();
MX_TIM1_Init();
// 外设初始化
OLED_Init();
DHT11_Init();
ESP8266_Init();
while (1) {
// 1. 数据采集
float temp = DHT11_ReadTemp();
float humi = DHT11_ReadHumi();
uint16_t air = read_MQ135();
// 2. 数据处理
process_data(temp, humi, air);
// 3. 控制逻辑
if(air > threshold) {
HAL_GPIO_WritePin(FAN_GPIO_Port, FAN_Pin, GPIO_PIN_SET);
set_servo_angle(&htim1, TIM_CHANNEL_1, 90); // 开窗
buzzer_alarm(3); // 报警3次
}
// 4. 显示更新
OLED_Display(temp, humi, air);
// 5. 数据上传
ESP8266_SendData(temp, humi, air);
HAL_Delay(1000); // 1秒周期
}
}
3.2 无线通信模块实现
3.2.1 WiFi数据上传
使用ESP8266模块通过MQTT协议上传数据到云平台:
- 配置为Station模式连接路由器
- 建立TCP连接至MQTT服务器
- 按照MQTT协议格式发布消息
关键AT指令序列:
code复制AT+CWMODE=1
AT+CWJAP="SSID","password"
AT+CIPSTART="TCP","broker.emqx.io",1883
AT+CIPSEND=length
<publish MQTT message>
3.2.2 蓝牙APP通信
HC-05蓝牙模块配置要点:
- 波特率:9600bps
- 配对密码:1234
- 工作模式:从模式
APP端数据处理流程:
- 建立蓝牙连接
- 接收数据帧并解析
- 更新UI显示
- 发送控制指令(如模式切换)
4. 系统调试与优化
4.1 常见问题排查指南
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| DHT11读取失败 | 时序不符合要求 | 严格遵循18ms起始信号 |
| MQ135数值波动大 | 未充分预热 | 持续通电24小时以上 |
| 舵机抖动不转动 | PWM脉宽超出范围 | 检查脉冲宽度是否在0.5-2.5ms |
| WiFi连接不稳定 | 天线位置不佳 | 调整模块方位,远离金属物体 |
| 蓝牙连接频繁断开 | 供电不足 | 单独为蓝牙模块提供稳定5V电源 |
4.2 系统性能优化建议
-
电源管理优化
- 为数字电路和模拟电路分别供电
- 在传感器电源端增加0.1μF去耦电容
- 使用LDO稳压器而非开关电源为模拟部分供电
-
软件优化技巧
- 采用DMA方式传输传感器数据
- 使用看门狗定时器防止程序跑飞
- 对MQ135数据采用中值滤波算法
-
扩展功能建议
- 增加PM2.5传感器提升监测维度
- 实现历史数据本地存储(SD卡)
- 添加语音播报功能
注意:调试阶段建议先用USB转TTL工具单独测试每个模块,确认各模块工作正常后再进行系统集成,可以大幅降低调试难度。
5. 项目总结与心得
在实际开发过程中,有几个关键经验值得分享:
-
传感器标定不能省:最初没有对MQ135进行充分预热和标定,导致阈值设置不合理,系统频繁误报警。后来通过在洁净空气中记录基准值,并采用动态阈值算法,显著提高了检测准确性。
-
电源干扰问题:当风扇启动时,WiFi模块经常掉线。最终通过以下措施解决:
- 为电机驱动添加独立电源
- 在电源输入端增加大容量电解电容
- 优化PCB布局,缩短电源走线
-
蓝牙通信协议设计:最初直接发送原始数据,经常出现数据错乱。后来设计了简单的通信协议:
- 帧头:0xAA 0xBB
- 数据类型:1字节
- 数据长度:1字节
- 数据内容:N字节
- 校验和:1字节
这种结构大大提高了通信可靠性。
这个项目虽然基础,但涵盖了嵌入式开发的完整流程,从硬件选型、电路设计到软件开发、系统调试,对初学者来说是很好的综合训练。建议有兴趣的开发者可以进一步扩展功能,比如加入机器学习算法实现智能预测,或者设计更美观的UI界面。