Ардуино датчик mq 135 подключение. Датчик углекислого газа MQ135 — подключение к STM32. Вариант калибровки датчика и преобразования показаний в ppm

Способны определять концентрацию широкого спектра газов в воздухе (природные газы, углекислый и угарный газ, углеводороды, дым, пары спирта и бензина).

  • Аналоговый выход модуля «S» (Signal) - подключается к любому аналоговому входу Arduino и предназначен для снятия показаний модуля.
  • Цифровой вход модуля «EN» (Enable) - подключается к любому выходу Arduino и предназначен для управления режимами работы модуля («1» - активный режим, «0» - режим энергосбережения).
  • Если вход «EN» оставить неподключённым, то модуль будет находиться в активном режиме пока есть питание.

Модуль удобно подключать 3 способами, в зависимости от ситуации:

Способ - 1: Используя проводной шлейф и Piranha UNO

Используя провода «Папа - Мама », подключаем напрямую к контроллеру Piranha UNO.


Способ - 2: Используя Trema Set Shield

Модуль можно подключить к любому из аналоговых входов Trema Set Shield.



Способ - 3: Используя проводной шлейф и Shield

Используя 3-х проводной шлейф, к Trema Shield, Trema-Power Shield, Motor Shield, Trema Shield NANO и тд.



Питание:

Входное напряжение питания 5 В постоянного тока, подаётся на выводы «V» (Vcc) и «G» (GND) модуля.

Подробнее о модуле:

Уровень напряжения на аналоговом выходе «S» (Signal) прямо пропорционален концентрации детектируемых газов. Цифровой вход «EN» (Enable) можно не использовать - тогда модуль будет работать постоянно.

Если подключить вход модуля «EN» к любому выходу Arduino, то модулем можно управлять: логическая «1» подключит нагревательный элемент датчика к шине питания и модуль будет регистрировать концентрацию газов, логический «0» отключит нагревательный элемент и модуль перейдёт в режим энергосбережения.

Примеры:

Пример для Типа подключения 1:

int8_t gasPin = A0; // Определяем номер вывода, к которому подключен модуль void setup() { Serial.begin(9600); // Инициируем передачу данных на скорости 9600 бит/сек pinMode(gasPin, INPUT); // назначаем вывод, к которому подключен датчик, работать в режиме входа } void loop() { Serial.print("Gas volume: "); // выводим текст в монитор порта Serial.println(analogRead(gasPin)); // выводим значение с датчика delay(1000); // ждём секунду }

Пример для Типа подключения 2:

int8_t gasPin = A0; // Определяем номер вывода, к которому подключен модуль int8_t gasPwr = 8; // Определяем номер вывода, к которому подключено управление нагревателя модуля void setup() { Serial.begin(9600); // Инициируем передачу данных на скорости 9600 бит/сек pinMode(gasPin, INPUT); // назначаем вывод, к которому подключен датчик, работать в режиме входа } void loop() { if (analogRead(gasPin) < 550) { // если значение с датчика ниже порога, то digitalWrite(gasPwr, LOW); // выключаем питание с нагревателя и Serial.println("GasPwr OFF"); // выводим текст в монитор порта } else { // если значение с датчика выше порога, то digitalWrite(gasPwr, HIGH); // включаем питание нагревателя, Serial.print("Gas volume: "); // выводим текст в монитор порта Serial.println(analogRead(gasPin)); // выводим значение с датчика } delay(1000); // ждём секунду }

Датчик качества воздуха MQ-135. Датчик позволяет определить концентрацию различных газов в воздухе и таким образом можно вычислить насколько воздух качественный. Чем выше напряжение на выводе, тем выше уровень загрязняющих газов. В датчике MQ135 используется оксид олова низкой проводимости (SnO2).
Так же датчик пожно использовать как детектор газов аммиака, сульфида, паров бензола, детектор дыма и других газов.

Область применения

Зонд для дома, устройство для определения характеристик окружающей среды и обнаружения вредных газов, детектор аммиака, соединений серы, паров бензола, дыма и других газов. Чувствительный элемент работает в диапазоне концентраций: от 10 до 1000ppm

Характеристики

Двухстороннмй монтаж, индиктор питания
Два режима выода данных: D0 TTL уровень и A0 аналоговый
Выход сигнала TTL с компортатора низкого уровня, позволяет подключить датчик непосредственно к контроллеру
Аналоговый выход 0 ~ 5 В, выходное напряжение, чем выше концентрация, тем выше напряжение
Монтажные отверстия для крепления
Размер: 32мм X22mm X27mm
Сенсор: MQ-135
Рабочее напряжение: 5 В постоянного тока
Длительный срок службы, высокая надежность

Премечание: после включения датчик должен прогрется не менее 20 секунд. При работе датчик должен быть теплым - это нормально.

Распиновка

1. VCC: положительный источник питания (5V)
2. GND: отрицательный источник питания
3. DO: выход сигнала компаратора TTL
4. AO: аналоговый выход сигнала

Датчик качества воздуха MQ-135 Отзывы:

Отзывы: 1 , Оценка: 5.00

Оценка: 5

Сначала каждый будет задаваться вопросами как работать с этим датчиком, рекомендую прочесть статью - https://www.olegkravec.space/%D0%BE%D1%82%D0%BA%D0%B0%D0%BB%-
D0%B8%D0%B1%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C-%D0%B4%D0%B0-
%D1%82%D1%87%D0%B8%D0%BA-%D1%83%D0%B3%D0%BB%D0%B5%D0%BA%D0%B-
8%D1%81%D0%BB%D0%BE%D0%B3/

Подключение и настройка

Датчик газа MQ-135 подключается к управляющей электронике по 5 проводам. Для подключения используются два . Для быстрого подключения модуля к Iskra JS или Arduino используйте . С можно обойтись без лишних проводов.

Примеры программ для Arduino

Для обладателей платформ Arduino выведем в Serial-порт текущее значение вредных газов в ppm , управляя нагревателем. Для запуска примера скачайте и установите библиотеку TroykaMQ .

mq135Heater.ino #include #define PIN_MQ135 A0 // имя для пина, к которому подключен нагреватель датчика #define PIN_MQ135_HEATER 11 // создаём объект для работы с датчиком // и передаём ему номер пина выходного сигнала и нагревателя Serial.begin (9600 ) ; // включаем нагреватель mq135.heaterPwrHigh () ; Serial.println ("Heated sensor" ) ; } void loop() { // если прошёл интервал нагрева датчика // и калибровка не была совершена if (! mq135.isCalibrated () && mq135.heatingCompleted () ) { mq135.calibrate () ; // если известно сопротивление датчика на чистом воздухе // mq135.calibrate(160); Serial.print ("Ro = " ) ; Serial.println (mq135.getRo () ) ; } // если прошёл интевал нагрева датчика // и калибровка была совершена if (mq135.isCalibrated () && mq135.heatingCompleted () ) { Serial.print ("\t CO2: " ) ; Serial.print (mq135.readCO2 () ) ; Serial.println (" ppm" ) ; delay(100 ) ; } }

К платам Arduino c 5 вольтовой логикой датчик можно подключить используя всего один . Для этого установите перемычку на разъём «выбор питания нагревателя».

Выведем в Serial-порт текущее значение вредных газов в ppm , при этом нагреватель всегда включён.

mq135.ino // библиотека для работы с датчиками MQ (Troyka-модуль) #include // имя для пина, к которому подключен датчик #define PIN_MQ135 A0 // создаём объект для работы с датчиком и передаём ему номер пина MQ135 mq135(PIN_MQ135) ; void setup() { // открываем последовательный порт Serial.begin (9600 ) ; // перед калибровкой датчика прогрейте его 60 секунд // выполняем калибровку датчика на чистом воздухе mq135.calibrate () ; // при знании сопративления датчика на чистом воздухе // можно его указать вручную, допустим 160 // mq135.calibrate(160); // выводим сопротивление датчика в чистом воздухе (Ro) в serial-порт Serial.print ("Ro = " ) ; Serial.println (mq135.getRo () ) ; } void loop() { // выводим отношения текущего сопротивление датчика // к сопротивлению датчика в чистом воздухе (Rs/Ro) Serial.print ("Ratio: " ) ; Serial.print (mq135.readRatio () ) ; // выводим значения газов в ppm Serial.print ("\t CO2: " ) ; Serial.print (mq135.readCO2 () ) ; Serial.println (" ppm" ) ; delay(100 ) ; }

Описание

Универсальный датчик, обнаруживающий в воздухе бензол, спирт, пыль, дым. Аналого - цифровой модуль позволяет как получать данные о содержании газов к которым восприимчив газоанализатор, так и работать напрямую с устройствами, выдавая цифровой сигнал о превышении/уменьшении порогового значения. Имеет регулятор чувствительности, что позволяет подстраивать датчик под нужды конкретного проекта. Модуль имеет два светодиода: первый (красный) - индикация питания, второй (зеленый) - индикация превышения/уменьшения порогового значения.

Основным рабочим элементом датчика является нагревательный элемент, за счет которого происходит химическая реакция, в результате которой получается информация о концентрации газа. В процессе работы датчик должен нагреваться - это нормально. Также необходимо помнить, что за счет нагревательного элемента, датчик потребляет большой ток, поэтому рекомендуется использовать внешнее питание.

Обратите внимание, что показания датчика подвержены влиянию температуры и влажности окружающего воздуха. Поэтому в случае использования датчика в изменяющейся среде, будет необходима компенсация этих параметров.

Диапазон измерений: 0,001 - 0,1 %

Технические характеристики

    Напряжение питания: 5 В

    Потребляемый ток: 150 мА

    Время прогрева при включении: 1 мин

Физические размеры

    Модуль (Д х Ш х В): 35 х 20 х 21 мм

Плюсы использования

    Высокая чувствительность

    Короткое время отклика

    Удобный в использовании модуль за счет наличия цифрового и аналогового выводов

Минусы использования

    Перед использованием требует долгого прогрева (не менее 24 часов)

    Для снятия показаний требуется прогрев (не менее 1 минуты)

    Высокое энергопотребление (желательно дополнительное питание)

Пример подключения и использования

В примере демонстрируется подключение датчика и вывод полученных данных в монитор Serial - порта. (Пример тестировался на контроллере Smart UNO)

Схема подключения:

Скетч для загрузки:

const int analogSignal = A0; //подключение аналогового сигналоьного пина const int digitalSignal = 8 ; //подключение цифрового сигнального пина boolean noGas; //переменная для хранения значения о присутствии газа int gasValue = 0 ; //переменная для хранения количества газа void setup() { pinMode (digitalSignal, INPUT ) ; //установка режима пина Serial .begin (9600 ) ; //инициализация Serial порта } void loop() { noGas = digitalRead (digitalSignal) ; //считываем значение о присутствии газа gasValue = analogRead (analogSignal) ; // и о его количестве //вывод сообщения Serial .print ("There is " ) ; if (noGas) Serial .print ("no gas" ) ; else Serial .print ("gas" ) ; Serial .print (", the gas value is " ) ; Serial .println (gasValue) ; delay (1000 ) ; //задержка 1 с }

Один из факторов влияющих на эффективность работы является концентрация CO 2 в воздухе. Для оценки качества воздуха в помещениях есть готовые решения, но нам было интересно разработать свое решение и интегрировать его в используемую систему мониторинга Zabbix .

За основу была взята плата NodeMCU на базе микроконтроллера ESP8266 . Данное решение "из коробки" позволяет подключиться к сети Wi-Fi и организовать прием/передачу данных.

Для определения CO 2 используется недорогое [и не точное] решение - датчик MQ-135 . Данный датчик чувствителен к ряду газов в т.ч. и к CO 2 , библиотека для Arduino IDE содержит в себе функции для пересчета показаний датчика в ppm . Изыскания показали, что вычисляемые значения ppm с реальной концентрацией ничего общего не имеет, соответственно для оценки качества воздуха целесообразно использовать значения на аналоговом выходе модуля MQ-135, которые растут по мере повышения концентрации газов в воздухе. Показания этого датчика чувствительны к питанию, датчик необходимо продержать включенным не менее суток для прокаливания и есть основания предполагать, что выдаваемые значения будут различными для разных экземпляров датчика. Так же показания датчика зависят от температуры и влажности окружающей среды.

Для передачи данных в Zabbix без использования агента используется функция мониторинга веб-страниц, которая позволяет обратиться по заданному URL, получить код ответа и проверить наличие на странице определенного текста. При этом производится замер времени передачи данных и скорость. Единственный простой способ передачи данных от NodeMCU без использования агента на отдельном ПК, это передача значений в коде ответа веб-страницы:

  1. http://ip/ - URL возвращает HTML-страницу с текущими значениями параметров, страница автоматически обновляется с заданным интервалом;
  2. http://ip/a - URL возвращает значение с датчика MQ135;
  3. http://ip/t - URL возвращает значение с датчика DHT11/22;
  4. http://ip/h - URL возвращает значение с датчика DHT11/22.
Код ответа "HTTP/1.1 [значение] OK"
HTTP/1.1 235 OK

Что позволило нам построить графики и поставить триггеры на выход параметров за пределы пороговых.

Подключение MQ135 и DHT-11 к NodeMCU

Изначально стоит определится с питанием. Исходя из информации в Сети и опыта работы MQ135 в силу необходимости нагрева чувствительного элемента потребляет ток до 800 мА, при этом его рабочее напряжение 5 В. NodeMCU работает с напряжением в 3.3 В, использует 3 В логику и выдает максимум 12 мА на пин. Текущая реализация показала, что используемые модули толерантны к логике на 3 В.

Приведенный ниже код основан на примере NodeMCU Server.

Библиотека MQ135 содержит функцию расчета скорректированного значения показаний датчика с поправкой на влажность и температуру. При реальном использовании выяснилось, что при включении увлажнителя в помещении с увеличением влажности росли и показания датчика, что приводило к срабатыванию триггера в Zabbix. Расчет поправочного коэффициента производится по формуле:
k=CORA * t * t - CORB * t + CORC - (h-33.)*CORD , где CORA, CORB, CORC и CORD постоянные, заданные в начале программы.

#include #include #include "DHT.h" #include "Wire.h" #define CORA 0.00035 #define CORB 0.02718 #define CORC 1.39538 #define CORD 0.0018 #define DHTPIN 4 #define DHTTYPE DHT22 #define MQ135APIN A0 #define SOUNDPIN 5 #define LIMIT 360 DHT dht(DHTPIN, DHTTYPE); const char* ssid = "SSID"; const char* password = "PASSWORD"; const boolean debug = 1; float t = 0; float h = 0; float ppmRaw = 0; int timeOut = 0; int count = 0; String header = ""; String footer = ""; String s = ""; WiFiServer server(80); extern "C" { #include "user_interface.h" bool wifi_set_sleep_type(sleep_type_t); sleep_type_t wifi_get_sleep_type(void); } void setup() { pinMode(SOUNDPIN, OUTPUT); if (debug==1) { Serial.begin(115200); delay(10); }; Wire.begin(2, 0); delay(10); dht.begin(); delay(10); if (debug==1) { Serial.println(); Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); }; WiFi.mode(WIFI_STA); wifi_set_sleep_type(NONE_SLEEP_T); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); if (debug==1) Serial.print("."); } server.begin(); if (debug==1) { Serial.println(""); Serial.println("WiFi connected"); Serial.println("Server started"); Serial.println(WiFi.localIP()); }; header = "HTTP/1.1 200 OK\r\n"; header = header + "Content-Type: text/html\r\n\r\n"; header = header + " \r\n"; header = header + " \r\n"; header = header + " \r\n"; header = header + " "; header = header + " NodeMCU \r\n"; header = header + " \r\n"; header = header + " \r\n"; footer = " \r\n"; footer = footer + " \r\n"; } void loop() { h = dht.readHumidity(); t = dht.readTemperature(); if (h == 0.00 or isnan(h)) { h = dht.readHumidity(); }; if (t == 0.00 or isnan(t)) { t = dht.readTemperature(); }; ppmRaw = analogRead(MQ135APIN)*(CORA * t * t - CORB * t + CORC - (h-33.)*CORD); if (ppmRaw>LIMIT) { tone(SOUNDPIN, 100, 10); }; if (debug==1) { Serial.print("H: "); Serial.println(h); Serial.print("t: "); Serial.println(t); Serial.print("Air: "); Serial.println(ppmRaw); Serial.println(WiFi.status()); }; WiFiClient client = server.available(); if (!client) { delay(1000); return; }; if (debug == 1) Serial.println("new client"); while(!client.available()){ delay(1); timeOut = timeOut +1; if (timeOut>=15) { // 500 client.stop(); client.flush(); timeOut = 0; return; // break }; } String req = client.readStringUntil("\r"); if (debug==1) { Serial.println(req); } client.flush(); float heap = ESP.getFreeHeap(); if (req.indexOf("/favicon.ico") != -1) { s = "HTTP/1.1 404 Not found\r\n"; client.print(s); } else if (req.indexOf("/t") != -1) { String answer="HTTP/1.1 " + String(t) + " OK\r\n"; client.print(answer); } else if (req.indexOf("/h") != -1) { String answer="HTTP/1.1 " + String(h) + " OK\r\n"; client.print(answer); } else if (req.indexOf("/a") != -1) { String answer="HTTP/1.1 " + String(ppmRaw) + " OK\r\n"; client.print(answer); } else { client.print(header); client.print(t); client.println("°"); if (h "); client.print(h); client.print(""); } else { client.print(h); }; client.println("%"); client.print(" Air "); client.println(ppmRaw); client.println(footer); client.stop(); client.flush(); return; } delay(1); if (debug==1) Serial.println("Client disonnected"); };

7 мая 2017
Версия 0.3 Денис Пак , генеральный директор
gastroguru © 2017