1. 项目概述
去年夏天帮朋友改造儿童房时,发现一个有趣的现象:虽然房间装了新风机,但不同位置的空气质量差异很大。这让我萌生了制作一台能自主移动监测空气质量的智能小车想法。经过三个月的迭代,最终完成的这台智能远程空气监测小车,不仅能实时检测PM2.5、CO2、温湿度等参数,还能通过手机远程控制其移动到指定位置采样,数据自动上传云端生成可视化报告。
这种设备特别适合用于:
- 家庭环境中的空气质量死角检测
- 工厂/实验室等场所的定期巡检
- 教学场景下的物联网开发案例
- 养老院等特殊场所的环境监控
核心功能架构包含三大模块:
- 移动底盘与控制系统
- 多参数空气检测模块
- 无线通信与云平台
2. 硬件系统设计
2.1 移动底盘选型对比
实测对比了三种常见底盘方案:
| 类型 | 成本 | 越障能力 | 控制复杂度 | 适用场景 |
|---|---|---|---|---|
| 两轮差速 | ¥80 | 1cm | 简单 | 平坦室内 |
| 四轮麦克纳姆 | ¥300 | 0.5cm | 中等 | 需要横向移动 |
| 履带式 | ¥450 | 3cm | 复杂 | 复杂地形 |
最终选择两轮差速底盘,主要考虑:
- 家庭环境地面平整度足够
- 成本优势明显
- 配套的电机驱动板成熟稳定
关键提示:选购时注意电机编码器分辨率,建议选择每转≥12脉冲的型号,这对后续里程计精度至关重要。
2.2 传感器阵列配置
空气检测模块采用模块化设计,包含:
-
PM2.5传感器:攀藤G7激光颗粒物传感器
- 原理:激光散射法
- 量程:0-1000μg/m³
- 特点:自带风扇确保气流稳定
-
CO2传感器:MH-Z19B红外传感器
- 采用NDIR非分散红外技术
- 自动基线校准功能
- 注意安装时要远离热源
-
温湿度传感器:SHT31
- I2C接口数字输出
- ±2%RH湿度精度
- 带防尘滤网保护
传感器布局要避开电机干扰,实测发现距离电机20cm以上时数据稳定性最佳。所有传感器通过3D打印的支架集中安装在小车顶部,形成"检测塔"结构。
3. 控制系统实现
3.1 主控板选型
对比树莓派4B和STM32F407两种方案:
python复制# 树莓派方案示例代码
import RPi.GPIO as GPIO
from mh_z19 import mh_z19
def read_sensors():
co2 = mh_z19.read()
pm25 = pms5003.read()
return {"co2":co2, "pm2.5":pm25}
最终选择STM32+ESP32双核方案:
- STM32负责电机控制和传感器数据采集
- ESP32处理WiFi通信和云端对接
- 通过UART协议进行双机通信
优势在于:
- 实时性更好(电机控制周期可达1ms)
- 功耗更低(待机电流<50mA)
- 成本更低(总价约120元)
3.2 运动控制算法
开发了三种运动模式:
- 定点巡航模式:输入目标坐标(x,y),小车自动规划路径
- 区域扫描模式:划定矩形区域,自动生成蛇形路径
- 紧急避障模式:通过TOF传感器实现急停
路径规划算法伪代码:
code复制def path_planning(target):
current = get_odometry()
path = []
while distance(current, target) > 0.1:
next_point = calculate_next_step(current, target)
path.append(next_point)
current = next_point
return path
里程计校准方法:
- 让小车直线行驶1米
- 记录编码器脉冲数N
- 计算脉冲当量:1/N (m/pulse)
- 重复3次取平均值
4. 软件系统架构
4.1 通信协议设计
采用MQTT+HTTP混合方案:
- 实时控制指令走MQTT(<100ms延迟)
- 历史数据查询用HTTP RESTful API
- 数据包采用MessagePack二进制格式
典型数据包结构:
json复制{
"ts": 1634567890,
"pm25": 35,
"co2": 650,
"temp": 25.3,
"humi": 45.2,
"loc": [1.2, 3.4]
}
4.2 云端数据处理
数据流向:
传感器 → 边缘计算(滤波) → 云端存储 → 可视化
采用的云服务组合:
- 阿里云IoT平台用于设备管理
- 腾讯云时序数据库CTSDB存储数据
- 自建Node-RED实现业务逻辑
- Grafana做数据可视化
避坑经验:MQTT的QoS等级建议设为1,既能保证可靠性又不会像QoS2那样产生明显延迟。
5. 实际应用测试
5.1 家庭环境测试
在80㎡的公寓中设置5个检测点:
- 厨房灶台附近
- 卧室床头
- 儿童书桌
- 客厅中央
- 卫生间
连续监测一周发现:
- 做饭时厨房PM2.5瞬时值可达180μg/m³
- 夜间卧室CO2浓度经常超过1000ppm
- 卫生间湿度长期>70%RH
5.2 性能参数实测
| 指标 | 实测值 | 备注 |
|---|---|---|
| 检测精度 | ±5%FS | 与专业设备对比 |
| 移动分辨率 | 1cm | 依赖里程计校准 |
| 单次充电续航 | 4小时 | 2000mAh锂电池 |
| 网络延迟 | 平均86ms | 距离路由器5米测试 |
| 数据丢失率 | <0.1% | 72小时连续测试 |
6. 常见问题解决方案
6.1 传感器读数异常
现象:CO2值持续显示400ppm不变
- 检查电源:确保传感器获得5V±0.1V供电
- 检查预热:MH-Z19B需要3分钟预热
- 检查接线:UART线路RX/TX不要接反
6.2 运动控制问题
现象:小车走直线会偏移
- 执行电机校准:
CALIB_MOTOR命令 - 检查地面:反光/深色地砖会影响编码器
- 调整PID参数:增大D项抑制振荡
6.3 网络连接问题
现象:频繁断线重连
- 修改WiFi信道:避开拥挤的6信道
- 增加重试机制:指数退避算法
- 添加看门狗:硬件看门狗+软件心跳
7. 进阶改进方向
- 多机协作:通过UWB实现多车定位,适合大空间监测
- 自动充电:增加红外引导的充电对接功能
- AI预测:基于历史数据预测空气质量变化趋势
- 边缘计算:在本地实现异常检测,减少云端依赖
实测发现增加简单的移动平均滤波算法,就能将传感器读数波动降低60%。下一步计划尝试卡尔曼滤波,进一步提升数据质量。