Урок 8. Подключение датчика газа MQ-2 к Arduino – У Павла!

Урок 8. Подключение датчика газа MQ-2 к Arduino - У Павла! Анемометр

Программный код arduino для сигнализации co2 с mh-z14a

После разводки создадим программный скрипт. Большая часть программного сценария не зависит от микроконтроллера, но, поскольку есть некоторые небольшие различия, я создал программный сценарий индивидуально для Arduino, ESP8266 и ESP32.

#include <SoftwareSerial.h>
SoftwareSerial SerialCom(13, 12); // RX, TX
// analog interface
const int analogPin = A0;
// PWM interface
const int PWMPin = 9;
void setup() { SerialCom.begin(9600); pinMode(PWMPin, INPUT_PULLUP); delay(180000); // preheat the CO2 sensor for 3 minutes Serial.begin(115200); Serial.println("Analog:,UART:,PWM:");
}
void loop() { int ppm_analog = get_analog(); int ppm_uart = gas_concentration_uart(); int ppm_PWM = gas_concentration_PWM(); Serial.print(ppm_analog); Serial.print(","); Serial.print(ppm_uart); Serial.print(","); Serial.println(ppm_PWM); delay(60000); // sleep for 1 minute
}
int get_analog() { float v = analogRead(analogPin) * 5.0 / 1023.0; int gas_concentration = int((v) * (5000 / 2)); return gas_concentration;
}
int gas_concentration_uart() { byte addArray[] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79}; char dataValue[9]; SerialCom.write(addArray, 9); SerialCom.readBytes(dataValue, 9); int resHigh = (int) dataValue[2]; int resLow = (int) dataValue[3]; int ppm_uart = (resHigh * 256) resLow; return ppm_uart;
}
int gas_concentration_PWM() { while (digitalRead(PWMPin) == LOW) {}; long t0 = millis(); while (digitalRead(PWMPin) == HIGH) {}; long t1 = millis(); while (digitalRead(PWMPin) == LOW) {}; long t2 = millis(); long tH = t1 - t0; long tL = t2 - t1; long ppm = 5000L * (tH - 2) / (tH tL - 4); while (digitalRead(PWMPin) == HIGH) {}; delay(10); return int(ppm);
}
#include <SoftwareSerial.h>
SoftwareSerial SerialCom(D8, D7); // RX, TX
// analog interface
const int analogPin = A0;
// PWM interface
const int PWMPin = D6;
void setup() { SerialCom.begin(9600); pinMode(PWMPin, INPUT_PULLUP); delay(180000); // preheat the CO2 sensor for 3 minutes Serial.begin(115200); Serial.println("Analog:,UART:,PWM:");
}
void loop() { int ppm_analog = get_analog(); int ppm_uart = gas_concentration_uart(); int ppm_PWM = gas_concentration_PWM(); Serial.print(ppm_analog); Serial.print(","); Serial.print(ppm_uart); Serial.print(","); Serial.println(ppm_PWM); delay(60000); // sleep for 1 minute
}
int get_analog() { float v = analogRead(analogPin) * 3.3 / 1023.0; int gas_concentration = int((v) * (5000 / 2)); return gas_concentration;
}
int gas_concentration_uart() { byte addArray[] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79}; char dataValue[9]; SerialCom.write(addArray, 9); SerialCom.readBytes(dataValue, 9); int resHigh = (int) dataValue[2]; int resLow = (int) dataValue[3]; int ppm_uart = (resHigh * 256) resLow; return ppm_uart;
}
int gas_concentration_PWM() { while (digitalRead(PWMPin) == LOW) {}; long t0 = millis(); while (digitalRead(PWMPin) == HIGH) {}; long t1 = millis(); while (digitalRead(PWMPin) == LOW) {}; long t2 = millis(); long th = t1 - t0; long tl = t2 - t1; long ppm = 5000L * (th - 2) / (th tl - 4); while (digitalRead(PWMPin) == HIGH) {}; delay(10); return int(ppm);
}

В первой части программного кода мы определяем переменные и конфигурации для интерфейса связи между микроконтроллером и датчиком CO2.

При запуске сценария программы определяются следующие переменные:

  • Контакты для последовательной связи UART: SerialCom
  • Аналоговый вывод: analogPin
  • Цифровой вывод для интерфейса ШИМ: PWMPin

Для программного кода Arduino и ESP8266 мы определяем программный серийный номер для интерфейса UART. Мы не можем использовать стандартный интерфейс, потому что стандартный интерфейс используется для USB-связи между микроконтроллером и ПК, чтобы отправлять измерения через USB-кабель в Arduino IDE.

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

В setup мы запускаем программную последовательную связь со скоростью 9600 бод, которая указана в техническом описании MH-Z14A. Кроме того, мы устанавливаем вывод для сигнала ШИМ в качестве входа и используем внутренний подтягивающий резистор микроконтроллера.

Поскольку датчику CO2 нужно время, чтобы нагреть инфракрасную лампу, мы создаем задержку в 3 минуты.

После задержки мы устанавливаем скорость передачи данных для последовательной связи через USB с ПК на 115200 и распечатываем заголовок нашей таблицы, который содержит три наших измерительных интерфейса для Arduino и ESP8266 и два интерфейса для ESP32.

В loop мы считываем концентрацию CO2 из каждой функции, которую вы можете найти в функции цикла. В каждой функции мы реализуем метод, описанный в главе об интерфейсе. Если у вас есть какие-либо вопросы относительно функций чтения концентрации CO2, задайте свой вопрос в разделе комментариев ниже.

После того, как мы получили все наши измерения CO2, мы записываем значения концентрации CO2 на последовательный выход и ждем 1 минуту, прежде чем снова запустить функцию цикла, чтобы прочитать новые значения датчика MH-Z14A.

Arduino и датчик mq-135: измерение концентрации углекислого газа в воздухе

Уровень углекислого газа (двуокись углерода или CO2) в атмосфере Земли повышается день ото дня. Среднее значение CO2 в атмосфере в 2022 году составило 409,8 частей на миллион, а в октябре 2020 года – 411,29. Двуокись углерода является ключевым парниковым газом, на который приходится около трех четвертей выбросов. Таким образом, мониторинг уровня CO2 также стал приобретать все большее значение.

В нашем предыдущем проекте мы использовали инфракрасный датчик CO2 для измерения концентрации CO2 в воздухе. В этом проекте мы собираемся использовать датчик MQ-135 с Arduino для измерения концентрации углекислого газа. Измеренные значения концентрации CO2 будут отображаться на OLED-модуле.

Датчик газа MQ-135 – это датчик качества воздуха для обнаружения широкого спектра газов, включая NH3, NOx, спирт, бензол, дым и CO2. Датчик MQ-135 можно приобрести как в виде модуля, так и просто как датчик. В этом проекте мы используем сенсорный модуль MQ-135 для измерения концентрации CO2 в PPM. Принципиальная схема платы модуля MQ-135 приведена далее.

Нагрузочный резистор RL играет очень важную роль в обеспечении работы датчика. Этот резистор изменяет свое значение сопротивления в зависимости от концентрации газа. Согласно документации на MQ-135, сопротивление нагрузочного резистора может находиться в диапазоне от 10 кОм до 47 кОм. В документации рекомендуется откалибровать детектор на концентрацию 100 ppm NH3 или 50 ppm спирта в воздухе и использовать значение сопротивления нагрузки (RL) около 20 кОм. По умолчанию на плате стоит значение этого резистора 1 кОм.

Таким образом, чтобы измерить соответствующие значения концентрации CO2, вам необходимо заменить резистор 1 кОм на резистор 22 кОм. Полная схема подключения датчика газа MQ-135 к Arduino приведена далее.

Схема очень проста, поскольку мы подключаем только датчик MQ-135 и модуль OLED-дисплея к Arduino Nano. Датчик газа MQ-135 и модуль OLED-дисплея питаются от 5 В. Вывод аналогового выхода датчика MQ-135 подключен к выводу A0 Arduino Nano. Поскольку модуль OLED-дисплея использует связь SPI, мы установили связь SPI между модулем OLED и Arduino Nano. После подключения оборудования в соответствии с принципиальной схемой оно должно выглядеть примерно так:

Теперь, когда мы знаем значение RL, давайте приступим к расчету значений Ro для чистого воздуха. Здесь мы собираемся использовать MQ135.h для измерения концентрации CO2 в воздухе. Поэтому сначала загрузите библиотеку MQ-135, затем предварительно нагрейте датчик в течение 24 часов, прежде чем считывать значения Ro. После процесса предварительного нагрева используйте приведенный ниже код, чтобы прочитать значения Ro.

#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, перейдите в Документы – Arduino –libraries –MQ135-master, откройте файл MQ135.h и измените значения RLOAD и RZERO.

#define RLOAD 22.0
#define RZERO 5804.99

Теперь прокрутите вниз и замените значение ATMOCO2 текущим значением CO2 в атмосфере, равным 411,29.

#define ATMOCO2 397.13

Полный код для взаимодействия датчика MQ-135 с Arduino приведен далее.

#define RLOAD 22.0
#include "MQ135.h"
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#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);
}

Как только оборудование и код будут готовы, следует проверить датчик. Для этого подключите Arduino к ноутбуку, выберите плату и порт и нажмите кнопку загрузки. Затем откройте монитор последовательного порта и подождите некоторое время (процесс предварительного нагрева), после чего вы увидите окончательные данные. Значения будут отображаться на OLED-дисплее, как показано на следующем изображении.

© anemometers.ru

Теги: Arduino, датчик газа

Mh-z19

Датчики серии MH-Z выпускаются китайской компанией Winsen. Сама компания специализируется именно на разработке и производстве датчиков для определения газов. В активе компании имеются как электрохимические, так и датчики, выполненные по другим технологиям.

В основе процесса измерения в сенсорах MH-Z лежит принцип оптического измерения содержания определенного газа. В английском языке подобная технология называется Nondispersive infrared, что на русский язык переводится примерно как «недисперсионная инфракрасная технология» или сокращенно NDIR.

Наличие IR и то, что сам сенсор используется инфракрасное излучение для анализа воздуха наводит некоторых «специалистов» на то, что в датчике используется PIR (Passive Infrared) технология. Да, в PIR, как и в NDIR, используется инфракрасный свет, а в остальном это две отличных технологий.

В NDIR используется две камеры, одна заполнена азотом, а такой газ содержится и в атмосфере нашей планеты. Более того, азота в воздухе, которым мы дышим аж 78%. Кислорода 21%, а углекислого газа всего 1%. Так вот, одна из камер содержит азот, а вторая тот воздух, который подвергается исследованию.

Через обе камеры, одновременно пропускается пучок инфракрасного света. Его источником может быть, все что угодно. В подобных устройствах обычно используется полупроводниковый диод, обеспечивающий требуемую длину волны. Если же источник инфракрасного света недостаточно стабилизирован по спектральной характеристике, то применяется оптический фильтр, отсекающий все остальные длины волн.

Проходя через обе камеры, световой импульс подвергается рассеиванию на молекулах газа. Во время дисперсии происходит рассеивание (преломление) направленного пучка света и его частичное поглощение молекулами или стенками сенсора. Как правило, в качестве базовой отправной точки используется камера с азотом, а результаты из второй камеры сравниваются с результатами в камере с азотом.

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

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

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

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

Как отметил выше, в настоящее время Winsen выпускает два вида датчиков, серию Z14 и Z19. Отличаются одна серия от другой внешним видом. Z19 это параллелепипед с двумя фильтрами, а Z14 — усеченный цилиндр на плате с одним фильтром. Есть различия между моделями и внутри серий связанные с дополнительными настройками по диапазонам работы. В целом же обе серии можно считать идентичными, а различия несущественными.

Подключение mh-z19 к ардуино

Наша задача на сегодня – разобрать подключение MH-Z19 к Ардуино, а также базовые характеристики и практичность применения PIR датчика углекислого газа. В принципе с последним пунктом более-менее все понятно. Мы все понимаем, что в целях безопасности не помешает постоянно отслеживать концентрацию CO2 в квартире ∕ доме ∕ офисе. Конечно, можно приобрести готовую бытовую систему, но она обойдется вам в круглую сумму, а вот так называемый комнатный прибор, сделанный своими руками, сэкономит семейный бюджет и принесет огромную пользу.

Само устройство инфракрасного измерителя концентрации CO2, с которым мы сегодня знакомимся, создано для определения удельного содержания газа. Сенсор не требует высокой мощности, стабилен в работе (до 5 лет эксплуатации), имеет малое энергопотребление и высокую чувствительность, способен передавать данные через 2 выходных интерфейса: PWM и UART.

Теперь обратимся к техническим особенностям модуля:

  • напряжение: 3.6 – 5.5V;
  • потребляемый ток: < 18 мА;
  • диапазон измерений: 0 – 0.5 %;
  • время измерения: T90 < 60 сек.;
  • диапазон рабочих температур: 0-50 С;
  • допустимая влажность: 0 – 95% RH;
  • габариты: 33 ×20 × 9 мм;
  • вес: около 21 грамм

Рассмотрим схему подключения инфракрасного датчика к Arduino:
Урок 8. Подключение датчика газа MQ-2 к Arduino - У Павла!

В ней мы задействовали такие аппаратные компоненты: плату расширения Arduino Nano (можно использовать другие совместимые микроконтроллеры), модуль MH-Z19, комплект соединительных проводов.

Наша следующая задача – написать коды для чтения значений с устройства (и проверки его работоспособности). Пример такого скетча:

#define pwmPin 5
#define LedPin 13
int prevVal = LOW;
long th, tl, h, l, ppm;
void setup() { Serial.begin(9600); pinMode(pwmPin, INPUT); pinMode(LedPin, OUTPUT);
}
void loop() { long tt = millis(); int myVal = digitalRead(pwmPin); //Если обнаружили изменение if (myVal == HIGH) { digitalWrite(LedPin, HIGH); if (myVal != prevVal) { h = tt; tl = h - l; prevVal = myVal; } } else { digitalWrite(LedPin, LOW); if (myVal != prevVal) { l = tt; th = l - h; prevVal = myVal; ppm = 5000 * (th - 2) / (th tl - 4); Serial.println("PPM = " String(ppm)); } }
}

Управление осуществляется через монитор COM-порта (Ctrl Shift M).

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

Для справки: существует несколько типов или классов «загазованности» помещений согласно ГОСТ:
Урок 8. Подключение датчика газа MQ-2 к Arduino - У Павла!Именно на эти параметры мы ориентируемся при тестировании.
Надеемся, вы оцените преимущества подобного прибора и будете им пользоваться на постоянной основе! До новых встреч!

Выводы

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

Update. Все течет, все меняется. И вот производитель данного сенсора, переехал на новый сайт и как оказалось в его ассортименте присутствует сразу три датчика MH-Z19: MH-Z19, MH-Z14A, MH-Z19B. Разнообразие датчиков меня удивило и я решил слегка разобраться в чем, собственно, разница между ними.

Похоже, что сенсор MH-Z19 без каких-либо букв появился самым первым на рынке и его дизайн можно считать оригинальным.

С виду MH-Z19B мало чем отличается от MH-Z19. Однако, различия во внешнем виде все же есть. Так, у датчика MH-Z19B отсутствуют пины SR и AOT. Вернее такие пины физически присутствуют на плате корпуса, но они не подписаны и вероятно никуда не подведены. У MH-Z19 эти пины подписаны, но производитель указывает, что они зарезервированы для каких-то производственных целей.

Распиновка оригинального датчика MH-Z19 дана в начале статьи, а MH-Z19B приведена выше. Хорошо заметно, что две ножки не подписаны. Физически они присутствуют, но есть ли там что-то непонятно.

Датчик MH-Z14A по внешнему виду отличается от своих собратьев и весьма существенно. Сперва может, конечно, показаться, что на нем просто отсутствует верхний кожух, но это не так. Форма самого “чувствительного” элемента другая, отличается даже окошко для газообмена с внешней средой.

Но это еще не все. MH-Z14A способен измерять CO2 с концентрацией до 10000 ppm (или до 10% от объема газа). Плюс, как и  имеет автоматическую калибровку на 0 (т.е. 400 ppm) каждые 24 часа. По причине автоматической калибровки данный датчик не рекомендуется использовать в теплицах и на рефрижераторных установках.

Вообще, с функцией автоматической калибровки присутствует какая-то неразбериха в спецификациях датчиков. Если в MH-Z14A явно указано, что такая функция присутствует и включена по-умолчанию. То в спецификации на MH-Z19B только дан способ включения и отключения калибровки.

Кстати, как оказалось, для получения более-менее достоверных результатов, необходимо датчик как следует прогреть. Вероятно, что ИК-светодиод должен выйти на какой-то особый режим свечения, чтоб результаты получались как можно ближе к true. Производитель дает время прогрева в 3 минуты.

Спецификация на MH-Z19Спецификация на MH-Z19BСпецификация на MH-Z14A

Чем плох co2?

Чем же плохо повышенное содержание углекислого газа в воздухе? А тем, что углекислый газ есть не что иное, как естественный результат нашей с вами жизнедеятельности. И не только нашей, кстати. Вдыхаем мы воздух, в котором преобладает азот и кислород, а выдыхаем все тот же азот, мало кислорода и много углекислого газа.

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

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

Для успешной работы этой системы обмена, во вдыхаемом воздухе должно быть много кислорода и мало углекислого газа. Иначе, вывод отработки из организма работать не будет. Собственно, этим и плохо высокое содержание CO2 в воздухе. Чем выше его содержание, тем хуже будет выводиться ненужный результат химических реакций наших тех.

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

Во взрослом состоянии организма увещевание мам уже не действует и человек готов просидеть 12 часов в душном офисе имитируя бурную деятельность. Именно имитируя, ведь работать в атмосфере с повышенным содержанием углекислого газа нормально невозможно.

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

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

Update: замечания по калибровке.

Датчики MHZ могут калиброваться. Как запустить данный процесс указано четко в документации. Ниже приведу пример того, как сработала автоматическая калибровка в датчике MH-Z19B.

Данный датчик пролежал у меня в загашнике года четыре как минимум, после чего он был извлечен на свет и прикручен к плате WeMos D1 R2 исправно работающей несколько лет в качестве мониторинга температуры и влажности на даче. Для работы с сенсором я использовал готовую библиотеку от Tobias Schürg MH-Z-CO2-Sensors.

После первого подключения датчик показал излишне высокий и местами подозрительный уровень CO2 в атмосфере дачной комнаты. Значения колебались в районе 1500-1600 ppm, что не просто много для загородного строения летом, когда все окна открыты, а слишком много и нереалистично.

На приведенном выше графике видно, что первоначально значения выдаваемые датчиком весьма и весьма высокие, затем, после суток прогона, значения резко понижаются до величины в 400 ppm. И на таком значении они и остаются некоторое время. Линия тут прямая по той причине, что при получении значения от датчика на уровне ниже 400 ppm данные не принимаются, т.к. явно не соответствуют среднему содержанию CO2 в атмосфере и тем более в комнате быть меньше просто не может.

Затем, спустя еще несколько часов пошли реальные значения  и наметилось некоторое колебание в диапазоне чуть больше 400 ppm. Колебания объясняются не соседом, который прильнул к окошку моего дома и активно дышит в помещение, а точностью определения значений самим датчиком.

Как именно работает алгоритм автоматической калибровки никто толком не знает. Но пользователь может провести самостоятельную калибровку, а затем отключить ее в сенсоре (и тут опять же вопрос, сохранятся ли значения калибровки или нет, хочется надеяться, что сохраняется). В MH-Z19B есть два варианта калибровки. Вариант Zero-Point и Span.

Thingspeak

Как видно из приведенного ниже графика, содержание диоксида углерода плавает в течение 12 часов. Датчик установлен в комнате с одним окном. В комнате периодически обитает двое взрослых и два мелких хищника. Окно постоянно приоткрыто для проветривания.

По графику хорошо видно, что в ночное время содержание CO2 колеблется на приемлемом уровне в районе 500 ppm, а около 8 утра наблюдается небольшой всплеск до 600. Ночью, когда любая активность минимальна, проветривания оказалось достаточно для поддержания оптимального уровня свежести воздуха.

А вот в тот момент, когда все люди и звери становятся активными, содержание диоксида увеличивается. Хотя и в такой момент оно находится на вполне неплохом уровне. Затем же идет плавное снижение содержания вплоть до его номинального значения. Мелкие хищники днем спят, а их мощности метаболизма недостаточно для поддержания высокого уровня содержания CO2 в атмосфере комнаты.

Графики на ThingSpeak хороши, но не гибки. Но я не поленился и выгрузил данные сразу за несколько дней для анализа в Excel. Благо подобная функция, функция выгрузки, присутствует в ThingSpeak. Несколько несложных манипуляций и готов весьма подробный график готов.

Поскольку значений выгружено много, то без дополнительных манипуляций провести усреднение непросто, но, с другой стороны, так даже интереснее. При анализе графика следует учитывать временный сдвиг в 3 часа из-за выгруженных данных в часовом поясе UTC 0.

Как видно, после начала сбора данных значения CO2 весьма и весьма высоки. Я и сам был удивлен столь неоднозначным показаниям. Но ответ нашелся быстро: в те дни на улице стояла прохладная температура с сильным ветром. И чтобы не понижать температуру в помещении до некомфортных значений, пластиковые окошки прикрыли.

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

Калибровка

Датчик Z19 имеет возможность калибровки. Причем возможна калибровка двумя способами. Первый и самый точный способ: калибровка абсолютного нуля. Для этого датчик необходимо поместить в атмосферу из чистого азота, подождать пока азот не вытеснит все остальные газы из корпуса датчика, примерно пять минут, и запустить калибровку командой. Результаты будут записаны в память микроконтроллера сенсора, и они будут использоваться для последующих определений значений измерений. Азот, кстати, можно приобрести на предприятиях занимающимися реализацией газов. Правда, самый маленький баллон будет стоить как два, а то и четыре датчика MH-Z19, но искусство требует жертв.Второй способ, так называемый span calibration применяется для калибровки в бытовых условиях. Выполняется он точно так же, как и в первом способе, но датчик нет необходимости помещать в атмосферу азота. Достаточно вынести его на чистый и свежий воздух и произвести калибровку. Тут делается упор на то, что в атмосферном воздухе содержится порядка 400 ppm CO2. И значение это постоянно на протяжении длительного времени и более-менее однородно по всему земному шару. Но при подобной калибровке следует учитывать, что значение в 400 ppm весьма условно, поскольку концентрация углекислого газа колеблется, и в весьма ощутимых пределах, в зависимости от внешних факторов. В крупном городе концентрация будет выше, чем на селе. Летней ночью в лесу углекислого газа будет больше, чем в том же лесу, тем же летом, но в солнечную погоду днем.Поэтому, если уж и заниматься калибровкой, то лучше разориться на литр другой азота и провести полноценную процедуру.

В конце статьи есть обновленная информация по калибровке. В любом случае, перед проведением процедуры, стоит ознакомиться и свериться со спецификацией.

Почему измерение co2 важно во времена короны?

Основная причина, по которой люди заражаются SARS-CoV-2 (вирусом, вызывающимся COVID-19), – это контакт с респираторными каплями, переносящими инфекционный вирус.

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

  • Более крупные капли
  • Более мелкие капли и частицы

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

Мы можем избежать передачи через вентиляцию, например, через открытые окна в офисах или классах. Цель состоит в том, чтобы избежать высокой концентрации респираторных капель и частиц в воздухе.

Но когда достигается концентрация, то я должен открыть окна в своем офисе? Концентрацию респираторных капель в воздухе измерить крайне сложно. Но мы можем измерить концентрацию углекислого газа (CO2) в выдыхаемом воздухе во время дыхания. Эта концентрация CO2 пропорциональна концентрации респираторных капель в воздухе.

Таким образом, целью данного руководства является создание измерителя CO2, который сообщит вам, когда будет достигнута концентрация респираторных капель, чтобы открыть окна, чтобы снизить риск заражения COVID-19, или просто когда следует проветрить помещение.

Подключение

Подключаются датчики серии MH-Z к микроконтроллерам двумя способами. Доступно либо использование PWM (ШИМ), либо подключение по UART (последовательному порту). Мы уже знаем, что чипы ESP8266 не очень дружат с PWM под средой Android, поэтому для подключения будем использовать только и исключительно UART.

Более того, подключение по последовательному порту еще и предпочтительнее, поскольку не только снижает нагрузку на сам микроконтроллер, но и позволяет использовать команды калибровки. Да и разве не здорово получать значения содержания CO2 сразу в ppm прямо с датчика, а не заниматься длительными и мучительными вычислениями? Вот именно, что стоит.

Во избежание ненужной гибели человеческих жертв, хочу обратить внимание воспитанного читателя на то, что для питания датчика MH-Z19 требуется напряжение от 4.5 и до 5.5 вольт, а для обмена данными по последовательному порту (равно как и для PWM) требуется 3.

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

Основные результаты использования arduino с mh-z14a

На следующем рисунке показаны мои измерения с Arduino Uno, визуализированные с помощью последовательного плоттера Arduino IDE. Калибровка MH-Z14A во время этого измерения не производилась. Разница после повторной калибровки показана в следующем подразделе.

Использование аналогового интерфейса MH-Z14A с микроконтроллером Arduino (синяя линия)

Если вы видите аналоговые значения на последовательном плоттере, вы сразу замечаете более высокие выбросы, которые, кажется, возникают на регулярной основе. Для стабильного и достоверного измерения выбросы представляют собой большую проблему, потому что наша сигнализация сработает, когда выброс превысит предварительно определенное значение сигнализации.

Использование интерфейса UART MH-Z14A с микроконтроллером Arduino (красная линия)

Использование связи UART для получения значений CO2 от MH-Z14A вызывает те же проблемы, что и аналоговый интерфейс. Мы можем видеть, что значения датчика UART частично совпадают с ШИМ интерфейсом, но часто падают. Такое поведение кажется необычным и не позволяет использовать интерфейс UART для сигнализации CO2.

Использование интерфейса ШИМ MH-Z14A с микроконтроллером Arduino (зеленая линия)

Интерфейс ШИМ – единственный интерфейс, который не имеет выбросов и поэтому может использоваться для нашей сигнализации CO2. В большинстве случаев значения ШИМ также подтверждаются концентрацией CO2 из интерфейса UART.

Как измерить концентрацию co2 в воздухе?

Концентрация углекислого газа может быть измерена с помощью детектора инфракрасного (ИК) излучения, поскольку ИК-излучение СО2 имеет уникальную характеристику, которая определяется длиной волны. На следующем рисунке показаны длины волн различных газов и их сила поглощения.

На длине волны около 4250 нм поглощение CO2 является самым высоким. Таким образом, ИК-детектор CO2 может измерять концентрацию CO2 в воздухе, если измерения других длин волн отсутствуют. На следующем рисунке показана схема ИК-детектора.

На картинке видно, что есть вход и выход для газа. Инфракрасная лампа создает инфракрасное излучение через измеряемый газ. Это ИК-излучение фильтруется интерференционным фильтром до нужного газа, который необходимо измерять, в нашем случае CO2. Фильтр предотвращает попадание на ИК-детектор волны другой длины, кроме CO2.

Как и у всех газов, концентрация зависит от температуры и давления. Стандартная температура окружающей среды составляет 25 ° C, а давление – 1013 кПа. Уравнение для расчета концентрации газа при различных температурах и давлениях: p = p (25 ° C, 1013 кПа) * p / 1013 * 298 / (273 t)

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

Аналоговый интерфейс mh-z14a

Всего имеется два разных аналоговых выхода MH-Z14A, которые отличаются выходным напряжением аналогового выхода.

  • Vout1 имеет расширение. выходное напряжение от 0 В до 2,5 В для диапазона выходного сигнала от 0 до 5000 частей на миллион.
  • Vout2 имеет расширение. выходное напряжение от 0,4 В до 2 В для диапазона выходного сигнала от 0 до 5000 частей на миллион.

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

Чтобы рассчитать концентрацию CO2, мы должны сделать следующие шаги:

  1. Считайте аналоговое значение с помощью analogRead функции.
  2. Пересчитайте аналоговое напряжение на основе рабочего напряжения микроконтроллера и максимального значения аналого-цифрового преобразователя (АЦП) микроконтроллера.
  3. Рассчитайте концентрацию газа, используя следующий градиентный треугольник.

Теперь мы можем погрузиться в уравнения для расчета концентрации CO2 от MH-Z14A, когда вы используете вывод Vout1 или Vout2 на MH-Z14A.

Формулы, когда Vout1 используется для расчета концентрации газа.

Формулы, когда Vout2 используется для расчета концентрации газа.

Датчик co2 mh-z14a

Для нашего датчика Corona CO2 мы используем MH-Z14A с рабочим напряжением от 4,5 В до 5,5 В. Следовательно, датчик CO2 может работать на всех микроконтроллерах Arduino с рабочим напряжением 5 В. Для микроконтроллеров ESP8266 и ESP32 с рабочим напряжением 3,3 В мы должны использовать выход 5 В от USB-соединения.

Во время работы MH-Z14A потребление тока составляет около 100 мА и поэтому не подходит для проекта с батарейным питанием.

При первом запуске датчика CO2 ИК-лампе требуется около 3 минут для предварительного нагрева, чтобы создать оптимальное ИК-излучение через измеряемый газ. Мы можем использовать эту информацию о функции настройки позже в скрипте Arduino, где мы приостанавливаем весь скрипт на 3 минуты, прежде чем считать какие-либо значения датчиков.

Диапазон измерения CO2 составляет 0…5000 ppm с точностью измерения около ± 50 ppm. В соответствии с данными из Европейской ассоциации отопления и вентиляции(REHVA) в хорошо проветриваемом помещении концентрация CO2 ниже 800 частей на миллион (наш предупреждающий сигнал) и должна быть ниже 1000 частей на миллион (наш сигнал тревоги).

Интерфейс mh-z14a uart

Если вы не хотите рассчитывать концентрацию CO2, вы можете получить значение концентрации CO2 непосредственно через интерфейс UART. Настройки для связи UART являются стандартными и перечислены в следующей таблице.

Скорость передачи9600
Байт даты8 байт
Остановить байт1 байт
Байт калибровкиnone

Процесс связи по UART следующий:

  • Микроконтроллер отправляет заранее определенный 9-байтовый массив через UART на MH-Z14A.
  • MH-Z14A отвечает в зависимости от содержимого запроса ответов длинной 9-байт, который считывает микроконтроллер.
  • Массив ответов содержит концентрацию высокого уровня (байт 2), а также концентрацию низкого уровня (байт 3).
  • Концентрация газа: высокий уровень * 256 низкий уровень

Вы также можете запустить калибровку нулевой точки и точки диапазона с помощью интерфейса связи UART. Вы найдете содержимое всех массивов в MH-Z14A datasheet или ниже, в нашем примере программирования.

Результаты использования arduino с mh-z14a после повторной калибровки

Возможно, вы видели, что значения датчиков в предыдущей главе были слишком высокими (между 1700 и 3200 частей на миллион), чтобы быть реальной концентрацией CO2 в моем офисе.

Мы определили, что в хорошо вентилируемом помещении концентрация CO2 ниже 800 ppm (наш предупреждающий сигнал) и должна быть ниже 1000 ppm (наш сигнал тревоги).

Поэтому нам необходимо откалибровать MH-Z14A, соединив контакт 8 (HD) MH-Z14A с землей вашего микроконтроллера на 7-10 секунд. На следующем рисунке показано измерение CO2 с моей Arduino Uno после повторной калибровки.

Теперь моя концентрация CO2 составляет около 600 частей на миллион, когда дверь моего офиса открыта, а окно закрыто. Когда я закрываю дверь (у меня небольшой офис), концентрация CO2 повышается и превышает пороговые значения 800–1000 частей на миллион. В конце я открыл окно, и вы видите, что концентрация СО2 снижается за счет свежего воздуха.

Повторная калибровка не устраняет ошибочное поведение аналогового интерфейса и интерфейса UART.

Шим интерфейс mh-z14a

Концентрация CO2 также может передаваться через сигнал ШИМ (Широтно-импульсная модуляция) от MH-Z14A на микроконтроллер. Вы можете использовать любой цифровой вывод микроконтроллера для чтения сигнала ШИМ.

Чтобы прочитать сигнал ШИМ, мы должны сделать два изменения, которые описаны в таблице данных и показаны на следующем рисунке.

  1. tH: время высокого уровня ШИМ-сигнала в течение одного цикла.
  2. tL: время, когда сигнал ШИМ низкий в течение одного цикла.

Поскольку микроконтроллер Arduino, ESP8266 и ESP32 не может измерять временной диапазон, мы должны использовать millis() функцию, которая возвращает количество миллисекунд, прошедших с момента включения микроконтроллера. На основе этих временных меток, когда сигнал ШИМ показывает нарастающий или спадающий фронт, мы можем вычислить временные диапазоны следующим образом:

Теперь рассчитывается концентрация CO2 C = 5000 * (tH-2ms) / (tH tL-4ms).

Основные результаты использования esp32 с mh-z14a

Когда я использовал ESP32 с MH-Z14A, у меня возникли проблемы с интерфейсом UART, что привело к постоянному перезапуску ESP32. По этой причине я использовал только аналоговый интерфейс и интерфейс ШИМ для получения концентрации CO2. Обратите внимание, что все значения датчика записываются перед повторной калибровкой.

Использование аналогового интерфейса MH-Z14A с микроконтроллером ESP32 (синяя линия)

Аналоговый интерфейс ESP32 демонстрирует то же поведение, что и Arduino. Мы регулярно получаем более высокие концентрации CO2.

Использование интерфейса ШИМ MH-Z14A с микроконтроллером ESP32 (красная линия)

Интерфейс ШИМ показывает действительные значения датчика без каких-либо выбросов. Поэтому я бы рекомендовал использовать интерфейс ШИМ MH-Z14A при использовании микроконтроллера ESP32.

Заключение по созданию сигнализации co2 с помощью mh-z14a

Следующие пункты суммируют все мои знания, полученные во время создания этой статьи.

  • Поместите датчик CO2 MH-Z14A в среду, в которой вы хотите измерять концентрацию CO2, в течение как минимум 24 часов.
  • Используя интерфейс ШИМ, вы получите достоверные измерения концентрации CO2.
  • Выполните повторную калибровку MH-Z14A, соединив контакт 8 (HD) с землей на 10 секунд.
  • Если вы создаете систему без подключения к Wi-Fi, используйте микроконтроллер Arduino, а если вы хотите создать датчик измерения CO2 для Интернет штук, который отправляет значения CO2 в центральный регистр, используйте ESP32, но не ESP8266.

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

Zero-point калибровка

Это рекомендуемый вариант калибровки, который необходимо провести даже если будет проводится калибровка методом Span. Запуск калибровки можно провести двумя способами, либо командой через последовательный порт, либо замкнув контакт HD на землю на время не менее 7 секунд.

За это время датчик проведет несколько измерений и откалибруется. Калибровка в этом варианте происходит по общемировому значению CO2 в атмосфере которая примерно составляет 400 ppm. Для проведения калибровки высовываем датчик за окошко на время не менее 20 минут, потом запускаем калибровку.

Коррекция базовой линии mh-z14a

MH-Z14A имеет встроенную температурную компенсацию, называемую автоматической коррекцией базовой линии (ABC), для измерения точных значений CO2 также после смены комнаты с разными температурами. Базовым показателем для датчика CO2 является то, что уровень CO2 должен составлять 400 частей на миллион, что соответствует уровню CO2 в уличном воздухе.

  1. Подключите контакт 8 к GND минимум на 7 секунд.
  2. Отправьте определенную комбинацию байтов через интерфейс UART, см. Программный код для сигнализации аэрозолей.

Span калибровка

Данный вариант рекомендуется запускать после прохождения Zero-Point калибровки и выполнить ее можно только посредством команды через последовательный порт. В этом варианте подразумевается, что вы точно знаете уровень CO2 в атмосфере, в которой находится датчик.

Спецификация рекомендует проводить Span-калибровку при значении 2000 ppm, но можно использовать и другое значение, т.к. оно передается вместе с командой на проведение калибровки. И да, сам датчик стоит выдержать в калибруемой атмосфере не менее 20 минут.

Преобразователь логических уровней

Преобразователь логических уровней PCA9306 необходим для сопряжения датчика с разными напряжениями логических уровней от 3,3 до 5 вольт. Другими словами сенсор совместим как с 3,3 вольтовыми платами, например, Raspberry Pi, так и с 5 вольтовыми — Arduino Uno.

Регулятор напряжения 3v3


Линейный понижающий регулятор напряжения NCP582LSQ33 обеспечивает питание чипа CCS811 и других компонентов сенсора. Диапазон входного напряжения от 3,3 до 5 вольт. Выходное напряжение 3,3 В с максимальным выходным током 150 мА.

Создание сигнализации co2 с помощью mh-z14a

Теперь мы хотим создать нашу сигнализацию CO2 с помощью MH-Z14A и различных плат микроконтроллеров Arduino, ESP8266 и ESP32. Наша сигнализация CO2 должна измерять концентрацию CO2 в комнате каждую минуту и передавать данные в консоль. Кроме того, мы хотим использовать все три варианта, чтобы считывать концентрацию CO2 и сравнивать различные варианты, чтобы выяснить, какой вариант является наилучшим с точки зрения стабильности и точности.

Основные результаты использования esp8266 с mh-z14a

Ключевой вывод при использовании ESP8266 с MH-Z14A заключается в том, что эта комбинация у меня не заработала. Я попробовал взять другой микроконтроллер ESP8266 и пробовал каждый интерфейс измерения отдельно. Но у меня всегда был один и тот же код ошибки, который вы видите на следующем рисунке.

Распиновка mh-z14a

В технической спецификации, вы найдете следующую распиновку (смотрите на MH-Z14A сверху).

Связь между MH-Z14A и различными микроконтроллерами Arduino, ESP8266 и ESP32 показана в следующей главе этой статьи.

Про анемометры:  Не холодит: типичные поломки кондиционера, и что с ними делать - КОЛЕСА.ру – автомобильный журнал
Оцените статью
Анемометры