Уровень концентрации углекислого газа (CO2) в атмосфере Земли увеличивается с каждым годом, что косвенно приводит к проблеме глобального потепления. Также углекислый газ играет важную роль в процессах, происходящих в современном мире. Поэтому измерение его концентрации в окружающем воздухе является достаточно важной и актуальной задачей.
В данной статье мы рассмотрим подключение датчика MQ-135 к плате Arduino и измерение с его помощью концентрации углекислого газа (CO2). Ранее на нашем сайте мы уже рассматривали измерение концентрации CO2 с помощью инфракрасного датчика, но инфракрасный датчик достаточно дорого стоит, поэтому в данном проекте мы для измерения концентрации CO2 будем использовать значительно более дешевый датчик MQ-135. Мы уже рассматривали его подключение к плате Arduino в проекте системы мониторинга качества воздуха, но этот проект будет немного отличаться – в нем мы будем использовать для отображения концентрации CO2 OLED дисплей и не будем передавать эти данные в сеть интернет. Также на нашем сайте вы можете посмотреть другие проекты, в которых рассматривается измерение каких либо веществ в окружающем воздухе:
- анализатор качества воздуха с определением частиц PM2.5 и PM10 на Arduino и датчике SDS011;
- измерение TVOC (летучих соединений) и CO2 с помощью Arduino и датчика качества воздуха CCS811;
- детектор алкоголя (алкотестер) на Arduino;
- измерение уровня аммиака в воздухе с помощью датчика газа MQ-137 и Arduino;
- детектор дыма на Arduino и датчике газа MQ2.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress).
- Датчик газа MQ135 (купить на AliExpress).
- 0.96’ SPI OLED Display Module – модуль OLED дисплея с диагональю 0.96’ и поддержкой интерфейса SPI (купить на AliExpress - если будете покупать по приведенной ссылке, то выбирайте модель OLED дисплея с 7 контактами).
- Резистор 22 кОм (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Модуль 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.
Подготовка датчика MQ-135 к измерению углекислого газа
Датчик газа MQ-135 способен обнаруживать широкий диапазон различных газов в окружающем воздухе: NH3, NOx, алкоголь, бензол, дым и углекислый газ (CO2). Датчик MQ-135 можно купить как в виде модуля, так и в виде отдельного датчика. В нашем проекте мы будем использовать его в виде модуля для измерения концентрации CO2 в единицах PPM (parts per million – частей на миллион). Схема модуля датчика MQ-135 показана на следующем рисунке:
В этой схеме весьма важную роль играет нагрузочный резистор RL – его сопротивление может изменяться в зависимости от концентрации газа. В соответствии с даташитом на датчик MQ-135 сопротивление нагрузочного резистора может изменяться от 10 кОм до 47 кОм. Даташит рекомендует чтобы вы калибровали датчик для 100ppm NH3 или для 50ppm концентрации алкоголя в воздухе и использовали значение нагрузочного резистора RL примерно 20 кОм. Но если вы внимательно посмотрите на плату модуля MQ-135, то вы увидите что значение резистора RL на ней составляет 1 кОм (102).
Поэтому, чтобы корректно измерять концентрацию CO2, вам необходимо заменить этот резистор 1 кОм на резистор сопротивлением 22 кОм.
Схема проекта
Схема подключения датчика MQ-135 к плате Arduino представлена на следующем рисунке.
Как видите, схема достаточно проста, в ней необходимо подключить к плате Arduino датчик MQ-135 и OLED дисплей. Датчик газа MQ-135 и OLED дисплей оба запитываются от контактов +5V и GND платы Arduino. Аналоговый выход датчика MQ-135 подключен к контакту A0 платы Arduino Nano. OLED дисплей подключен к плате Arduino Nano по интерфейсу SPI, схема их соединений показана в следующей таблице.
OLED дисплей | Плата Arduino |
GND | Ground |
VCC | 5V |
D0 | 10 |
D1 | 9 |
RES | 13 |
DC | 11 |
CS | 12 |
После сборки схемы на макетной плате у нас получилась конструкция следующего вида:
Расчет значения Ro датчика MQ135
Теперь, когда мы знаем сопротивление резистора RL, давайте рассмотрим как рассчитать значение Ro для чистого воздуха. В нашем проекте бы будем использовать библиотеку MQ135.h для измерения концентрации CO2 в окружающем воздухе. Скачайте указанную библиотеку и дайте датчику MQ-135 прогреться в течение 24 часов перед считыванием значений Ro. После завершения процесса предварительного прогрева используйте следующий код программы для считывания значений Ro:
1 2 3 4 5 6 7 8 9 10 |
#include "MQ135.h" void setup (){ Serial.begin (9600); } void loop() { MQ135 gasSensor = MQ135(A0); // Attach sensor to pin A0 float rzero = gasSensor.getRZero(); Serial.println (rzero); delay(1000); } |
Теперь, когда вы получили значение Ro, откройте папку Documents > Arduino > libraries > MQ135-master, в ней откройте файл MQ135.h и в нем измените значения RLOAD и RZERO.
1 2 3 4 |
///The load resistance on the board (нагрузочный резистор на плате) #define RLOAD 22.0 ///Calibration resistence at atmospheric CO2 level (калибровочное сопротивление для измерения уровня CO2 в атмосфере) #define RZERO 5804.99 |
После этого прокрутите файл вниз и замените в нем значение ATMOCO2 на текущее (в настоящее время) значение концентрации CO2 в атмосфере - 411.29.
1 2 |
///Atmospheric CO2 level for calibration purposes #define ATMOCO2 397.13 |
Объяснение программы для измерения концентрации CO2 с помощью Arduino и датчика MQ-135
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
В коде программы мы будем использовать библиотеки Adafruit_GFX, Adafruit_SSD1306 и MQ135.h. Первые две из них можно скачать и установить с помощью менеджера библиотек (Library Manager) Arduino IDE. Для этого запустите Arduino IDE и в ней откройте пункт меню Sketch < Include Library < Manage Libraries. Откроется окно, в нем запустите поиск Adafruit GFX, после ее нахождения установите библиотеку Adafruit GFX от компании Adafruit.
Аналогичным образом установите библиотеку Adafruit SSD1306 от компании Adafruit. Библиотеку MQ135 можно скачать по этой ссылке.
1 2 3 4 |
#include "MQ135.h" #include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> |
После этого укажем в программе ширину и высоту OLED дисплея, в нашем случае мы используем дисплей 128×64 с поддержкой интерфейса SPI. Вы можете изменить значения SCREEN_WIDTH и SCREEN_HEIGHT если используете OLED дисплей с другим разрешением.
1 2 |
#define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 |
Затем укажем контакты платы Ардуино, к которым дисплей подключен по интерфейсу SPI.
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 |
После этого создадим объект OLED дисплея с необходимыми характеристиками.
1 |
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); |
Затем дадим название контакту, к которому подключен датчик MQ-135.
1 |
int sensorIn = A0; |
После этого в функции setup() инициализируем последовательную связь со скоростью 9600 бод для целей отладки. Также инициализируем OLED дисплей с помощью функции begin().
1 2 3 |
Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC); display.clearDisplay(); |
Внутри функции loop() мы будем считывать значение с выхода датчика MQ-135 на выходе АЦП контакта A0 с помощью функции analogRead().
1 2 |
val = analogRead(A0); Serial.print ("raw = "); |
Затем мы будем вызывать функцию gasSensor.getPPM() для расчета значения углекислого газа в единицах PPM (частей на миллион), которое рассчитывается на основе сопротивления нагрузочного резистора, значения Ro и считанного с контакта A0 значения.
1 2 3 |
float ppm = gasSensor.getPPM(); Serial.print ("ppm: "); Serial.println (ppm); |
После этого установим размер текста и его цвет на OLED дисплее с помощью функций setTextSize() и setTextColor().
1 2 |
display.setTextSize(1); display.setTextColor(WHITE); |
Затем установим позицию курсора с помощью функции setCursor(x,y) и будем выводить значения концентрации CO2 на экран OLED дисплея с помощью функции display.println().
1 2 3 4 5 6 7 |
display.setCursor(18,43); display.println("CO2"); display.setCursor(63,43); display.println("(PPM)"); display.setTextSize(2); display.setCursor(28,5); display.println(ppm); |
И, наконец, вызовем функцию display() для отображения необходимого текста на экране OLED дисплея.
1 2 |
display.display(); display.clearDisplay(); |
Тестирование работы проекта
После того как аппаратная часть проекта будет готова, загрузите программу в плату Arduino. Затем откройте окно монитора последовательной связи (serial monitor) и подождите некоторое время, необходимое для предварительного прогрева датчика. После этого вы в окне монитора последовательной связи сможете наблюдать окончательные (правильные) значения CO2. Также эти значения будут отображаться и на экране OLED дисплея:
Исходный код программы (скетча)
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 |
/* * Interfacing MQ135 Gas Senor with Arduino * Author: Ashish * Website: www.circuitdigest.com * Date: 11-11-2020 */ // сопротивление нагрузочного резистора на плате датчика #define RLOAD 22.0 #include "MQ135.h" #include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // ширина OLED дисплея в пикселах #define SCREEN_HEIGHT 64 // высота OLED дисплея в пикселах // Declaration for SSD1306 display connected using software 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); MQ135 gasSensor = MQ135(A0); int val; int sensorPin = A0; int sensorValue = 0; void setup() { Serial.begin(9600); pinMode(sensorPin, INPUT); display.begin(SSD1306_SWITCHCAPVCC); display.clearDisplay(); display.display(); } void loop() { val = analogRead(A0); Serial.print ("raw = "); Serial.println (val); // float zero = gasSensor.getRZero(); // Serial.print ("rzero: "); //Serial.println (zero); float ppm = gasSensor.getPPM(); Serial.print ("ppm: "); 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(ppm); display.display(); display.clearDisplay(); delay(2000); } |
всем здоровья,а можно сделать выход для управление нагрузкой?
Спасибо, и вам здоровья. Так на любой свободный цифровой контакт цепляйте свою нагрузку и управляйте ей сколько душе угодно. А если вам нужно плавное управление нагрузкой (диммер, к примеру), то тогда используйте ШИМ контакт
Спасибо.
Отличная статья. Вы здесь нормально объяснили принцип работы датчика MQ-135: в плане замены резистора на модуле датчика и калибровки.
Ещё хотелось бы увидеть статьи на тему как с помощью 135-го измерять концентрацию аммиака, бензола и т.д. Ведь датчик позиционируется как многофункциональный. Или все изменения сводятся только к замене резистора и калибровке параметров?
Насколько я знаю, для измерения концентрации аммиака лучше использовать датчик MQ-137, а для измерения уровня бензола лучше подойдет MQ138 если верить данной статье, хотя бензол можно измерять и с помощью MQ-135, но я не знаю как это можно сделать
Понятно.
Тут у братьев-китайцев видимо маркетинговый ход такой.
На самом деле тут был скорее вопрос был исключительно из любопытства, а не прикладной. Всё равно в быту ни аммиака ни бензола я, надеюсь, не увижу.
Спасибо за ответ.
Да ничего страшного. Всегда рад ответить на вопрос если разбираюсь в теме
И снова здравствуйте.
Решил вернутся к теме MQ135, так как собрался сделать себе простую комнатную метеостанцию с измерением СО2 в комнате.
Стал глубже учить матчасть по работе датчика MQ135, и вот что узнал:
1. Данный датчик на самом деле должен быть чувствителен одновременно к аммиаку, бензола, спирту и т.д. Ну и в том числе СО2. Ну поэтому правильней его называть "датчиком качества воздуха", а никак не датчиком СО2
2. Но! Так как в быту столкнутся с повышенной концентрацией бензола, спиртов , аммиака (ну тут разве что в туалете типа "сортир") маловероятно.
Следовательно MQ135 можно применять как дешёвый датчик СО2 (ведь этот газ 4-й по содержанию в земной атмосфере после азота, кислорода и аргона).
3. Но нужно понимать, что даже правильно откалибровав MQ135 под углекислый газ вы будете измерять и наличие всех остальных веществ, к которым датчик чувствителен. Говоря проще - селективности нет. Т.е., например, когда вы решили покрасить, скажем, дверь в комнате - показания резко подскочат из-за растворителей в краске.
4. После прочтения нескольких тем на профильных форумах понял, что мнения по поводу MQ135 в среде ардуинщиков разделились. Часть людей их считает фуфлом за танцы с бубном для того, чтобы они работали +/- нормально и большую погрешность. Другая часть считает, что возможностей этого прибора достаточно, ведь лабораторная точность не нужна в случае когда требуется знать пора ли проветривать комнату. Тем более на готовом модуле есть выход DO, а значит после калибровки с помощью ардуинки, можно с помощью подстроечного резистора добиться сработки при определенной концентрации, следовательно: модуль с MQ135+модуль реле+вентилятор = простейшая автоматизированная система принудительной вентиляции даже без применения микроконтроллера. Ну или если поставить модуль+зуммер = простейшая сигнализация.
4. Серьезный минус датчика MQ135 - довольно высокое энергопотребление (до 150мА), так что потребуется питание через БП от сети.
П.С. Надеюсь мой опус пригодится кому-нибудь, кто захочет поработать с этим датчиком
Добрый вечер. Да, конечно же большое спасибо вам за такой подробный комментарий для нашего сайта
Нужно ещё установить библиотеку Adafruit_BusIO
Почему вы так решили? Для чего нужна библиотека, которую вы порекомендовали?