用Arduino自制空气质量监测器?手把手教你!
你是否也和我一样,每天早上醒来第一件事就是打开手机,看看今天的空气质量如何?尤其是在秋冬季节,雾霾频发,空气质量更是牵动着每个人的心。与其每天被动地接收信息,不如主动出击,自己动手制作一个空气质量监测器,实时了解身边的空气状况,为自己和家人的健康保驾护航!
今天,我就来手把手教你如何使用Arduino制作一个简易的空气质量监测器,它可以实时监测PM2.5、温度和湿度等数据,并在超标时发出警报。别担心,即使你没有任何电子基础,也能轻松上手!
1. 准备材料
在开始制作之前,我们需要准备以下材料:
- Arduino Uno开发板: 这是我们的大脑,负责处理各种传感器的数据,并控制显示屏和蜂鸣器。
- PM2.5传感器(例如:PMS5003): 用于检测空气中PM2.5的浓度,是空气质量监测的核心部件。
- 温湿度传感器(例如:DHT11或DHT22): 用于检测空气的温度和湿度,可以更全面地了解空气状况。
- LCD1602液晶显示屏: 用于显示PM2.5、温度和湿度等数据,方便我们实时查看。
- 蜂鸣器: 当PM2.5超标时,发出警报,提醒我们注意空气质量。
- 杜邦线若干: 用于连接各个传感器和Arduino开发板。
- 面包板: 用于搭建电路,方便连接各个元件。
- USB数据线: 用于连接Arduino开发板和电脑,进行程序上传和调试。
温馨提示: 你可以在淘宝、京东等电商平台购买到以上所有材料,一套下来大概只需要几十块钱,非常划算。
2. 连接电路
准备好材料后,我们就开始连接电路了。别担心,这并不难,只需要按照下面的步骤一步一步来,就能轻松完成。
连接PM2.5传感器:
- PMS5003传感器的VCC引脚连接到Arduino Uno的5V引脚。
- PMS5003传感器的GND引脚连接到Arduino Uno的GND引脚。
- PMS5003传感器的TXD引脚连接到Arduino Uno的数字引脚2(你可以根据自己的需要修改)。
- PMS5003传感器的RXD引脚连接到Arduino Uno的数字引脚3(你可以根据自己的需要修改)。
连接温湿度传感器:
- DHT11/DHT22传感器的VCC引脚连接到Arduino Uno的5V引脚。
- DHT11/DHT22传感器的GND引脚连接到Arduino Uno的GND引脚。
- DHT11/DHT22传感器的DATA引脚连接到Arduino Uno的数字引脚4(你可以根据自己的需要修改)。
连接LCD1602液晶显示屏:
- LCD1602液晶显示屏的VSS引脚连接到Arduino Uno的GND引脚。
- LCD1602液晶显示屏的VDD引脚连接到Arduino Uno的5V引脚。
- LCD1602液晶显示屏的VO引脚连接到一个10K的电位器,电位器的另外两个引脚分别连接到5V和GND,用于调节显示屏的对比度。
- LCD1602液晶显示屏的RS引脚连接到Arduino Uno的数字引脚7(你可以根据自己的需要修改)。
- LCD1602液晶显示屏的EN引脚连接到Arduino Uno的数字引脚8(你可以根据自己的需要修改)。
- LCD1602液晶显示屏的D4引脚连接到Arduino Uno的数字引脚9(你可以根据自己的需要修改)。
- LCD1602液晶显示屏的D5引脚连接到Arduino Uno的数字引脚10(你可以根据自己的需要修改)。
- LCD1602液晶显示屏的D6引脚连接到Arduino Uno的数字引脚11(你可以根据自己的需要修改)。
- LCD1602液晶显示屏的D7引脚连接到Arduino Uno的数字引脚12(你可以根据自己的需要修改)。
- LCD1602液晶显示屏的A引脚连接到一个限流电阻(例如220欧姆),然后连接到5V引脚,用于点亮背光。
- LCD1602液晶显示屏的K引脚连接到GND引脚。
连接蜂鸣器:
- 蜂鸣器的正极连接到Arduino Uno的数字引脚6(你可以根据自己的需要修改)。
- 蜂鸣器的负极连接到Arduino Uno的GND引脚。
温馨提示: 在连接电路时,一定要仔细核对每个引脚的连接是否正确,避免接错导致元件损坏。如果你对电路连接不太熟悉,可以参考一些在线的电路图或者视频教程。
3. 编写代码
电路连接完成后,我们就开始编写代码了。代码是这个项目的灵魂,它控制着各个传感器的数据读取、处理和显示,以及蜂鸣器的报警功能。
#include <SoftwareSerial.h>
#include <DHT.h>
#include <LiquidCrystal.h>
// 定义PM2.5传感器引脚
#define PM25_RX_PIN 2
#define PM25_TX_PIN 3
// 定义温湿度传感器引脚
#define DHT_PIN 4
#define DHT_TYPE DHT11 // DHT11 or DHT22
// 定义LCD1602液晶显示屏引脚
const int rs = 7, en = 8, d4 = 9, d5 = 10, d6 = 11, d7 = 12;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// 定义蜂鸣器引脚
#define BUZZER_PIN 6
// 定义PM2.5超标阈值
#define PM25_THRESHOLD 75 // 可根据实际情况调整
SoftwareSerial pm25Serial(PM25_RX_PIN, PM25_TX_PIN);
DHT dht(DHT_PIN, DHT_TYPE);
// 定义PM2.5数据结构
typedef struct {
uint16_t frame_header;
uint16_t frame_length;
uint16_t concentration_pm1_0_cf1;
uint16_t concentration_pm2_5_cf1;
uint16_t concentration_pm10_cf1;
uint16_t concentration_pm1_0_std;
uint16_t concentration_pm2_5_std;
uint16_t concentration_pm10_std;
uint16_t particles_0_5um;
uint16_t particles_1_0um;
uint16_t particles_2_5um;
uint16_t particles_5_0um;
uint16_t particles_10um;
uint16_t data_end;
uint16_t checksum;
} PMS5003Data;
PMS5003Data pm25Data;
void setup() {
// 初始化串口通信
Serial.begin(9600);
pm25Serial.begin(9600);
// 初始化LCD1602液晶显示屏
lcd.begin(16, 2);
lcd.print("Initializing...");
// 初始化温湿度传感器
dht.begin();
// 设置蜂鸣器引脚为输出模式
pinMode(BUZZER_PIN, OUTPUT);
delay(2000);
lcd.clear();
}
void loop() {
// 读取PM2.5数据
if (readPM25Data()) {
// 读取温湿度数据
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// 显示数据到LCD1602液晶显示屏
lcd.setCursor(0, 0);
lcd.print("PM2.5: ");
lcd.print(pm25Data.concentration_pm2_5_cf1);
lcd.print(" ug/m3");
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.print(temperature);
lcd.print("C H:");
lcd.print(humidity);
lcd.print("%");
// 判断PM2.5是否超标
if (pm25Data.concentration_pm2_5_cf1 > PM25_THRESHOLD) {
// 发出警报
tone(BUZZER_PIN, 1000); // 发出1000Hz的声音
delay(500);
noTone(BUZZER_PIN); // 停止声音
} else {
noTone(BUZZER_PIN); // 停止声音
}
} else {
Serial.println("Failed to read PM2.5 data");
lcd.clear();
lcd.print("PM2.5 Error");
delay(2000);
lcd.clear();
}
delay(1000); // 延时1秒
}
// 读取PM2.5数据函数
bool readPM25Data() {
static uint8_t frame[10];
static uint8_t index = 0;
uint8_t data;
while (pm25Serial.available() > 0) {
data = pm25Serial.read();
if (index == 0 && data != 0x42) {
continue;
}
if (index == 1 && data != 0x4d) {
index = 0;
continue;
}
frame[index++] = data;
if (index == 32) {
index = 0;
uint16_t checksum_calculated = 0;
for (uint8_t i = 0; i < 30; i++) {
checksum_calculated += frame[i];
}
checksum_calculated = 65536 - checksum_calculated;
uint16_t checksum_received = frame[30] << 8 | frame[31];
if (checksum_calculated == checksum_received) {
pm25Data.frame_header = frame[0] << 8 | frame[1];
pm25Data.frame_length = frame[2] << 8 | frame[3];
pm25Data.concentration_pm1_0_cf1 = frame[4] << 8 | frame[5];
pm25Data.concentration_pm2_5_cf1 = frame[6] << 8 | frame[7];
pm25Data.concentration_pm10_cf1 = frame[8] << 8 | frame[9];
pm25Data.concentration_pm1_0_std = frame[10] << 8 | frame[11];
pm25Data.concentration_pm2_5_std = frame[12] << 8 | frame[13];
pm25Data.concentration_pm10_std = frame[14] << 8 | frame[15];
pm25Data.particles_0_5um = frame[16] << 8 | frame[17];
pm25Data.particles_1_0um = frame[18] << 8 | frame[19];
pm25Data.particles_2_5um = frame[20] << 8 | frame[21];
pm25Data.particles_5_0um = frame[22] << 8 | frame[23];
pm25Data.particles_10um = frame[24] << 8 | frame[25];
pm25Data.data_end = frame[26] << 8 | frame[27];
pm25Data.checksum = frame[28] << 8 | frame[29];
return true;
} else {
Serial.println("Checksum error!");
return false;
}
}
}
return false;
}
代码解析:
- 引入库: 首先,我们需要引入
SoftwareSerial.h
、DHT.h
和LiquidCrystal.h
这三个库,分别用于串口通信、温湿度传感器和液晶显示屏的控制。 - 定义引脚: 接下来,我们需要定义各个传感器和元件连接到Arduino Uno的引脚,方便我们在代码中进行调用。
- 定义PM2.5超标阈值: 我们可以根据自己的需要,定义一个PM2.5超标的阈值,当PM2.5浓度超过这个阈值时,蜂鸣器就会发出警报。
- 初始化: 在
setup()
函数中,我们需要初始化串口通信、液晶显示屏和温湿度传感器,并设置蜂鸣器引脚为输出模式。 - 主循环: 在
loop()
函数中,我们需要不断地读取PM2.5、温度和湿度等数据,并将数据实时显示在液晶显示屏上。同时,我们还需要判断PM2.5是否超标,如果超标,就发出警报。 - 读取PM2.5数据函数:
readPM25Data()
函数用于读取PM2.5传感器的数据,并进行校验,确保数据的准确性。
温馨提示: 你可以将上面的代码复制到Arduino IDE中,并根据自己的实际情况进行修改。例如,你可以修改PM2.5超标阈值,或者修改各个传感器连接到Arduino Uno的引脚。
4. 上传代码
代码编写完成后,我们需要将代码上传到Arduino Uno开发板中。步骤如下:
- 连接Arduino Uno和电脑: 使用USB数据线将Arduino Uno开发板连接到电脑。
- 选择开发板和端口: 在Arduino IDE中,选择正确的开发板型号(Arduino Uno)和端口号(可以在设备管理器中查看)。
- 上传代码: 点击Arduino IDE中的“上传”按钮,将代码上传到Arduino Uno开发板中。
温馨提示: 在上传代码时,如果遇到任何问题,可以参考Arduino IDE的官方文档或者在线的教程。
5. 运行测试
代码上传完成后,我们的空气质量监测器就基本完成了。接下来,我们可以进行运行测试,看看它是否能够正常工作。
- 观察液晶显示屏: 观察液晶显示屏是否能够正常显示PM2.5、温度和湿度等数据。
- 测试报警功能: 将空气质量监测器放到一个PM2.5浓度较高的环境中(例如吸烟的房间),观察蜂鸣器是否能够发出警报。
如果一切正常,那么恭喜你,你已经成功制作了一个简易的空气质量监测器!
6. 进阶玩法
如果你对这个项目感兴趣,还可以进行一些进阶的玩法,例如:
- 增加数据存储功能: 可以将监测到的数据存储到SD卡或者云端,方便我们进行长期的数据分析。
- 增加无线通信功能: 可以使用WiFi或者蓝牙模块,将数据发送到手机或者电脑上,实现远程监控。
- 制作更美观的外壳: 可以使用3D打印或者其他材料,制作一个更美观的外壳,让你的空气质量监测器更加实用和美观。
7. 总结
通过这次DIY,我们不仅学习了如何使用Arduino制作一个实用的空气质量监测器,还了解了空气质量监测的基本原理。希望这篇文章能够帮助你更好地了解身边的空气状况,为自己和家人的健康保驾护航!
动手能力强,或者对电子制作感兴趣的朋友,不妨尝试一下,相信你一定会有意想不到的收获!