HOOOS

用Arduino自制空气质量监测器?手把手教你!

0 14 爱折腾的Geek Arduino空气质量监测DIY
Apple

用Arduino自制空气质量监测器?手把手教你!

你是否也和我一样,每天早上醒来第一件事就是打开手机,看看今天的空气质量如何?尤其是在秋冬季节,雾霾频发,空气质量更是牵动着每个人的心。与其每天被动地接收信息,不如主动出击,自己动手制作一个空气质量监测器,实时了解身边的空气状况,为自己和家人的健康保驾护航!

今天,我就来手把手教你如何使用Arduino制作一个简易的空气质量监测器,它可以实时监测PM2.5、温度和湿度等数据,并在超标时发出警报。别担心,即使你没有任何电子基础,也能轻松上手!

1. 准备材料

在开始制作之前,我们需要准备以下材料:

  • Arduino Uno开发板: 这是我们的大脑,负责处理各种传感器的数据,并控制显示屏和蜂鸣器。
  • PM2.5传感器(例如:PMS5003): 用于检测空气中PM2.5的浓度,是空气质量监测的核心部件。
  • 温湿度传感器(例如:DHT11或DHT22): 用于检测空气的温度和湿度,可以更全面地了解空气状况。
  • LCD1602液晶显示屏: 用于显示PM2.5、温度和湿度等数据,方便我们实时查看。
  • 蜂鸣器: 当PM2.5超标时,发出警报,提醒我们注意空气质量。
  • 杜邦线若干: 用于连接各个传感器和Arduino开发板。
  • 面包板: 用于搭建电路,方便连接各个元件。
  • USB数据线: 用于连接Arduino开发板和电脑,进行程序上传和调试。

温馨提示: 你可以在淘宝、京东等电商平台购买到以上所有材料,一套下来大概只需要几十块钱,非常划算。

2. 连接电路

准备好材料后,我们就开始连接电路了。别担心,这并不难,只需要按照下面的步骤一步一步来,就能轻松完成。

  1. 连接PM2.5传感器:

    • PMS5003传感器的VCC引脚连接到Arduino Uno的5V引脚。
    • PMS5003传感器的GND引脚连接到Arduino Uno的GND引脚。
    • PMS5003传感器的TXD引脚连接到Arduino Uno的数字引脚2(你可以根据自己的需要修改)。
    • PMS5003传感器的RXD引脚连接到Arduino Uno的数字引脚3(你可以根据自己的需要修改)。
  2. 连接温湿度传感器:

    • DHT11/DHT22传感器的VCC引脚连接到Arduino Uno的5V引脚。
    • DHT11/DHT22传感器的GND引脚连接到Arduino Uno的GND引脚。
    • DHT11/DHT22传感器的DATA引脚连接到Arduino Uno的数字引脚4(你可以根据自己的需要修改)。
  3. 连接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引脚。
  4. 连接蜂鸣器:

    • 蜂鸣器的正极连接到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.hDHT.hLiquidCrystal.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开发板中。步骤如下:

  1. 连接Arduino Uno和电脑: 使用USB数据线将Arduino Uno开发板连接到电脑。
  2. 选择开发板和端口: 在Arduino IDE中,选择正确的开发板型号(Arduino Uno)和端口号(可以在设备管理器中查看)。
  3. 上传代码: 点击Arduino IDE中的“上传”按钮,将代码上传到Arduino Uno开发板中。

温馨提示: 在上传代码时,如果遇到任何问题,可以参考Arduino IDE的官方文档或者在线的教程。

5. 运行测试

代码上传完成后,我们的空气质量监测器就基本完成了。接下来,我们可以进行运行测试,看看它是否能够正常工作。

  1. 观察液晶显示屏: 观察液晶显示屏是否能够正常显示PM2.5、温度和湿度等数据。
  2. 测试报警功能: 将空气质量监测器放到一个PM2.5浓度较高的环境中(例如吸烟的房间),观察蜂鸣器是否能够发出警报。

如果一切正常,那么恭喜你,你已经成功制作了一个简易的空气质量监测器!

6. 进阶玩法

如果你对这个项目感兴趣,还可以进行一些进阶的玩法,例如:

  • 增加数据存储功能: 可以将监测到的数据存储到SD卡或者云端,方便我们进行长期的数据分析。
  • 增加无线通信功能: 可以使用WiFi或者蓝牙模块,将数据发送到手机或者电脑上,实现远程监控。
  • 制作更美观的外壳: 可以使用3D打印或者其他材料,制作一个更美观的外壳,让你的空气质量监测器更加实用和美观。

7. 总结

通过这次DIY,我们不仅学习了如何使用Arduino制作一个实用的空气质量监测器,还了解了空气质量监测的基本原理。希望这篇文章能够帮助你更好地了解身边的空气状况,为自己和家人的健康保驾护航!

动手能力强,或者对电子制作感兴趣的朋友,不妨尝试一下,相信你一定会有意想不到的收获!

点评评价

captcha
健康