How mq2 gas/smoke sensor works? & interface it with arduino
Содержание
- 1 Подключение и настройка
- 2 Calibrate MQ2 Gas Sensor Module
- 3 Элементы платы
- 4 What is MQ2 Gas Sensor?
- 5 Элементы платы
- 6 Wiring – Connecting MQ2 Gas Sensor Module to Arduino UNO
- 7 history
- 8 Примеры программ для Arduino
- 9 Install & Setup
- 10 Код Arduino
- 11 Как собрать подобное устройство?
- 12 Скетч: Использование датчика газа вместе с Arduino
- 13 Калибровка модуля датчика газа MQ-2
- 14 Что такое датчик газа MQ-2?
Подключение и настройка
Датчик газа MQ-7 подключается к управляющей электронике по 5 проводам. Для подключения используются два трёхпроводных шлейфа. Для быстрого подключения модуля к Iskra JS или Arduino используйте Troyka Shield.
С Troyka Slot Shield можно обойтись без лишних проводов.
Пример программы для Arduino
- mq7Heater.ino
-
// библиотека для работы с датчиками MQ (Troyka-модуль) #include <TroykaMQ.h> // имя для пина, к которому подключен датчик #define PIN_MQ7 A0 // имя для пина, к которому подключен нагреватель датчика #define PIN_MQ7_HEATER 13 // создаём объект для работы с датчиком // и передаём ему номер пина выходного сигнала и нагревателя MQ7 mq7(PIN_MQ7, PIN_MQ7_HEATER); void setup() { // открываем последовательный порт Serial.begin(9600); // запускаем термоцикл // в течении 60 секунд на нагревательный элемент подаётся 5 вольт // в течении 90 секунд — 1,5 вольта mq7.cycleHeat(); } void loop() { // если прошёл интервал нагрева датчика // и калибровка не была совершена if (!mq7.isCalibrated() && mq7.atHeatCycleEnd()) { // выполняем калибровку датчика на чистом воздухе mq7.calibrate(); // выводим сопротивление датчика в чистом воздухе (Ro) в serial-порт Serial.print("Ro = "); Serial.println(mq7.getRo()); // запускаем термоцикл mq7.cycleHeat(); } // если прошёл интервал нагрева датчика // и калибровка была совершена if (mq7.isCalibrated() && mq7.atHeatCycleEnd()) { // выводим отношения текущего сопротивление датчика // к сопротивлению датчика в чистом воздухе (Rs/Ro) Serial.print("Ratio: "); Serial.print(mq7.readRatio()); // выводим значения газов в ppm Serial.print(" CarbonMonoxide: "); Serial.print(mq7.readCarbonMonoxide()); Serial.println(" ppm "); delay(100); // запускаем термоцикл mq7.cycleHeat(); } }
Calibrate MQ2 Gas Sensor Module
To calibrate the gas sensor you can hold the gas sensor near smoke/gas you want to detect and keep turning the potentiometer until the Red LED on the module starts glowing. Turn the screw clockwise to increase sensitivity or anticlockwise to decrease sensitivity.
The comparator on the module continuously checks if the analog pin (A0) has hit the threshold value set by potentiometer. When it crosses the threshold, the digital pin (D0) will go HIGH and signal LED turns on. This setup is very useful when you need to trigger an action when certain threshold is reached. For example, when the smoke crosses a threshold, you can turn on or off a relay or instruct your robot to blow air/sprinkle water. You got the idea!
Элементы платы
Приоткроем занавес и заглянем на внутренности датчика, а точнее, извлечем плату с элетронными компонентами из корпуса.
Датчик качества воздуха CCS811
Датчик качества воздуха выполнен на чувствительном элементе CCS811. Структурно чип CCS811 состоит из двух основных блоков: датчика MOX (Metal Oxide Semiconductor) и встроенного микроконтроллера с АЦП, который считывает показания внутреннего MOX-сенсора и выдаёт готовые внешнему миру по шине I²C.
Выходные данные:
- Концентрация летучих органических веществ в воздухе (TVOC) в диапазоне 0…1187 ;
- Концентрация эквивалент углекислого газа (eCO2) в диапазоне 400…8192 .
Выходные контакты
Датчик подключается к управляющей электронике через выходной кабель с четырьмя проводниками:
- Питание (V) — красный провод. Соедините с рабочим напряжением микроконтроллера.
- Земля (G) — чёрный провод. Соедините с землёй микроконтроллера.
- Сигнальный (D) — оранжевый провод, пин данных шины I²C. Подключите к пину SDA микроконтроллера.
- Сигнальный (C) — коричневый провод, пин тактирования шины I²C. Подключите к пину SCL микроконтроллера.
Регулятор напряжения 3V3
Линейный понижающий регулятор напряжения NCP582LSQ33 обеспечивает питание чипа CCS811 и других компонентов сенсора. Диапазон входного напряжения от 3,3 до 5 вольт. Выходное напряжение 3,3 В с максимальным выходным током 150 мА.
Преобразователь логических уровней
Преобразователь логических уровней PCA9306 необходим для сопряжения датчика с разными напряжениями логических уровней от 3,3 до 5 вольт. Другими словами сенсор совместим как с 3,3 вольтовыми платами, например, Raspberry Pi, так и с 5 вольтовыми — Arduino Uno.
Смена адреса модуля
Иногда в проекте необходимо использовать несколько сенсоров. Для смена адреса капните каплей припоя на отведённую контактную площадку на обратной стороне модуля. После чего адрес датчика сменится с на .
What is MQ2 Gas Sensor?
MQ2 is one of the commonly used gas sensors in MQ sensor series. It is a Metal Oxide Semiconductor (MOS) type Gas Sensor also known as Chemiresistors as the detection is based upon change of resistance of the sensing material when the Gas comes in contact with the material. Using a simple voltage divider network, concentrations of gas can be detected.
MQ2 Gas sensor works on 5V DC and draws around 800mW. It can detect LPG, Smoke, Alcohol, Propane, Hydrogen, Methane and Carbon Monoxide concentrations anywhere from 200 to 10000ppm.
Here are the complete specifications
Operating voltage | 5V |
Load resistance | 20 KΩ |
Heater resistance | 33Ω ± 5% |
Heating consumption | <800mw |
Sensing Resistance | 10 KΩ – 60 KΩ |
Concentration Scope | 200 – 10000ppm |
Preheat Time | Over 24 hour |
What is 1 ppm equal to?
When measuring gases like carbon dioxide, oxygen, or methane, the term concentration is used to describe the amount of gas by volume in the air. The 2 most common units of measurement are parts-per-million, and percent concentration.
Parts-per-million (abbreviated ppm) is the ratio of one gas to another. For example, 1,000ppm of CO means that if you could count a million gas molecules, 1,000 of them would be of carbon monoxide and 999,000 molecules would be some other gases.
Элементы платы
Датчик газа MQ-2
Датчик MQ-2 относиться к полупроводниковым приборам. Принцип работы датчика основан на изменении сопротивления тонкопленочного слоя диоксида олова SnO2 при контакте с молекулами определяемого газа. Чувствительный элемент датчика состоит из керамической трубки с покрытием Al2O3 и нанесенного на неё чувствительного слоя диоксида олова. Внутри трубки проходит нагревательный элемент, который нагревает чувствительный слой до температуры, при которой он начинает реагировать на определяемый газ. Чувствительность к разным газам достигается варьированием состава примесей в чувствительном слое.
Выбор режима питания нагревателя
В сенсоре предусмотрено два режима работы, переключаемых джампером.
- Нагреватель датчика постоянно включён. Таким образом можно обойтись одним трёхпроводным шлейфом.
- Управление нагревателем программно.
1 группа
- Сигнальный (S) — Выходной сигнал сенсора. Подключите к аналоговому входу микроконтроллера.
- Питание (V) — Питание датчика. Соедините с рабочим напряжением микроконтроллера.
- Земля (G) — Соедините с пином микроконтроллера.
2 группа
- Сигнальный (E) — Управление питанием нагревателя. Подключите к цифровому пину микроконтроллера.
-
Питание (H) — Питание нагревателя. Соедините с пином
- Земля (G) — Соедините с пином микроконтроллера..
Wiring – Connecting MQ2 Gas Sensor Module to Arduino UNO
Now that we have a complete understanding of how MQ2 Gas sensor works, we can begin hooking it up to our Arduino!
Connecting the MQ2 Gas sensor module to the Arduino is pretty easy. Start by placing the sensor on to your breadboard. Connect VCC pin to the 5V pin on the Arduino and connect GND pin to the Ground pin on the Arduino.
Connect D0 output pin on the module to Digital pin#8 on the Arduino and A0 output pin on the module to Analog pin#0 on the Arduino.
When you’re done you should have something that looks similar to the illustration shown below.
Wiring MQ2 Gas Sensor Module with Arduino UNO
So now that we’ve hooked up our gas sensor it’s time to write some code and test it out.
history
- 0.1.0 2018.09.13 first version self-forked from slider.
- 2.0.0 2019.01.18 Add Calibration, ABC on/off requested by this issue. Please refer this wiki.
- 0.3.5 2019.01.22 Both Python2 & Python3 support
- 2.3.6 2019.01.22 Merge Pull Request #3 & Pull Request #4. Thanks David!
- 2.3.7 2019.02.25 Add —all option which requested as issue#5, thanks Rafał!
- 2.3.8 2019.04.16 Merge Pull Request #7. Thanks Alexander!
- 2.3.8.1 2019.04.20 Merge Pull Request #8. Thanks WO15!
- 2.3.8.5 2019.04.21 Merge Pull Request #9. Thanks WO15!
- 2.3.8.6 2019.04.22 Merge Pull Request #10. Thanks WO15!
- 2.4.1 2019.08.11 Add —serial_device option as solution of issue#12. Thanks Actpohomoc and TBR-BRD!
- 2.4.2 2019.12.12 Merge Pull Request #15. Thanks WO15!
- 2.5.1 2020.05.16 Add —serial_console_untouched option to support execution without sudo asked as issue#17. Thanks ralphbe91!
- 2.5.2 2020.06.30 Update the link for datasheet of MH-Z19B from version 1.0 to version 1.5 based be pointed it out as issue#18. Thanks WO15!
- 2.6.1 2020.07.07 Add —detection_range_10000 option to support Set 0~10000ppm detection range asked as issue#19. Thanks WO15!
Примеры программ для Arduino
- mq2Heater.ino
-
// библиотека для работы с датчиками MQ (Troyka-модуль) #include <TroykaMQ.h> // имя для пина, к которому подключен датчик #define PIN_MQ2 A0 // имя для пина, к которому подключен нагреватель датчика #define PIN_MQ2_HEATER 13 // создаём объект для работы с датчиком // и передаём ему номер пина выходного сигнала и нагревателя MQ2 mq2(PIN_MQ2, PIN_MQ2_HEATER); void setup() { // открываем последовательный порт Serial.begin(9600); // включаем нагреватель mq2.heaterPwrHigh(); Serial.println("Heated sensor"); } void loop() { // если прошёл интервал нагрева датчика // и калибровка не была совершена if (!mq2.isCalibrated() && mq2.heatingCompleted()) { // выполняем калибровку датчика на чистом воздухе mq2.calibrate(); // выводим сопротивление датчика в чистом воздухе (Ro) в serial-порт Serial.print("Ro = "); Serial.println(mq2.getRo()); } // если прошёл интервал нагрева датчика // и калибровка была совершена if (mq2.isCalibrated() && mq2.heatingCompleted()) { // выводим отношения текущего сопротивление датчика // к сопротивлению датчика в чистом воздухе (Rs/Ro) Serial.print("Ratio: "); Serial.print(mq2.readRatio()); // выводим значения газов в ppm Serial.print("LPG: "); Serial.print(mq2.readLPG()); Serial.print(" ppm "); Serial.print(" Methane: "); Serial.print(mq2.readMethane()); Serial.print(" ppm "); Serial.print(" Smoke: "); Serial.print(mq2.readSmoke()); Serial.print(" ppm "); Serial.print(" Hydrogen: "); Serial.print(mq2.readHydrogen()); Serial.println(" ppm "); delay(100); } }
К платам Arduino c 5 вольтовой логикой датчик можно подключить используя всего один трёхпроводной шлейф. Для этого установите перемычку на разъём «выбор питания нагревателя».
Выведем в Serial-порт текущее значение вредных газов в , при этом нагреватель всегда включён.
- mq2.ino
-
// библиотека для работы с датчиками MQ (Troyka-модуль) #include <TroykaMQ.h> //имя для пина, к которому подключен датчик #define PIN_MQ2 A0 // создаём объект для работы с датчиком и передаём ему номер пина MQ2 mq2(PIN_MQ2); void setup() { // открываем последовательный порт Serial.begin(9600); // перед калибровкой датчика прогрейте его 60 секунд // выполняем калибровку датчика на чистом воздухе mq2.calibrate(); // выводим сопротивление датчика в чистом воздухе (Ro) в serial-порт Serial.print("Ro = "); Serial.println(mq2.getRo()); } void loop() { // выводим отношения текущего сопротивление датчика // к сопротивлению датчика в чистом воздухе (Rs/Ro) Serial.print("Ratio: "); Serial.print(mq2.readRatio()); // выводим значения газов в ppm Serial.print("LPG: "); Serial.print(mq2.readLPG()); Serial.print(" ppm "); Serial.print(" Methane: "); Serial.print(mq2.readMethane()); Serial.print(" ppm "); Serial.print(" Smoke: "); Serial.print(mq2.readSmoke()); Serial.print(" ppm "); Serial.print(" Hydrogen: "); Serial.print(mq2.readHydrogen()); Serial.println(" ppm "); delay(100); }
Install & Setup
Full Set Install
Full Set include followings:
- Setup script: Install & Setup following useful stuffs as:
- mh-z19: A python module to read mh-z19 sensor.
- PondSlider: A multipurpose versatile sensor handler for python, which read mh-z19 value and handle it.
- autostart.sh: Utility making mh-z19 as system service to act periodically.
Install Full Set, download from release
or
Then, got to the folder and issue setup.sh*
Necessary settings including serial port enabling are taken place in this script.
Install only sensor module
When using python 2.x
When using python 3.x
The differences of the interface between each Raspberry Pi model are resolved inside this module. For example, serial device name is difference between Raspberry Pi 3 and older model, but mh-z19 module automatically detect the model and read from appropriate serial device.
Код Arduino
Код очень прост, и, в основном, он просто читает аналоговое напряжение на выводе A0. При обнаружении дыма он выводит сообщение на мониторе последовательного порта. Посмотрите скетч, прежде чем мы начнем его подробный разбор.
Скетч начинается с определения вывода Arduino, к которому подключен аналоговый вывод датчика газа MQ-2. Переменная под названием определена для хранения значения датчика.
В функции мы инициализируем последовательную связь с ПК и ждем 20 секунд, чтобы дать датчику прогреться.
В функции значение датчика считывается функцией и отображается в мониторе последовательного порта.
Когда концентрация газа достаточно высока, датчик обычно выдает значение, превышающее 300. Мы можем отслеживать это значение с помощью оператора . И когда значение датчика превысит 300, мы отобразим сообщение «Smoke detected!» (Обнаружен дым!).
Вывод в мониторе последовательного порта выглядит так:
Рисунок 13 – Вывод в мониторе последовательного порта скетча для работы с модулем датчика газа MQ-2
Как собрать подобное устройство?
Для начала нужно купить все необходимые модули, например, на aliexpress. Поскольку конкретные предложения и продавцы постоянно меняются, поэтому в таблице указаны лишь поисковые запросы, по которым найдется то, что нужно.
Компонент | Поисковая фраза | Ориентировочная цена |
---|---|---|
Esp-12 NodeMCU модуль* | esp8266 nodemcu cp2102 | $3.50 |
Датчик CO2 mh-z19 | mh-z19 | $22 |
Датчик давления**,*** | bmp280 | $1 |
Датчик температуры и влажности**,*** | gy-21 SI7021 i2c | $2.2 |
Экран | 0.96″ 128×64 i2c OLED blue | $2.7 |
Провода | dupont female-female 10cm | $1 |
3д-печать корпуса | — | $8 |
Итого: | $40.4 |
* — На китайском рынке существуют две версии модуля NodeMCU. Они отличаются в первую очередь USB-UART преобразователем cp2102 и ch340g, но и размером — версия с ch340g шире на 3 мм и уже не влезет в этот корпус. Также, версия с cp2102 может быть интереснее, потому что у этого преобразователя нет проблем с драйверами под любую операционку.
** — В текущей версии использовался bmp-085, который сейчас уже не купить. Но модули с bmp-280 имеют те же размеры и все, что нужно сделать, это заменить используемую библиотеку на https://github.com/adafruit/Adafruit_BMP280_Library — все методы у них одинаковые.
*** — Вместо пары датчиков bmp280+si7021, можно использовать один bme280, который измеряет все три показателя: температуру, влажность и давление. На aliexpress его можно найти за $3.5
Корпус
Хотелось сделать с одной стороны устройство из готовых модулей, с другой не хотелось делать его размером с буханку хлеба. Для этого в Tinkercad был нарисован корпус пригодный для 3д-печати. Большая проблема tinkercad в том, что очень тяжело вносить изменения в уже готовые проекты. Если бы я начинал сейчас, то воспользовался бы openSCAD
Корпус получился действительно компактным, но провода внутри все равно занимают большую часть места и их пришлось сделать довольно короткими, чтобы коробочка закрылась.
Недостаток такой плотной компановки в том, что тепло от микроконтроллера и dc-dc преобразователя нагревают воздух внутри на ~3 градуса выше реальной температуры, это же вредит точности показаний влажности. С другой стороны это создает конвекцию, которая обновляет воздух в сенсоре CO2 быстрее.
Отчасти эту проблему можно решить, поработав над потреблением микроконтроллера, например реже передавать данные по сети.
Скетч: Использование датчика газа вместе с Arduino
Мы сделаем проект, в котором Arduino будет считывать аналоговый сигнал, идущий от датчика, а затем, если концентрация газа достигнет определенного предела, бибикнет зуммером и включит красный светодиод. Однако если концентрация газа будет ниже заданного предела, у Arduino будет гореть зеленый светодиод.
Необходимые компоненты
Для этого проекта нам понадобятся следующие компоненты:
- Один красный светодиод
- Один зеленый светодиод
- Один зуммер
- Три резистора на 220 Ом
- Провода-перемычки
При подключении компонентов пользуйтесь следующей схемой:
Код
1 /******* 2 3 Подробнее о проекте на: 4 http://randomnerdtutorials.com/ 5 6 *******/ 7 8 int redLed = 12; 9 int greenLed = 11; 10 int buzzer = 10; 11 int smokeA0 = A5; 12 // здесь задаем пороговое значение: 13 int sensorThres = 400; 14 15 void setup() { 16 pinMode(redLed, OUTPUT); 17 pinMode(greenLed, OUTPUT); 18 pinMode(buzzer, OUTPUT); 19 pinMode(smokeA0, INPUT); 20 Serial.begin(9600); 21 } 22 23 void loop() { 24 int analogSensor = analogRead(smokeA0); 25 26 Serial.print("Pin A0: "); // "Контакт A0: " 27 Serial.println(analogSensor); 28 // проверяем, не превышено ли пороговое значение: 29 if (analogSensor > sensorThres) 30 { 31 digitalWrite(redLed, HIGH); 32 digitalWrite(greenLed, LOW); 33 tone(buzzer, 1000, 200); 34 } 35 else 36 { 37 digitalWrite(redLed, LOW); 38 digitalWrite(greenLed, HIGH); 39 noTone(buzzer); 40 } 41 delay(100); 42 }
Вот так проект выглядит вживую:
Калибровка модуля датчика газа MQ-2
Чтобы откалибровать датчик газа, вы можете держать датчик газа рядом с дымом/газом, который вы хотите обнаруживать, и поворачивать потенциометр, пока на модуле не начнет светиться красный светодиод. Поворачивайте потенциометр по часовой стрелке, чтобы увеличить чувствительность, или против часовой стрелки, чтобы уменьшить чувствительность.
Рисунок 10 – Потенциометр регулировки чувствительности модуля датчика газа MQ-2
Компаратор на модуле постоянно проверяет, достиг ли аналоговый выходной сигнал (A0) порогового значения, установленного потенциометром. Когда он пересекает пороговое значение, цифровой выход (D0) выдаст высокий логический уровень, и загорится светодиодный индикатор. Эта настройка очень полезна, когда вам нужно при достижении определенного порога запустить какое-то действие. Например, когда концентрация дыма пересекает пороговое значение, вы можете включить или выключить реле или дать команду включить вентиляцию или спринклерную систему пожаротушения.
Что такое датчик газа MQ-2?
MQ-2 является одним из наиболее часто используемых датчиков газа из серии датчиков MQ. Это датчик газа типа металл-оксид-полупроводник (МОП, MOS), также известный как химрезистор (химический резистор), поскольку обнаружение основано на изменении сопротивления чувствительного материала, когда газ вступает в контакт с этим материалом. Используя простую цепь делителя напряжения, можно измерить концентрацию газа.
Рисунок 2 – Датчик газа MQ-2
Датчик газа MQ-2 работает при постоянном напряжении 5 В и потребляет около 800 мВт. Он может обнаруживать концентрации LPG (сжиженного нефтяного газа), дыма, алкоголя, пропана, водорода, метана и угарного газа от 200 до 10000 ppm (миллионных долей).
Чему равен 1 ppm?
При измерении газов, таких как углекислый газ, кислород или метан, термин концентрация используется для описания количества газа по объему в воздухе. Двумя наиболее распространенными единицами измерения являются миллионная доля (ppm) и процентная концентрация.
Миллионная доля (сокращенно ppm) – это соотношение одного газа к другому. Например, 1000 ppm CO означает, что если бы вы могли сосчитать миллион молекул газа, 1000 из них были бы моноокисью углерода, а 999 000 молекул – какими-то другими газами.
Вот полный список технических характеристик:
Рабочее напряжение | 5 В |
Сопротивление нагрузки | 20 кОм |
Сопротивление нагревателя | 33 Ом ± 5% |
Потребляемая мощность | <800 мВт |
Сопротивление чувствительности | 10 кОм — 60 кОм |
Измерение концентрации | 200 — 10000 ppm |
Время разогрева | более 24 часов |
Для более подробной информации, пожалуйста, обратитесь техническому описанию.
Совет
Датчик чувствителен к нескольким газам – но не может сказать, какой из них он обнаружил! Это нормально; большинство датчиков газа такие. Таким образом, он лучше всего подходит для измерения изменений концентрации известного газа, а не для определения концентрация какого газа изменилась.