Тестирование модуля инфракрасного датчика CO2 MH-Z19

Тестирование модуля инфракрасного датчика CO2 MH-Z19 Анемометр

Вступление

В этой статье мы проведем простую функциональную проверку датчика CO 2 MH-Z19 , подключив его к raspberry pi 3 UART, и запустим простую программу на Python для регистратора данных, которая выводит результаты на экран и сохраняет результаты в файле. 

Позже файл может быть импортирован в Matlab или Excel для дальнейшего анализа или просто построить график собранных данных. 

Если вы хотите использовать ПК или Raspberry Pi или Beaglebone или любой другой SOC для измерения CO 2 Уровни, датчик с последовательным интерфейсом является хорошим выбором. MH-Z19 оснащен последовательным интерфейсом UART, источником питания 5 В и уровнями 3,3 В IO.

Это позволяет легко подключить его непосредственно к Raspberry Pi или к ПК (если ПК, вам нужно использовать USB / последовательный преобразователь (уровни CMOS / TTL, а не уровни RS232)).

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

Автоматическая калибровка

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

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

Зачем калибровать?

В недисперсионных инфракрасных (NDIR) датчиках диоксида углерода используются инфракрасный источник света и детектор для измерения количества молекул CO 2 в пробном газе между ними. В течение многих лет и источник света, и детектор изнашиваются, что приводит к немного более низкому содержанию CO 2 молекул.

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

Это значение «смещения» затем автоматически добавляется или вычитается из любых последующих показаний, полученных датчиком во время использования.

Калибровка датчика co 2

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

Калибровка с использованием азота

Самый точный метод CO 2 калибровки датчика – подвергнуть его воздействию 100% азота, чтобы дублировать условия, при которых датчик был первоначально откалиброван на заводе. Калибровка азота также необходима, если будет измеряться уровень CO2 в диапазоне 0-400 промилле.

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

Калибровка с использованием свежего воздуха

Если максимальная точность менее важна, чем стоимость, датчик CO 2 можно откалибровать на свежем воздухе. Вместо калибровки при 0 ppm CO2 (азот) датчик калибруется при 400 ppm CO 2 (наружный воздух на самом деле очень близок к 400 ppm), затем из вновь рассчитанного значения смещения вычитается 400 ppm.

Про анемометры:  Как проверить утечку газа в домашних условиях: лучшие способы проверки и действия при обнаружении утечки - Искра Газ

Калибровка свежего воздуха лучше всего подходит для датчиков в производственных установках или теплицах, где он постоянно подвергается воздействию различных уровней CO 2 .

Комплектация

  • 1х Датчик углекислого газа MH-Z19B;

О mh-z19 co 2 датчике

Датчик MH-Z19 изготовлен в Китае компанией Winsen Lt. Используемый метод измерения основан на принципе недисперсионного инфракрасного излучения (NDIR) для обнаружения присутствия CO 2 в воздухе. 

Основные характеристики по заявлению производителя:

  • хорошая чувствительность;

  • не зависит от кислорода;

  • долгая жизнь;

  • встроенная температурная компенсация;

  • Последовательный интерфейс UART и выход широтно-импульсной модуляции (ШИМ).

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

Общие сведения

Датчик углекислого газа MH-Z19B —  датчик, который детектирует уровень СО2 по принципу недисперсионного инфракрасного излучения (NDIR). Данный датчик имеет внутреннюю температурную компенсацию, может подключаться по 3-м интерфейсам (аналоговый, ШИМ, UART), имеет малые размеры и большой срок службы.

Приблизительные нормы содержания уровня CO2 в помещениях:

Уровень CO2, ppm
Качество воздуха
300-400Эталонное качество воздуха
400-600Нормальное качество воздуха
600-800Среднее качество воздуха
800-1000Предельно допустимое качество воздуха
Свыше 1000Низкое качество воздуха
Свыше 2000Критически низкое качество воздуха

Питание

Входное напряжение питания от 4.5В до 5В постоянного тока, подаётся на выводы VCC и GND модуля.

Подключение

Датчик подключается по шине UART.

  • Vcc — 5В
  • GND — Земля
  • RX — подключается к любому порту, указанному в скетче (TX)
  • TX — подключается к любому порту, указанному в скетче (RX)

Для делителя напряжения Вам понадобятся резисторы номиналом 470 Ом и 1 кОм. Соберите Вашу схему так, как показано на схеме:

Пример:

Диапазон задаётся в (6) и (7) байтах.

Для диапазона 2000ppm (2000 в 10-ной кодировке = 07D0 в 16-ной кодировке):

Отправка

Байт 0Байт 1Байт 2Байт 3Байт 4Байт 5Байт 6Байт 7Байт 8
0xFF0x010x990х000х000х000х070хD0CRC

Для диапазона 5000ppm (5000 в 10-ной кодировке = 1388 в 16-ной кодировке):

Отправка

Байт 0Байт 1Байт 2Байт 3Байт 4Байт 5Байт 6Байт 7Байт 8
0xFF0x010x990х000x000x000x130x88CRC

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

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

Тестирование модуля инфракрасного датчика CO2 MH-Z19

Устройство построено на модуле ESP8266 NodeMcu Lua wi-fi

Сперва я подключил датчики температуры, в комнате и на улице. ds18b20
Тестирование модуля инфракрасного датчика CO2 MH-Z19

Затем собственно датчик углекислого газа. MH-Z19
Тестирование модуля инфракрасного датчика CO2 MH-Z19

И под конец дисплей
Тестирование модуля инфракрасного датчика CO2 MH-Z19

написал вот такую программу под винды

Тестирование модуля инфракрасного датчика CO2 MH-Z19

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

Про анемометры:  Все о электронной педали газа на ВАЗ 2114. Ее плюсы и минусы |

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

В результате получилось что-то вроде:

Тут видно сам прибор с экраном и программа на компьютере которая принимает информацию через WIFI.

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

Тут описан принцип работы датчика. Называется «инфракрасный оптический анализ» capnography.narod.ru/princips.html

Что касается ШИМ и UART. Я изначально решил использовать ШИМ так как это было удобнее в данной конструкции, решил попробовать, и если бы результат был не удовлетворительный, переделал бы на UART. По факту оказалось что ШИМ ничем не уступает. Точный надежный, ни каких плясок и сбоев. Так и оставил.

Тут можно прочитать про со2. Зачем его измерять? И как это влияет на наше самочувствие. www.pvsm.ru/moskva/108944

Таким получается готовое изделие
Тестирование модуля инфракрасного датчика CO2 MH-Z19
Тестирование модуля инфракрасного датчика CO2 MH-Z19

Последняя реинкарнация данного прибора

Обратите внимание чихаю и кашляю в кадре не я. Это сам прибор при превышении нормы СО2 чихает, а если уровень становится опасным кашляет.

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

Управляющие команды

Датчик имеет несколько режимов работы, которые зависят от управляющего байта:

  • 0х86 — Прочитать данные с датчика — считывает значения с датчика, где в HIGH (3) и LOW (4) байтах указаны значения CO2;

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

  • Рабочее напряжение: от 4.5В до 5В
  • Потребление тока: <60мА (150мА в пиковой нагрузке)
  • Диапазон измерений: 0~5000ppm
  • Интерфейс: UART (3.3В) / ШИМ (3.3В, толерантен к 5В)
  • Время прогрева датчика: 3мин
  • Рабочая температура: от 0 до 50℃
  • Влажность: от 0 до 95%
  • Вес: 5г

Экономьте здоровье и энергию с co 2 датчиками

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

В закрытых жилых помещениях без достаточной вентиляции уровень CO 2 может значительно возрасти от начальных наружных уровней нормы а 400 промилле до внутренних уровней 2000-3000 промилле. Это высокая концентрация CO.

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

Про анемометры:  МАГНИТНЫЕ ИЗМЕРЕНИЯ • Большая российская энциклопедия - электронная версия

Современная система вентиляции с регулированием кислорода и CO 2 может регулировать количество подачи свежего воздуха в здании в зависимости от количества людей и их активности. Люди являются основным источником CO2 в здании. Если их количество в комнате удвоится, уровень CO 2 соответственно удвоится.

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

Много энергии можно сэкономить, управляя такой системой на основе стратегически размещенного CO 2.

Вывод значений датчика в монитор последовательного порта и на led-индикатор

#include <SoftwareSerial.h>                                                // подключаем библиотеку SoftwareSerial
#include <iarduino_4LED.h>                                                 // подключаем библиотеку iarduino_4LED
SoftwareSerial co2Serial(3, 2);                                           // объявляем объект для работы с функциями библиотеки SoftwareSerial, с указанием выводов ( RX, TX )
iarduino_4LED dispLED(4, 5);                                              // объявляем объект для работы с функциями библиотеки iarduino_4LED, с указанием выводов дисплея ( CLK , DIO )

byte getCheckSum(char *packet) {                                          // функция проверки контрольной суммы
  byte i;                                                                 // создаём переменную для счёта
  unsigned char checksum = 0;                                             // создаём переменную для значения контрольной суммы
  for (i = 1; i < 8; i  ) {                                               // считаем контрольную сумму по принятому в массив response значению
    checksum  = packet[i];                                                // суммируем все байты массива
  }
  checksum = 0xff - checksum;                                             // вычитаем сумму байтов из 255 (0xff)
  checksum  = 1;                                                          // прибаляем к сумме 1
  return checksum;                                                        // возвращаем значение контрольной суммы принятого значения с датчика
}

void setup() {
  Serial.begin(9600);                                                     // инициируем подключение монитора последовательного порта на скорости 9600 бит/сек
  co2Serial.begin(9600);                                                  // инициируем подключение по последовательному порту на скорости 9600 бит/сек
  dispLED.begin();                                                        // инициируем LED дисплей
}

void loop() {
  byte cmd[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};   // массив под запрос значений датчика
  byte response[9];                                                       // массив под полученный ответ от датчика
  Serial.println("Sending CO2 request...");                               // выводим текст в монитор порта "Запрос значений..."
  co2Serial.write(cmd, 9);                                                // отправляем команду датчику сформировать 9-байтовое значение
  memset(response, 0, 9);                                                 // обнуляем массив
  int i = 0;                                                              // создаём переменную для счёта секунд
  while (co2Serial.available() == 0) {                                    // пока данные не приняты
    //    Serial.print("Waiting for response ");                          // выводим в монитор порта текст "Ожидание получения ответа"
    //    Serial.print(i);                                                // выводим количество секунд
    //    Serial.println(" s");                                           // выводим текст "секунд"
    delay(1000);                                                          // ждём 1 секунду
    i  ;                                                                  // увеличиваем значение на 1
  }
  if (co2Serial.available() > 0) {                                        // если данные приняты, то
    co2Serial.readBytes(response, 9);                                     // считваем их в массив
  }
  for (int i = 0; i < 9; i  ) {                                           // считываем 9 байт, принятых от датчика
    Serial.print(String(response[i], HEX));                               // выводим их в монитор порта
    Serial.print("   ");                                                  // через пробел
  }
  Serial.println("");                                                     // переходим на новую строку
  byte check = getCheckSum(response);                                     // выполняем проверку контрольной суммы
  if (response[8] != check) {                                             // если значение отправленное и полученное контрольной суммы не совпадает, то
    Serial.println("Checksum not OK!");                                   // выводим сообщение в монитор порта об этом
    Serial.print("Received: ");                                           // выводим текст в монитор порта "Принято:"
    Serial.println(response[8]);                                          // выводим байт контрольной суммы, который был принят
    Serial.print("Should be: ");                                          // выводим текст "Должно быть" (было отправлено)
    Serial.println(check);                                                // выводим байт контрольной суммы, который был отправлен
  }
  int ppm_uart = 256 * (int)response[2]   response[3];                    // вычисляем значение CO2
  Serial.print("CO2 Level = ");                                           // выводим текст в монитор последовательного порта "Уровень СО2:"
  Serial.println(ppm_uart);                                               // выводим значение СО2 в монитор порта
  dispLED.print(ppm_uart);                                                // выводим значение СО2 на дисплей
  byte crc[9] = {};                                                       // обнуляем байт контрольной суммы
  delay(5000);                                                            // ждём 5 секунд
}

Оцените статью
Анемометры
Добавить комментарий

Adblock
detector