AirOwl:基于 Arduino 101 的实时空气质量监测仪
组件与物料
| 组件 | 数量 |
|---|---|
| Arduino 101 (Genuino 101) | 1 |
| ZH03A 激光粉尘传感器 | 1 |
| Adafruit Flora RGB NeoPixel LED(4颗装) | 1 |
| 杜邦线 | 10 |
| 10kΩ 电阻 | 3 |
应用与服务
- Blynk App (BLE)
- Arduino IDE
项目简介
AirOwl 是一款实时空气质量监测设备,利用 Arduino 101 内置 BLE 将 PM1.0、PM2.5、PM10 数据推送至 Blynk App,同时通过 RGB LED “眼睛”颜色直观指示空气质量等级,串口亦可查看原始数据。
三种数据查看方式
- Blynk App (BLE):三个仪表盘实时显示 PM1.0 / PM2.5 / PM10 浓度
- RGB LED 眼睛颜色:
- 🟢 绿色:安全
- 🔵 蓝色:需注意
- 🔴 红色:危险
- 串口监视器:输出原始浓度数值
电路原理图
详细原理图、PCB 设计、3D 外壳文件均托管于 GitHub:AirOwl_Genuino101。面包板接线图亦在仓库中提供。
Blynk App 配置步骤
- 安装 Blynk (iOS/Android),注册账号
- 创建新项目,选择板型为 Arduino 101,连接方式选 BLE
- 获取 Auth Token(邮件发送)
- 在工作区添加:BLE 组件 ×1、Gauge 仪表盘 ×3,分别绑定 Virtual Pin V1/V2/V3
- 点击工作区蓝牙图标连接 Arduino 101(手机蓝牙需开启)
- 点击运行,实时数据即刻呈现
核心代码
#include <BlynkSimpleCurieBLE.h> #include <CurieBLE.h>
#define BLYNK_SERIAL Print
byte data[24]; unsigned int PM1=0, PM25=0, PM10=0, count=0;
const int PIN1=3, PIN2=5, PIN3=6; // RGB LED 引脚
char auth[] = "Your_Blynk_Auth_Token";
BLEPeripheral blePeripheral;
void setup() {
blePeripheral.setLocalName("AirOwl");
blePeripheral.setDeviceName("AirOwl");
blePeripheral.setAppearance(384);
Blynk.begin(blePeripheral, auth); blePeripheral.begin();
Serial1.begin(9600); Serial.begin(9600);
pinMode(PIN1, OUTPUT); pinMode(PIN2, OUTPUT); pinMode(PIN3, OUTPUT);
}
void loop() {
Blynk.run(); blePeripheral.poll();
// 串口打印平均值
Serial.println("PM1: " + String(PM1/count));
Serial.println("PM2.5: " + String(PM25/count));
Serial.println("PM10: " + String(PM10/count));
delay(500);
WriteData();
// LED 颜色判断逻辑
int avg = (PM1+PM25+PM10)/3;
if (avg <= 100) LedColor(0,255,0); // 绿
else if (avg <= 300) LedColor(255,0,0); // 红
else LedColor(0,0,255); // 蓝
delay(500);
}
void LedColor(int r, int b, int g) {
analogWrite(PIN1, r); analogWrite(PIN2, b); analogWrite(PIN3, g);
}
void getWinsenData() { // 解析 ZH03A 数据帧
byte i=0; int checksum=0; Serial1.flush();
while (Serial1.available()) {
data[i] = Serial1.read();
if (i <= 21) checksum += data[i];
if (i == 23) {
if (checksum == (data[22]*256 + data[23]) && data[0]==0x42 && data[1]==0x4D) {
PM1 += data[4]*256 + data[5];
PM25 += data[6]*256 + data[7];
PM10 += data[8]*256 + data[9];
count++; Serial1.flush(); break;
} else break;
} i++; delay(10);
}
}
void WriteData() {
getWinsenData();
Blynk.virtualWrite(V1, PM1/count);
Blynk.virtualWrite(V2, PM25/count);
Blynk.virtualWrite(V3, PM10/count);
delay(1000);
}
完整代码、原理图、PCB、3D 外壳文件均可在 GitHub 获取。
制造工艺