Arduino 室内空气质量与舒适度监测套件 - DIY 教程
所需组件与材料
| 组件 | 数量 | 备注 |
|---|---|---|
| Arduino Nano R3 | 1 | 主控板 |
| DHT11 温湿度传感器(3 引脚) | 1 | 测温范围 0-50°C,测湿 20-90% RH |
| MQ135 空气质量传感器 | 1 | 检测 CO2、酒精、苯、烟雾等 |
| 0.96" I2C OLED 显示屏 (128x64) | 1 | SSD1306 驱动 |
所需工具
- 电烙铁及焊锡
- 3D 打印机(可选,用于打印外壳)
所需软件
- Arduino IDE
项目背景
许多人在封闭房间睡眠后醒来感到疲惫,这往往是由于夜间室内空气质量下降导致的。本项目制作一个低成本的空气质量监测仪,实时显示温度、湿度和空气质量等级,帮助改善居住环境。
接线说明
| Arduino 引脚 | 连接模块 | 模块引脚 |
|---|---|---|
| D2 | DHT11 | OUT |
| A0 | MQ135 | AO (模拟输出) |
| A5 (SCL) | OLED | SCL |
| A4 (SDA) | OLED | SDA |
所有模块 VCC 接 5V,GND 接地。OLED 使用 I2C 通信,默认地址 0x3C。
代码实现
所需库安装
通过库管理器安装:
Adafruit_SSD1306Adafruit_GFXDHT sensor library(由 Adafruit 提供)
核心逻辑
程序包含两个主要函数:
sendSensor():读取 DHT11 温湿度数据并在 OLED 底部显示air_sensor():读取 MQ135 模拟值,根据阈值判断空气质量等级并在 OLED 顶部显示
MQ135 传感器“老化”与校准(关键步骤)
MQ135 出厂时表面吸附杂质,首次使用必须通电“老化”至少 24 小时(在洁净空气中),以烧掉表面污染物,提高测量准确性。老化完成后,将传感器置于已知洁净环境(如户外空气)中,观察串口输出的 gasLevel 基准值,据此调整代码中的阈值:
if (gasLevel < 181) quality = "GOOD!";
else if (gasLevel < 225) quality = "Poor!";
else if (gasLevel < 300) quality = "Very bad!";
else if (gasLevel < 350) quality = "Dangerous!";
else quality = "Toxic!";
不同环境、不同批次传感器基准值差异较大,建议实测校准。
完整代码
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSans9pt7b.h>
#include <Fonts/FreeMonoOblique9pt7b.h>
#include <DHT.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define sensor A0
#define DHTPIN 2
#define DHTTYPE DHT11
int gasLevel = 0;
String quality = "";
DHT dht(DHTPIN, DHTTYPE);
void sendSensor() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
display.setTextColor(WHITE);
display.setTextSize(1);
display.setFont();
display.setCursor(0, 43);
display.println("Temp :");
display.setCursor(80, 43);
display.println(t);
display.setCursor(114, 43);
display.println("C");
display.setCursor(0, 56);
display.println("RH :");
display.setCursor(80, 56);
display.println(h);
display.setCursor(114, 56);
display.println("%");
}
void air_sensor() {
gasLevel = analogRead(sensor);
if (gasLevel < 181) quality = " GOOD!";
else if (gasLevel < 225) quality = " Poor!";
else if (gasLevel < 300) quality = "Very bad!";
else if (gasLevel < 350) quality = "Dangerous!";
else quality = " Toxic";
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(1, 5);
display.setFont();
display.println("Air Quality:");
display.setTextSize(1);
display.setCursor(20, 23);
display.setFont(&FreeMonoOblique9pt7b);
display.println(quality);
}
void setup() {
Serial.begin(9600);
pinMode(sensor, INPUT);
dht.begin();
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(50, 0);
display.println("Air");
display.setTextSize(1);
display.setCursor(23, 20);
display.println("Quality monitor");
display.display();
delay(1200);
display.clearDisplay();
display.setTextSize(2);
display.setCursor(20, 20);
display.println("BY Maker");
display.display();
delay(1000);
display.clearDisplay();
}
void loop() {
display.clearDisplay();
air_sensor();
sendSensor();
display.display();
delay(1000); // 1秒刷新一次
}
外壳与原理图
项目提供 3D 打印外壳模型(可选),也可用纸盒、亚克力板自制。原理图见项目附件。
注意事项与改进建议
- MQ135 对温湿度敏感,精确应用需配合温湿度补偿算法
- DHT11 精度有限,要求较高可升级为 DHT22 或 SHT30
- 可增加蜂鸣器报警、WiFi/蓝牙上传数据到手机 App
- OLED 长时间显示固定内容可能烧屏,建议添加屏保或轮询显示
制造工艺
- 树莓派打造空气质量与气象站:InfluxDB+Grafana可视化
- 使用 OpenSensors 监测空气质量:Arduino 与 Python 实战指南
- DIY 空气质量监测仪:低成本 EPA 合规检测器
- 基于 Helium 网络的太阳能供电空气质量监测站:设计与部署全指南
- 基于LoRa的智慧城市空气质量监测系统
- 用 Arduino 打造绚丽显示器 Ambilight 系统
- 智能室内空气质量与垃圾监测系统
- K30 CO₂ 传感器:室内空气质量实时监测
- Bosch Sensortec 推出 AI 赋能 BME688 空气质量传感器,降低病毒传播风险
- 瑞萨升级室内空气质量传感器平台,嵌入式AI增强异味检测
- 微型 PM2.5 与 VOC 传感器实现实时个人空气质量监测
- 先进碳基 NO₂ 传感器提升室内空气质量监测水平