Увеличивающаяся концентрация углекислого газа в атмосфере с каждым годом становится все более серьезной проблемой для человечества. Согласно данным такой авторитетной организации как NOAA, концентрация углекислого газа (CO2) достигла уровня 0.0385% (385 ppm), что является самым высоким значением за последние 2.1 миллиона лет. Концентрация 385 ppm означает, что в одном миллионе частиц воздуха содержится 385 частиц углекислого газа.
Возрастающая концентрация CO2 может оказать существенное негативное влияние на климат всей нашей планеты и может привести к новому глобальному потеплению.
В этой статье мы рассмотрим подключение аналогового инфракрасного датчика гравитации CO2 (Gravity Infrared CO2 Sensor) к плате Arduino для измерения концентрации углекислого газа в окружающем воздухе в единицах PPM (parts per million – частиц на миллион). Инфракрасный датчик гравитации CO2 представляет собой аналоговый высокоточный датчик CO2 (углекислого газа). Он измеряет содержание CO2 в диапазоне от 0 до 5000 ppm. Также на нашем сайте вы можете посмотреть следующие проекты по измерению качества воздуха и присутствию в нем различных газов:
- анализатор качества воздуха с определением частиц PM2.5 и PM10 на Arduino и датчике SDS011;
- измерение TVOC и CO2 с помощью Arduino и датчика качества воздуха CCS811;
- детектор алкоголя (алкотестер) на Arduino;
- измерение уровня аммиака в воздухе с помощью датчика газа MQ-137 и Arduino;
- детектор дыма на Arduino и датчике газа MQ2;
- система мониторинга загрязнения воздуха на основе Arduino.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress).
- Инфракрасный датчик гравитации CO2 (Gravity Infrared CO2 Sensor V1.1) (купить на AliExpress).
- 0.96’ SPI OLED Display Module – модуль OLED дисплея с диагональю 0.96’ и поддержкой интерфейса SPI (купить на AliExpress - если будете покупать по приведенной ссылке, то выбирайте модель OLED дисплея с 7 контактами).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Инфракрасный датчик гравитации CO2
Gravity Infrared CO2 Sensor V1.1 (инфракрасный датчик гравитации CO2) представляет собой один из новейших высокоточных аналоговых датчиков углекислого газа, выпускаемый компанией DFRobot (www.dfrobot.com - на ее сайте я достаточно много интересного для себя обнаружил, может быть, и вас заинтересует). Принцип работы датчика основан на технологии недисперсионного инфракрасного излучения (NDIR). Датчик имеет хорошую избирательность, температурную компенсацию, бескислородную зависимость и имеет выход ЦАП (цифро-аналогового преобразователя). Эффективный диапазон измерений датчика составляет от 0 до 5000ppm с точностью ± 50ppm + 3%. Данный инфракрасный датчик углекислого газа может использоваться в системах отопления, кондиционирования и вентиляции, а также во многих других сферах, в которых необходим контроль за качеством воздуха.
Датчик имеет 3-контактный разъем. Назначение контактов (распиновка) датчика показаны на следующем рисунке.
Назначение контактов инфракрасного датчика CO2:
- Signal: выход аналогового сигнала в диапазоне 0.4~2V;
- VCC: питающее напряжение (4.5~5.5V);
- GND: общий провод (земля).
Технические характеристики инфракрасного датчика CO2:
- обнаруживаемый газ: углекислый газ (CO2);
- рабочее напряжение: 4.5 ~ 5.5V DC;
- время предварительного прогрева: 3 минуты;
- время отклика: 120 секунд;
- диапазон рабочих температур: 0 ~ 50 ℃;
- влажность (при которой может работать датчик): 0 ~ 95% RH;
- водозащищенное и антикоррозийное исполнение;
- длительный срок службы.
Модуль OLED дисплея (0.96’ OLED Display Module)
OLED (Organic Light-Emitting Diodes, органический светоизлучающий диод) – это светоизлучающая технология, которая применяется в большинстве современных телевизоров. В OLED дисплеях используется тот же принцип формирования изображения, что и в современных телевизорах, только количество пикселей в них значительно меньше.
Для нашего проекта мы использовали монохромный 7-ми контактный OLED дисплей SSD1306 с диагональю 0.96”. Он может использовать 3 различных коммуникационных протокола: 3-х проводный SPI, 4-х проводный SPI и I2C.
Назначение его контактов (распиновка) приведены в следующей таблице.
Номер контакта | Название контакта | Альтернативное название контакта | Назначение контакта |
1 | Gnd | Ground | земля |
2 | Vdd | Vcc, 5V | напряжение питания (в диапазоне 3-5 В) |
3 | SCK | D0, SCL, CLK | используется как контакт синхронизации (clock pin). Применяется в интерфейсах I2C и SPI |
4 | SDA | D1, MOSI | контакт данных. Применяется в интерфейсах I2C и SPI |
5 | RES | RST, RESET | контакт сброса модуля. Применяется в интерфейсе SPI |
6 | DC | A0 | контакт команд (Data Command pin). Применяется в интерфейсе SPI |
7 | CS | Chip Select (выбор чипа) | используется когда несколько устройств взаимодействуют по интерфейсу SPI |
Подключение данного дисплея к плате Arduino рассматривалось в этой статье, а все проекты с использованием данного дисплея на нашем сайте вы можете посмотреть по следующей ссылке.
Технические характеристики OLED дисплея SSD1306:
- драйвер микросхемы OLED: SSD1306;
- разрешение: 128 x 64;
- угол зрения: >160°;
- входное напряжение: 3.3V ~ 6V;
- цвет пикселов: синий;
- диапазон рабочих температур: -30°C ~ 70°C.
Схема проекта
Схема подключения инфракрасного датчика CO2 к плате Arduino представлена на следующем рисунке.
Как видите, схема достаточно простая. Инфракрасный датчик CO2 и OLED дисплей запитываются от контактов +5V и GND платы Arduino. Сигнальный аналоговый контакт датчика CO2 подключен к контакту A0 платы Arduino Nano. OLED дисплей подключен к плате Arduino по интерфейсу SPI. Соединения между OLED дисплеем и платой Arduino представлены в следующей таблице:
OLED дисплей | Плата Arduino |
GND | Ground |
VCC | 5V |
D0 | 10 |
D1 | 9 |
RES | 13 |
DC | 11 |
CS | 12 |
После сборки проекта на макетной плате у нас получилась конструкция следующего вида:
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
В коде программы используются библиотеки Adafruit_GFX и Adafruit_SSD1306. Эти библиотеки можно скачать и установить с помощью менеджера библиотек (Library Manager) Arduino IDE. Для этого откройте Arduino IDE и выберите в ней пункт меню Sketch > Include Library > Manage Libraries. После этого выполните в открывшемся окне поиск библиотеки Adafruit GFX и установите ее (библиотека от компании Adafruit).
Аналогичным образом установите библиотеку Adafruit SSD1306 от компании Adafruit. Для работы с инфракрасным датчиком CO2 нам не потребуется никакой библиотеки поскольку мы будем непосредственно считывать значения от него на аналоговом контакте платы Arduino.
Далее в коде программы подключим заголовочные файлы используемых библиотек.
1 2 3 |
#include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> |
Затем зададим ширину (SCREEN_WIDTH) и высоту (SCREEN_HEIGHT) используемого OLED дисплея. Измените их значения если будете использовать дисплей другого размера. Используемый нами OLED дисплей имеет размеры 128×64.
1 2 |
#define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 |
После этого укажем контакты SPI интерфейса, к которым подключен OLED дисплей.
1 2 3 4 5 |
#define OLED_MOSI 9 #define OLED_CLK 10 #define OLED_DC 11 #define OLED_CS 12 #define OLED_RESET 13 |
Затем создадим объект дисплея с необходимыми нам параметрами.
1 |
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); |
Далее укажем контакт платы Arduino, к которому подключен инфракрасный датчик CO2.
1 |
int sensorIn = A0; |
После этого в функции setup() инициализируем последовательную связь со скоростью 9600 бод для целей отладки и инициализируем OLED дисплей.
1 2 3 |
Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC); analogReference(DEFAULT); |
Внутри функции loop() мы будем считывать значения с аналогового контакта платы Arduino с помощью функции analogRead(). Далее мы эти значения будем преобразовывать в значения напряжения.
1 2 3 |
void loop(){ int sensorValue = analogRead(sensorIn); float voltage = sensorValue*(5000/1024.0); |
После этого мы будем проверять измеренное значение напряжения с выхода датчика. Если значение напряжения менее 0 V это будет означать что с датчиком какие то проблемы. Если значение напряжения более 0 V, но менее 400 mV, это значит что датчик еще находится в режиме предварительного нагрева.
1 2 3 4 5 6 7 8 |
if(voltage == 0) { Serial.println("Fault"); } else if(voltage < 400) { Serial.println("preheating"); } |
Если значение напряжения равно или больше чем 400 mV, то мы преобразуем его в значение концентрации CO2 (углекислого газа).
1 2 3 4 |
else { int voltage_diference=voltage-400; float concentration=voltage_diference*50.0/16.0; |
После этого установим размер шрифта и цвет текста на OLED дисплее с помощью функций setTextSize() и setTextColor().
1 2 |
display.setTextSize(1); display.setTextColor(WHITE); |
Затем установим положение курсора на дисплее с помощью функции setCursor(x,y). И, наконец, выведем значение концентрации CO2 на экран дисплея с помощью функции display.println().
1 2 3 4 5 6 |
display.println("CO2"); display.setCursor(63,43); display.println("(PPM)"); display.setTextSize(2); display.setCursor(28,5); display.println(concentration); |
Чтобы отобразить текст на экране дисплея вызовем функцию display().
1 2 |
display.display(); display.clearDisplay(); |
Тестирование работы проекта
После того как аппаратная часть проекта будет готова, можно приступать к его тестированию. Подключите плату Arduino к компьютеру, выберите в Arduino IDE необходимый порт и вид платы, и загрузите программу в плату Arduino. Потом подождите некоторое время (пока завершится процесс предварительного прогрева датчика) и откройте окно монитора последовательной связи (serial monitor) – в нем вы должны увидеть следующую картину:
Также значения концентрации CO2 должны отображаться на экране OLED дисплея.
Примечание: перед первым использованием датчика дайте ему прогреться примерно в течение 24 часов чтобы после этого он показывал правильные значения концентрации CO2 в единицах PPM. Когда мы включили этот датчик в первый раз, он показывал значения концентрации CO2 в диапазоне от 1500 PPM до 1700PPM и только после 24 часового прогрева он стал показывать значения концентрации CO2 в диапазоне от4 50 PPM до 500 PPM, что является правильными значениями. Поэтому важно откалибровать датчик перед его дальнейшим использованием.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
int sensorIn = A4; #include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // ширина OLED дисплея в пикселах #define SCREEN_HEIGHT 64 // высота OLED дисплея в пикселах // контакты, к которым подключен OLED дисплей по интерфейсу SPI (default case): #define OLED_MOSI 9 #define OLED_CLK 10 #define OLED_DC 11 #define OLED_CS 12 #define OLED_RESET 13 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); void setup(){ Serial.begin(9600); // используем значение опорного напряжения по умолчанию analogReference(DEFAULT); display.begin(SSD1306_SWITCHCAPVCC); display.clearDisplay(); display.display(); } void loop(){ //Read voltage int sensorValue = analogRead(sensorIn); // преобразуем считанное с выхода АЦП значение в напряжение float voltage = sensorValue*(5000/1024.0); if(voltage == 0) { Serial.println("Fault"); } else if(voltage < 400) { Serial.println("preheating"); } else { int voltage_diference=voltage-400; float concentration=voltage_diference*50.0/16.0; // Print Voltage Serial.print("voltage: "); Serial.print(voltage); Serial.println("mv"); //Print CO2 concentration Serial.print("CO2 Concentration: "); Serial.print(concentration); Serial.println("ppm"); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(18,43); display.println("CO2"); display.setCursor(63,43); display.println("(PPM)"); display.setTextSize(2); display.setCursor(28,5); display.println(concentration); display.display(); display.clearDisplay(); } delay(2000); } |