一板网电子技术论坛

风筝
发表于: 2020-12-29 15:50:32 | 显示全部楼层

现今大气中二氧化碳浓度的不断增加已经成为一个严重的问题。根据NOAA报告,臭氧中的CO2浓度已达到0.0385%(385 ppm),是210万年来的最高浓度。这意味着在一百万个空气颗粒中,有385个二氧化碳颗粒。二氧化碳含量的上升严重影响了环境,使我们面临气候变化和全球变暖等情况。道路上安装了许多空气质量测量设备来测量CO2的浓度,但是我们也可以自制一个CO2测量设备并将其安装在我们的区域中。


在本篇文章中,我们将把Gravity红外CO2传感器与Arduino连接,以测量CO2浓度。Gravity红外CO2传感器是一种高精度的模拟CO2传感器。它测量的CO2含量在0至5000 ppm的范围内。


所需的组件

●    Arduino Nano开发板

●    Gravity红外CO2传感器V1.1

●    跳线

●    0.96英寸SPI OLED显示模块

●    面包板


Gravity红外CO2传感器

Gravity-Infrared-CO2-Sensor.jpg

Gravity红外CO2传感器V1.1(Gravity Infrared CO2 Sensor)是DFRobot发布的最新高精度模拟红外二氧化碳传感器。该传感器基于非分散红外(NDIR)技术,具有良好的选择性和无氧依赖性。它集成了温度补偿并支持DAC输出。该传感器的有效测量范围为0至5000ppm,精度为±50ppm + 3%。该红外CO2传感器可用于HVAC、室内空气质量监测、工业过程和安全保护监测、农业和畜牧业生产过程监测。


红外CO2传感器的引脚排列:

Infrared-CO2-Sensor-Pinout.jpg

如前所述,红外CO2传感器带有一个3针的连接器。


0.96英寸OLED显示模块

OLED(有机发光二极管)是一种自发光技术,通过在两个导体之间放置一系列有机薄膜制成的。当电流施加到这些膜时,产生亮光。 OLED使用的技术与电视相同,但像素比大多数电视都要少。

OLED-Display-Module.jpg

对于本文,我们使用的是单色7引脚SSD1306 0.96英寸OLED显示屏。它可以在三种不同的通信协议上工作:SPI 3线模式、SPI四线模式和I2C模式。引脚及其功能在下表中说明:


电路原理图

下面给出了用于Arduino与Gravity模拟红外CO2传感器连接的电路图:

Interfacing-Gravity-Infrared-CO2-Sensor-with-Arduino.jpg

电路非常简单,因为我们仅需要将重Gravity红外CO2传感器、OLED显示模块与Arduino Nano连接在一起。红外CO2传感器和OLED显示模块均由+ 5V和GND供电。 CO2传感器的信号(模拟输出)引脚连接到Arduino Nano的A0引脚。由于OLED显示模块使用SPI通信,因此我们在OLED模块和Arduino Nano之间建立了SPI通信。


根据电路图连接硬件后,其效果应如下所示:

Arduino-Interfacing-with-Gravity-Infrared-CO2-Sensor.jpg


测量CO2浓度的Arduino代码

该代码使用了Adafruit_GFX和Adafruit_SSD1306库。这些库可以从Arduino IDE的库管理器中下载并从那里安装。为此,请打开Arduino IDE并转到Sketch > Include Library > Manage Libraries。现在搜索Adafruit GFX并安装Adafruit的Adafruit GFX库。

Adafruit-GFX-Library_0.png


同样,通过Adafruit安装Adafruit SSD1306库。红外CO2传感器不需要任何库,因为我们直接从Arduino的模拟引脚读取电压值。


将库安装到Arduino IDE之后,首先在代码中包含所需的库文件。

  1. #include <SPI.h>
  2. #include <Adafruit_GFX.h>
  3. #include <Adafruit_SSD1306.h>
复制代码

然后,定义OLED的宽度和高度。在本文中,我们使用的是128×64 SPI OLED显示屏。您可以根据自己的显示更改SCREEN_WIDTH和SCREEN_HEIGHT变量。

  1. #define SCREEN_WIDTH 128
  2. #define SCREEN_HEIGHT 64
复制代码

然后定义连接OLED显示屏的SPI通信引脚。

  1. #define OLED_MOSI   9
  2. #define OLED_CLK   10
  3. #define OLED_DC    11
  4. #define OLED_CS    12
  5. #define OLED_RESET 13
复制代码

然后,使用前面通过SPI通信协议定义的宽度和高度创建一个Adafruit显示实例。

  1. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
复制代码

之后,定义连接二氧化碳传感器的Arduino引脚。

  1. int sensorIn = A0;
复制代码

现在,在setup()函数中,以9600的波特率初始化串口监视器,以进行调试。同样,使用begin()函数初始化OLED显示屏。

  1. Serial.begin(9600);
  2. display.begin(SSD1306_SWITCHCAPVCC);
  3. analogReference(DEFAULT);
复制代码

在loop()函数中,首先调用AnalogRead()函数在Arduino的Analog引脚上读取信号值。之后,将这些模拟信号值转换为电压值。

  1. void loop(){
  2.   int sensorValue = analogRead(sensorIn);
  3.   float voltage = sensorValue*(5000/1024.0);
复制代码

之后,比较电压值。如果电压为0 V,则表示传感器发生了一些问题。如果电压大于0 V但小于400 V,则表示传感器仍处于预热过程中。

  1. if(voltage == 0)
  2.   {
  3.     Serial.println("Fault");
  4.   }
  5.   else if(voltage < 400)
  6.   {
  7.     Serial.println("preheating");
  8.   }
复制代码

如果电压等于或大于400 V,则将其转换为CO2浓度值。

  1. else
  2.   {
  3.     int voltage_diference=voltage-400;
  4.     float concentration=voltage_diference*50.0/16.0;
复制代码

之后,使用setTextSize()和setTextColor()设置文本大小和文本颜色。

  1. display.setTextSize(1);
  2. display.setTextColor(WHITE);
复制代码

然后在接下来的代码中,使用setCursor(x,y) 函数定义文本开始的位置。然后使用display.println()函数在OLED显示屏上打印CO2值。

  1.     display.println("CO2");
  2.     display.setCursor(63,43);
  3.     display.println("(PPM)");
  4.     display.setTextSize(2);
  5.     display.setCursor(28,5);
  6.     display.println(concentration);
复制代码

最后,调用display()函数在OLED显示屏上显示文本。

  1. display.display();
  2. display.clearDisplay();
复制代码

使用Arduino测试Gravity红外CO2传感器的连接

一旦硬件和代码准备就绪,就可以测试传感器了。将Arduino连接到笔记本电脑,选择Board和Port,然后单击上载按钮。然后打开串口监视器,等待一段时间(预热过程),然后您将看到最终数据。

Arduino-Serial-Monitor.png


这些值将显示在OLED显示屏上,如下所示:

Gravity-Infrared-CO2-Sensor-with-Arduino.jpg


注意:在使用传感器之前,让传感器加热约24小时以获取正确的PPM值。首次给传感器供电时,输出的CO2浓度为1500 PPM至1700PPM,经过24小时的加热过程后,输出的CO2浓度降低至450 PPM至500 PPM,这是正确的PPM值。因此有必要在使用传感器测量CO2浓度之前对其进行校准。


以上就是使用红外CO2传感器测量空气中准确的CO2浓度的方式。如果您有任何疑问,请随时在本帖下面进行回复。

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 580 | 回复: 1168



手机版|

GMT+8, 2021-10-26 09:34 , Processed in 0.030686 second(s), 6 queries , MemCache On. Powered by Discuz! X3.4

YiBoard一板网 © 2015-2021 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表