Кое-что о погоде на Марсе или датчик качества воздуха MQ135. Кое-что о погоде на Марсе или датчик качества воздуха MQ135 Датчик mq 135 описание

Всем привет. Это еще одна статья из разряда ESP8266 + Blynk = . Прошу не воспринимать как рекламу, а только как дань уважения разработчикам платформы Blynk и личный опыт, который может быть полезен кому то еще, кроме меня.

Начало

Идея проекта родилась несколько лет назад, когда в порыве DYI-энтузиазма на Ali был куплен датчик качества воздуха MQ-135 . По спецификации этот датчик реагирует на наличие в воздухе таких веществ как: NH3, NOx, спирт, бензин, дым и CO2 и выдает свою абстрактную оценку качества воздуха на аналоговом выходе [да я знаю, что существуют подстроечные резисторы и способы калибровки, но как то это слишком сложно].

Испытания показали, что на всякие вредные и «вонючие» соединения датчик реагирует отлично, показывая достаточно резкое изменение выходного уровня. Хуже дело обстояло с определением невидимого врага, а именно углекислого газа СО2. Про вред и очевидную повсеместность этого диоксида сказано немало, повторяться не будем.


Поэтому для меня, датчик MQ-135 оказался бесполезным, поскольку не мог «заметить» существенную разницу в качестве воздуха в переполненном людьми помещении и на свежем воздухе. Но вызов был уже принят, поэтому несколько итераций спустя родилась последняя (текущая) версия платы OpenWindAir с ИК-датчиком MH-Z19 [да не идеальный, да китайский]. Подробнее про получившуюся железку и ее аппаратные возможности написано в статье Система сбора данных на ESP. Часть I .

Для задачи измерения уровня углекислого газа в жилом помещении датчик оказался идеальным и оптимальным по цене (1200 рублей на Ali с доставкой) решением.

Blynk - помогает соединить железо, облако и телефон

Про платформу Blynk уже много хорошего сказано, например . Возможности платформы просто удивляют своей продуманностью и удобством использования. Поэтому когда пришло время выбирать среду разработки для ESP8266 и писать программу, выбор сразу пал на Arduino IDE и библиотеку Blynk.

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

Архитектура ПО

Главный плюс разработки ПО под ESP8266 в среде Arduino IDE – что можно совместить в одном скетче совершенно разные библиотеки и вам за это почти ничего не будет.

Перед началом разработки ТЗ было сформулировано тезисно и включало следующие пункты:

1. Необходимо с определенным интервалом считывать показания датчика CO2 (MH-Z19) и отображать результаты с помощью трех (зеленый, желтый, красный) светодиодов. Пределы были выбраны почти с учетом ГОСТ 30494-2011 (Здания жилые и общественные. Параметры микроклимата в помещениях.): до 900 PPM – зеленый , от 901 до 1400 PPM - желтый , выше 1401 PPM - красный . Также у нас есть бипер, порог бибикания которого задан на уровне 1100 PPM, но его можно настроить или вообще отключить через Blynk. Во время отладки выяснилось, что иногда MH-Z19 может глюкануть и выдать свое максимальное значение (в зависимости от установленного предела: 1000, 2000, 3000 или 5000 PPM), вместо фактически измеренного. Это немного осложнило обработку результатов и могло привести к ложным сообщениям пользователю, а нервы пользователя надо беречь. И поскольку нет абсолютно верного (кроме многократных измерений) способа отличить неверно измеренные 2000 PPM (дикое значение для жилого помещения) от ситуации, когда пользователь сидит и специально дышит в датчик. То было принято две меры по маскировке данной проблемы: установлен предел измерения в 2000 PPM (предполагается использование прибора в жилых помещениях и все что больше 1400 для нас уже красная зона) и добавлено усреднение результатов последних 10 измерений. Как итог - единичные ложные срабатывания (на 2000 PPM) не дают больших всплесков на усредненном графике. Но при желании через Blynk можно настроить предел измерения датчика и посмотреть фактическое (не усредненное значение CO2).

2. Для работы с датчиком температуры\влажности (AM2302 ) была использована библиотека DHT Sensor Library от Adafruit. Было сделано два небольших изменения: добавил повторное считывание AM2302 (иногда считывается не с первого раза) и введены поправочные коэффициенты для значений температуры и влажности. Если используется встроенный датчик, то опытным путем установлено, что воздух внутри прибора «суше» на 15% и теплее на 2 градуса C (1 градус F) чем снаружи, при использовании выносного датчика (выбирается джампером) - поправку в измеренные результаты вносить не надо и можно отключить.

3. Пользователь должен иметь возможность настроить устройство (подключиться к WiFi, указать auth token и тд) без дополнительного софта или перепрошивки. Наиболее оптимальным решением стало использование библиотеки WiFiManager , которая переводит ESP в режим точки доступа и позволяет через Captive портал сохранить во флешку настройки WiFi сети и другие параметры.


В дальнейшем при старте библиотека пытается подключится к сохраненной WiFi точке и в случае неудачи снова переходит в режим точки доступа и Captive портала. А если пользователь вдруг не захочет использовать Blynk или у него не окажется WiFi-роутера, то в этом случае OpenWindAir никогда на загрузится и будет только стартовать в AP-режиме и перезагружаться по таймауту.

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

If (!wifiManager.autoConnect("OpenWind - tap to config")){ if (mqtt_server != "\0" || blynk_token != "\0"){ Serial.println("Failed to go online for Blynk and MQTT, restarting.."); ESP.restart(); } else{ Serial.println("Failed to go online, offline mode activated"); online = false; }

4. Blynk требует подключения к Интернету (если сервер не локальный) и поэтому необходимо контролировать наличие подключения к WiFi. Библиотека WiFiManager на данный момент не умеет восстанавливать соединение с WiFi и если в квартире «моргнет» свет и роутер перезагрузится, то восстановить подключение ESP8266 к WiFi поможет только перезагрузка. Поэтому пришлось добавить простой таймер, который через 60 непрерывных секунд отсутствия коннекта перезагрузит устройство.

If (WiFi.status() != WL_CONNECTED && online){ if (!wifilost_flag){ wifilost_timer_start = uptime; wifilost_flag = true; } if (((uptime - wifilost_timer_start) > wifilost_timer_max) && wifilost_flag){ Serial.print("\n\rWiFi connection lost, restarting.."); wifilost_flag = false; ESP.restart(); } }
5. В качестве альтернативы использования Blynk пользователь может выбрать отправку показаний по протоколу MQTT на сервер Народного мониторинга или любого другого подобного сервиса. Для этих целей была выбрана библиотека PubSubClient , которая написана на наиболее понятном мне языке Си и единственная (из представленных в каталоге Arduino IDE), которая имела понятные примеры.

6. Перепрошивка устройства дело хоть и не частое и не очень сложное (особенно при наличии встроенного CP2102 ), но все равно захотелось максимально упростить этот процесс. Библиотека ArduinoOTA позволяет легко загрузить новый бинарник и прошить его. Активировать ОТА можно как кнопкой на устройстве, так и удаленно через телефон. Однако без сюрпризов не обошлось, оказывается мной были куплены модули ESP8266-12E с разным размером файловой системы (SPIFFS).

Примерное распределение Flash

Внешне не отличимые модули ESP8266-12E могут иметь файловую систему размером 1 или 3 Мб и требовать разные прошивки (опции сборки в Arduino IDE). Поэтому, чтобы избежать возможных проблем, при загрузке надо проверять фактический размер памяти и при ОТА апгрейде запрашивать на сервере соответствующий бинарник (пока не сделано). Или можно пойти чуть более простым путем и собирать все прошивки под SPIFFS c меньшим номиналом 1 Мб, т. к. они вполне работают на ESP8266-12E c большим объемом памяти.

Для таких проверок в SDK есть удобные функции позволяющие определить размер фактической и выбранной в IDE памяти.

String realSize = String(ESP.getFlashChipRealSize()); String ideSize = String(ESP.getFlashChipSize()); bool flashCorrectlyConfigured = realSize.equals(ideSize); if(flashCorrectlyConfigured){ Serial.println("flash correctly configured, SPIFFS starts, IDE size: " + ideSize + ", match real size: " + realSize); } else{ Serial.println("flash incorrectly configured, SPIFFS cannot start, IDE size: " + ideSize + ", real size: " + realSize); }
7. Чтобы самому не путаться в разных версиях ПО и отличать их друг от друга, был немного переписан файл arduino-1.8.5\hardware\platform.txt от Arduino IDE так, чтобы во время компиляции запускался bat файл, который делает копию текущего скетча и полученного бинарника, а также автоматически инкрементирует номер версии.

Recipe.hooks.sketch.prebuild.0.pattern=D:\arduino-1.8.5\hardware\increment.bat {build.path} {build.source.path} {build.project_name}
Таким образом, после каждой сборки\прошивки имеем зашитый в бинарнике номер версии и копию скетча с таким же номером. А если папку со скетчем положить в Dropbox - то получится самодельная система контроля версий.

Инструкция по настройке автоинкремента версии для Arduino IDE и bat-файл выложены на гитхабе.

8. Ну а раз есть встроенный USB-UART переходник (с драйвером для CP2102 нет никаких проблем в Windows и Linux), то нельзя было не добавить вывод результатов измерений через Терминал (на скорости 9600). Раз в двадцать секунд выводятся результаты измерений и сообщения об ошибках.

Reading MHZ19 sensor: ok
Reading DHT22 sensor: ok

Humidity: 36.20%
Temperature: 27.20C \ 83.56F
C02: 1153 ppm
C02 average: 462 ppm
ADC: 99
UpTime: 0 days, 0 hours, 3 minutes, 45 seconds.
Time: 16:25:56 20/3/2018
===================================================

А по нажатию кнопки Enter можно получить сообщение с системной информацией.
======SYSTEM-STATUS================================
Device name: OpenWindAir
Software version: 0.1.235
FreeHeap: 33824
ChipId: 13704617
FlashChipId: 1405167
FlashChipSize: 4194304
FlashChipSpeed: 40000000
CycleCount: 2204474679
Time: 16:27:6 20/3/2018
UpTime: 295
======BLYNK-STATUS=================================
Blynk token:
Blynk connected: 1
Notify level: 1100
Beep: 1
CO2 limit: 2000
Temperature correction: 1
======NETWORK-STATUS===============================
WiFi network: adakta2
WiFi status: 3
RSSI: -70
MAC: 18FE34D11DA9
IP: 192.168.0.152
Online: 1
======MQTT-STATUS==================================
MQTT server:narodmon.ru
MQTT port:1883
MQTT login:login
MQTT key:key
MQTT topics:
/OpenWindAir/h
/OpenWindAir/t
/OpenWindAir/f
/OpenWindAir/ppm
/OpenWindAir/status
======END-of-STATUS================================

Самая неприятная проблема

Самое неприятное с чем пришлось столкнуться при разработке, это когда при одновременной отправке результатов измерений на сервер MQTT и в Blynk, часть данных может начать теряться и не доходить до сервера. Как оказалось, на то, чтобы подключиться к серверу MQTT и отправить данные - может понадобиться несколько секунд и за это время библиотека Blynk успевает потерять соединение со своим сервером и в результате если вручную не инициировать переподключение к серверу - может пройти достаточно много времени и часть результатов измерений потеряется. Пришлось добавить проверку состояния WiFi клиента _blynkWifiClient и случае отсутствия коннекта делать принудительный стоп _blynkWifiClient.stop(), а потом подключаться к серверу Blynk заново.

If (WiFi.status() == WL_CONNECTED){ wifilost_flag = false; if (blynk_token != "\0"){ if (Blynk.connected() && _blynkWifiClient.connected()){ Blynk.run(); } else{ Serial.print("\n\rReconnecting to blynk.. "); Serial.print(Blynk.connected()); if (!_blynkWifiClient.connected()){ _blynkWifiClient.stop(); Return _blynkWifiClient.connect(BLYNK_DEFAULT_DOMAIN, BLYNK_DEFAULT_PORT); } Blynk.connect(4000); Serial.print(Blynk.connected()); } }

Заключение

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

Ознакомиться с проектом целиком можно в репозитории на гитхабе .

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

Далее будет QR код, просканировав который приложением Blynk (AppSore , Android) можно узнать, какой микроклимат был у меня дома последние 3 месяца.


Проект работает, прошу ничего не ломать.

Один из факторов влияющих на эффективность работы является концентрация 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 Денис Пак , генеральный директор

Описание

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

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

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

Диапазон измерений: 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 с }

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

Датчик газа 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 ) ; }

ОПИСАНИЕ ТОВАРА: "MQ-135 ДАТЧИК ГАЗА"

"GAS SENSOR MQ135 " датчик, используемый для анализа чистоты окружающего воздуха. Например, в Вашем авто. "Датчик газа MQ-135 " реагирует на содежание таких газов, как NO 2 -оксид азота, CO 2 - оксид углерода, пары бензола и алкоголя, а также - как анализатор дыма. Датчик газа MQ-135 называется анализатором чистоты воздуха, потому что он не работает на какой-то один газ. А определяет общее содержание ВРЕДНЫХ ГАЗОВ в воздухе. Принцип действия простой - изменение сопротивления (а значит и значения выходного напряжения) в зависимости от объемного содержания вредных газов в воздухе. Вывод "DO" - цифровой сигнал позволяет использовать сам "датчик газа " без "Платы контроллера Ардуино " напрямую с "Модулем Реле ". Т.е. высокий уровень 5 вольт - включить Реле и низкий уровень "0 вольт" - выключить Реле. "AO" -аналоговый сигнал на выходе Модуля Датчика газа позволяет анализировать процентное содержание вредных газов и, при необходимости, принимать какие-то определенные действия при помощи различных "Модулей Ардуино ". Калибровать Датчик надо только один раз при первом включении. Скачать Библиотеку для работы с Датчиком газа можете

Более полную информацию Вы можете найти в приложенном PDF-файле.

В нашем магазине существует гибкая система скидок для постоянных и оптовых покупателей. Цену и наличие уточняйте по телефону. Заказать доставку по Москве Вы можете на сайте компании "Dostavista ".

 
Статьи по теме:
Притяжательные местоимения в русском языке
Русский язык богат, выразителен и универсален. Одновременно с этим он является весьма сложным языком. Чего стоят одни склонения или спряжения! А разнообразие синтаксического строя? Как быть, например, англичанину, привыкшему к тому, что в его родном языке
Святая праведная анна, мать пресвятой богородицы
Все о религии и вере - "молитва св праведной анне" с подробным описанием и фотографиями.Память: 3 / 16 февраля, 28 августа / 10 сентября Праведная Анна Пророчица происходила из колена Асирова, была дочерью Фануила. Вступив в брак, она прожила с мужем 7 ле
Психология богатства: привлекаем деньги и успех силой мысли
Материальное благополучие - то, к чему стремится каждый человек. Для того, чтобы деньги всегда водились в кошельке, а дела завершались успешно, важно иметь не только хорошие профессиональные навыки, но и соответствующее мышление. Силой мысли можно воплоти
Полтавское высшее военное командное училище связи
ПВИС - Полтавский Военный Институт Связи - высшее военное учебное заведение, выпускавшее офицеров-связистов для вооружённых сил СССР и Украины. История института 11 января в 1968 году было подписано Постановление Совета Министров СССР за №27, а 31 янва