1. 项目概述:智能环境监测系统的核心价值
去年帮朋友改造老旧厂房时,发现传统烟雾报警器存在两个致命缺陷:无法远程通知和缺乏粉尘浓度监测。这正是我们开发这套系统的初衷——用STM32+WIFI打造一个能同时监测烟雾和PM2.5的智能环境卫士。
这个系统本质上是一个多参数环境监测终端,通过MQ-2烟雾传感器和GP2Y1010AU0F粉尘传感器采集数据,经STM32F103C8T6处理后再通过ESP8266模块上传到云平台。相比市面单一功能产品,我们的方案有三个突出优势:
- 双重防护:同时监测火灾隐患和空气质量
- 实时预警:通过WIFI实现手机推送报警
- 成本可控:整套BOM成本控制在80元以内
2. 硬件设计详解
2.1 核心器件选型对比
在选择主控芯片时,我们对比了三种方案:
| 型号 | 价格(元) | FLASH | RAM | 外设接口 | 最终选择理由 |
|---|---|---|---|---|---|
| STM32F103C8T6 | 12.5 | 64KB | 20KB | 2xSPI,2xI2C | 性价比最高,资源充足 |
| GD32F103C8T6 | 10.8 | 64KB | 20KB | 同STM32 | 开发环境兼容性稍差 |
| ESP32-WROOM | 25 | 4MB | 520KB | 内置WIFI | 过度配置,ADC精度不足 |
传感器选型方面,烟雾检测采用MQ-2半导体气敏元件,其对液化气、丙烷、氢气的灵敏度分别是:
- 液化气:0.3-0.8V/1000ppm
- 丙烷:0.4-1.0V/1000ppm
- 氢气:0.2-0.6V/1000ppm
粉尘传感器选用夏普GP2Y1010AU0F,其输出电压与浓度关系为:
Vout = 0.5V + 0.05V/(0.1mg/m³) × Concentration
2.2 电路设计关键点
ADC采样电路需要特别注意:
- MQ-2负载电阻选用10KΩ可调电阻,通过实验确定最佳阻值
- GP2Y1010AU0F需配合150Ω限流电阻和220μF电容使用
- STM32的ADC参考电压接入3.3V稳压源
WIFI模块电路设计要点:
c复制// ESP8266典型连接方式
#define WIFI_TX_PIN PA2 // USART2
#define WIFI_RX_PIN PA3
#define WIFI_EN_PIN PC13 // 使能控制
3. 软件实现解析
3.1 传感器数据处理算法
烟雾传感器需要温度补偿算法:
c复制float get_smoke_concentration(float adc_val, float temp) {
float R0 = 10.0; // 标定电阻(kΩ)
float Rs = (3.3 - adc_val) * R0 / adc_val;
float ratio = Rs / R0;
float comp_ratio = ratio * (1 + 0.02*(temp-20)); // 温度补偿
return 1000 * pow(comp_ratio, -2.3); // 转换为ppm
}
PM2.5数据采用滑动平均滤波:
c复制#define FILTER_SIZE 5
float pm25_filter(float new_val) {
static float buffer[FILTER_SIZE] = {0};
static uint8_t index = 0;
buffer[index++] = new_val;
if(index >= FILTER_SIZE) index = 0;
float sum = 0;
for(uint8_t i=0; i<FILTER_SIZE; i++) {
sum += buffer[i];
}
return sum / FILTER_SIZE;
}
3.2 WIFI通信协议设计
我们采用自定义轻量级JSON协议:
json复制{
"dev_id":"ESP_112233",
"smoke":45.2,
"pm25":78.5,
"temp":26.8,
"alarm":0
}
数据上传频率优化策略:
- 正常状态:每5分钟上传一次
- 预警状态:每30秒上传一次
- 报警状态:立即上传+实时推送
4. 系统调试与优化
4.1 传感器标定实操
MQ-2标定步骤:
- 在洁净空气中通电预热24小时
- 使用1000ppm异丁烷标准气体测试
- 调节负载电阻使输出电压为2V±0.1V
- 记录至少5个浓度点的输出特性
GP2Y1010AU0F校准方法:
注意:粉尘传感器对安装角度敏感,必须保持水平
- 使用专业粉尘检测仪作为基准
- 在0-500μg/m³范围内取10个点
- 通过最小二乘法拟合曲线
4.2 低功耗优化方案
通过实测发现系统主要耗电模块:
| 模块 | 工作电流 | 休眠电流 | 优化措施 |
|---|---|---|---|
| STM32 | 25mA | 2.1μA | 启用STOP模式 |
| ESP8266 | 80mA | 20μA | 深度睡眠,按需唤醒 |
| 传感器 | 45mA | - | 间歇供电,采样周期延长3倍 |
优化后功耗对比:
- 持续工作模式:150mA → 不可接受
- 优化后平均电流:8.7mA → 2000mAh电池可续航9天
5. 典型问题排查指南
5.1 WIFI连接不稳定
现象:频繁断线重连
排查步骤:
- 检查天线阻抗匹配(应50Ω)
- 测量供电电压波动(要求>3.2V)
- 测试AT指令响应时间(正常<100ms)
解决方案:
- 增加100μF钽电容稳压
- 设置重连超时为10秒
- 启用TCP KeepAlive机制
5.2 粉尘数据异常跳动
可能原因:
- 环境光干扰(特别是日光直射)
- 风扇气流扰动
- 电源纹波过大
验证方法:
c复制// 诊断代码示例
void check_pm25_sensor(void) {
GPIO_WriteHigh(SENSOR_PWR_PIN);
delay(100);
float v1 = ADC_Read(PM25_CH);
delay(10);
float v2 = ADC_Read(PM25_CH);
if(fabs(v1-v2) > 0.2) {
// 数据异常标志
set_fault_flag(PM25_NOISE);
}
}
6. 项目进阶方向
在完成基础功能后,可以考虑以下扩展:
- 增加LoRa无线组网实现区域覆盖
- 结合机器学习算法实现火灾早期预测
- 开发微信小程序替代原生APP
- 采用太阳能供电实现完全无线化
实测中发现一个有趣现象:当同时检测到PM2.5突增和烟雾浓度缓慢上升时,极可能是阴燃火灾的征兆。我们正在开发基于这个特征的早期预警算法,通过监测两个参数的关联性变化,可以将火灾预警时间平均提前17分钟。