构建一个基于Arduino的空气质量监测系统

描述

呼吸清洁、健康的空气对我们的健康至关重要,但在许多环境中,空气质量仍然是一个问题。在本文中,我们将深入探讨如何创建一个基于Arduino的空气质量监测系统。我们将从讨论各种组件开始,然后继续讨论其MQ135传感器与Arduino板的接口,然后是编码。所以,让我们直接进入它。

什么是AQI传感器或空气质量指数传感器?

空气质量指数 (AQI)是一种标准化的测量方法,用于传达特定时间特定区域的空气污染程度或清洁程度。它提供了一种易于理解的方式向公众传达有关空气质量的信息。

AQI通常考虑全球环境机构监管的几种主要空气污染物,如地面臭氧、颗粒物(PM2.5和PM10)、一氧化碳(CO)、二氧化硫(SO2)和二氧化氮(NO2)。每种污染物都有自己的规模和阈值水平,这些水平决定了AQI值。

AQI 量表范围从 0 到 500,特定类别表示与空气质量相关的健康问题水平:

0 至 150:正常至中度污染-该范围包括大多数人认为可以接受的空气质量条件,偶尔会关注高端的敏感人群。

151 至 200:较差-每个人都可能开始受到健康影响,敏感人群更有可能受到严重影响。

201 到 300:非常糟糕 -紧急情况的健康警告。整个人口都可能受到影响,并可能产生严重的健康影响。

301 至 500:有毒 - 健康警报:由于空气质量极差,每个人都可能会受到更严重的健康影响。

对于这个项目,我们不会测量PM2.5和PM10,但如果你想了解更多信息,你可以检查AQI监测系统,并在以后将其作为这个项目的升级。

空气质量监测系统如何工作?

空气质量监测系统利用传感器来检测气体水平、温度和湿度等环境参数。具体来说,来自气体传感器的模拟读数连接到Arduino的模拟引脚,提供有关空气质量的数据。这些读数映射到预定义的阈值,将空气质量分类为“好”、“差”、“非常差”或“有毒”。同时,DHT11传感器可测量湿度和温度。收集的数据使用 Adafruit 库实时显示在 OLED
屏幕上。通过持续监测这些参数,该系统提供了空气质量状况的快照,使用户能够评估和应对环境的变化。

此项目所需的组件包括:

Arduino开发板

MQ135气体传感器,用于检测各种气体。

DHT11温湿度传感器

用于视觉输出的OLED显示屏

面包板和跳线

Arduino空气质量监测系统电路图

完整的空气质量监测系统项目连接如下,OLED、DHT11 和 MQ135 气体传感器连接到面包板上的 Arduino Uno。

Arduino

arduino在SDA和SCL引脚的帮助下,使用I2C协议连接到OLED。MQ135 气体传感器输出模拟信号,这些信号发送到 Arduino
的模拟输入引脚 A0。DHT11 传感器有一个数字数据输出引脚,连接到 Arduino 的 D2 引脚。

以下是项目在面包板上连接后的外观。

Arduino

基于Arduino的空气质量监测系统代码解释

该代码监测空气质量并在OLED显示屏上显示传感器读数(温度、湿度和气体水平)。让我们分解一下:

#include < SPI.h >
#include < Wire.h >
#include < Adafruit_GFX.h >
#include < Adafruit_SSD1306.h >
#include < dht.h >

这些产品线包括通信协议(SPI、有线)、图形处理(Adafruit_GFX)、OLED显示控制(Adafruit_SSD1306)和DHT传感器的必要库。

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 4

为OLED显示器的宽度、高度和复位引脚定义常量。

Adafruit_SSD1306显示器(SCREEN_WIDTH、SCREEN_HEIGHT和电线、OLED_RESET);

创建一个名为 Adafruit_SSD1306 类型的 display
对象,以使用指定的宽度、高度、通信(Wire)和复位引脚来控制 OLED 显示器。

#define sensor A0
#define DHT11PIN 2

为连接到气体传感器(传感器)的模拟引脚和连接到 DHT11 传感器
(DHT11PIN) 的引脚定义常数。

int gasLevel = 0;
String quality = "";
dht DHT;

声明变量以存储气体水平和质量描述,并创建 DHT 传感器的实例 DHT。

void sendSensor() {
 // Function to read temperature and humidity from the DHT sensor
int readData = DHT.read11(DHT11PIN);
      float h = DHT.humidity;
      float t = DHT.temperature;

      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("%");
}

此功能用于读取DHT传感器的温度和湿度数据,并将其显示在OLED屏幕上。

void air_sensor() {
gasLevel = analogRead(sensor);

      if(gasLevel< 151){
        quality = "  GOOD!";
      }
      else if (gasLevel >151 && gasLevel< 200){
        quality =  "  Poor!";
  }
      else if (gasLevel >200 && gasLevel< 300){
        quality  = "Very bad!";
  }
        else if (gasLevel >300 && gasLevel< 500){
        quality  = "Toxic!";
  }
        else{
        quality = " Toxic";   
}
  display.setTextColor(WHITE);
  display.setTextSize(1);  
  display.setCursor(1,5);
  display.setFont();
  display.println("Air Quality:");
  display.setTextSize(1);
  display.setCursor(5,23);
  display.println(gasLevel);
  
  display.setCursor(20,23);
  display.println(quality);  
}
This function is defined to read gas levels from the analog pin connected to the gas sensor and determine the air quality based on predefined thresholds. It also displays the gas level and quality on the OLED screen.

void setup() {
 Serial.begin(9600);
  pinMode(sensor,INPUT);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c)) { // Address  0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
}
  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(1.5);
  display.setCursor(20, 20);
  display.println("BY Circuit");
  display.setCursor(20, 40);
  display.println("Digest");
  display.display();
  delay(1000);
  display.clearDisplay(); 

}

设置功能初始化串行通信,将传感器引脚设置为输入,并初始化OLED显示屏。它在屏幕上显示介绍性消息。

void loop() {
display.clearDisplay();
air_sensor();
sendSensor();
display.display();  

}

循环功能清除显示屏,使用定义的功能读取气体传感器和 DHT
传感器数据,并使用最新读数不断更新显示屏。

该代码实质上是初始化传感器,读取其数据,根据气体水平确定空气质量,并在OLED屏幕上循环显示所有信息。

#include
#include
#include
#include
#include
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define sensor A0
#define DHT11PIN 2

int gasLevel = 0; //int variable for gas level
String quality ="";
dht DHT;

void sendSensor()
{
int readData = DHT.read11(DHT11PIN);
float h = DHT.humidity;
float t = DHT.temperature;

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<151){
quality = " GOOD!";
}
else if (gasLevel >151 && gasLevel<200){
quality = " Poor!";
}
else if (gasLevel >200 && gasLevel<300){
quality = "Very bad!";
}
else if (gasLevel >300 && gasLevel<500){
quality = "Toxic!";
}
else{
quality = " Toxic";
}

display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(1,5);
display.setFont();
display.println("Air Quality:");
display.setTextSize(1);
display.setCursor(5,23);
display.println(gasLevel);

display.setCursor(20,23);
display.println(quality);
}

void setup() {
Serial.begin(9600);
pinMode(sensor,INPUT);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
}
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(1.5);
display.setCursor(20, 20);
display.println("BY Circuit");
display.setCursor(20, 40);
display.println("Digest");
display.display();
delay(1000);
display.clearDisplay();
}

void loop() {
display.clearDisplay();
air_sensor();
sendSensor();
display.display();
}

审核编辑:陈陈

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分