Инструкции

» » Тестирование модуля инфракрасного датчика 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 датчиками

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

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

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

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

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

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



О MH-Z19 CO 2 датчике

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

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

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

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

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

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

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

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


Принцип действия

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

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

Инфракрасный модуль обнаружения газа CO 2 MH-Z19B NDIR обычно используется в:

  • Климатическом оборудовании в школах, офисных зданиях и т. д. ;

  • Экологических домах;

  • Для мониторинга качества воздуха в помещении;

  • Умной бытовой технике.

Руководство пользователя можно найти на сайте //www.winsen-sensor.com 


Технические характеристики MH-Z19


Глядя на датчик снизу, вы увидите следующие выводы:


Штыри имеют шаг 2,54 мм (0,1 дюйма), что облегчает пайку простого однорядного колпачка штифта, как показано на рис. 1 выше.


Подключение к Raspberry Pi

Raspberry Pi 3 подключен к датчику MH-Z19



Расположение и определения контактов MH-Z19


MH-Z19 имеет внутренний аналоговый стабилизатор напряжения с низким падением напряжения от 5 до 3,3 В. Это делает логические сигналы на RX и TX совместимыми с логическими уровнями Raspberry Pi, которые являются CMOS 3.3V. Следовательно, преобразователи уровня не нужны.


Подготовка Raspberry Pi 3 для связи UART

Raspberry pi UART, присутствующий на GPIO (40-контактный разъем), требует некоторой подготовки перед использованием. 

Вы должны: 

  • Выключить консоль, если она использует UART в качестве оболочки для входа; 

  • Включите UART в файл /dev/config.txt. 


Программа тестирования регистратора данных Python MH-Z19

Простая тестовая программа открывает UART COM Port serial0 и пытается прочитать CO 2 измеренных значений от CO 2 датчика каждую минуту. 

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


#!/usr/bin/python

import serial, os, time, sys, datetime, csv

 

def logfilename():

    now = datetime.datetime.now()

    #Colon is not alowed in filenames so we have to include a lookalike char 

    return 'CO2LOG-%0.4d-%0.2d-%0.2d-%0.2d%s%0.2d%s%0.2d.csv' % 

            (now.year, now.month, now.day, now.hour,

            u'ua789',now.minute, u'ua789', now.second)

 

#Function to calculate MH-Z19 crc according to datasheet

def crc8(a):

    crc=0x00

    count=1

    b=bytearray(a)

    while count<8:

        crc+=b[count]

        count=count+1

    #Truncate to 8 bit

    crc%=256

    #Invert number with xor

    crc=~crc&0xFF

    crc+=1

    return crc

 

    # try to open serial port

    

port='/dev/serial0'

sys.stderr.write('Trying port %sn' % port)

            

try:

    # try to read a line of data from the serial port and parse    

    with serial.Serial(port, 9600, timeout=2.0) as ser:

        # 'warm up' with reading one input

        result=ser.write("xffx01x86x00x00x00x00x00x79")

        time.sleep(0.1)

        s=ser.read(9)

        z=bytearray(s)

        # Calculate crc

        crc=crc8(s) 

        if crc != z[8]:

            sys.stderr.write('CRC error calculated %d bytes= %d:%d:%d:%d:%d:%d:%d:%d crc= %dn' % (crc, z[0],z[1],z[2],z[3],z[4],z[5],z[6],z[7],z[8]))

        else:

            sys.stderr.write('Logging data on %s to %sn' % (port, logfilename()))

        # log data

        outfname = logfilename()

        with open(outfname, 'a') as f:

        # loop will exit with Ctrl-C, which raises a KeyboardInterrupt

            while True:

                #Send "read value" command to MH-Z19 sensor

                result=ser.write("xffx01x86x00x00x00x00x00x79")

                time.sleep(0.1)

                s=ser.read(9)

                z=bytearray(s)

                crc=crc8(s)

                #Calculate crc

                if crc != z[8]:

                    sys.stderr.write('CRC error calculated %d bytes= %d:%d:%d:%d:%d:%d:%d:%d crc= %dn' % (crc, z[0],z[1],z[2],z[3],z[4],z[5],z[6],z[7],z[8]))

                else:       

                    if s[0] == "xff" and s[1] == "x86":

                        print "co2=", ord(s[2])*256 + ord(s[3])

                co2value=ord(s[2])*256 + ord(s[3])

                now=time.ctime()

                parsed=time.strptime(now)

                lgtime=time.strftime("%Y %m %d %H:%M:%S")

                row=[lgtime,co2value]

                w=csv.writer(f)

                w.writerow(row)

                #Sample every minute, synced to local time

                t=datetime.datetime.now()

                sleeptime=60-t.second

                time.sleep(sleeptime)

except Exception as e:

    f.close()

    ser.close()

    sys.stderr.write('Error reading serial port %s: %sn' % (type(e).__name__, e))

except KeyboardInterrupt as e:

    f.close()

    ser.close()

    sys.stderr.write('nCtrl+C pressed, exiting log of %s to %sn' % (port, outfname))

Запуск тестовой программы

Сохраните код тестовой программы указанный выше как mhz19.py. 

Откройте окно терминала (Rasbian Lxterminal) и введите:

sudo python mhz10.py 

На рисунке ниже показан результат простой тестовой программы mhz19.py. Измерения CO 2 отбираются каждую минуту.


Это содержимое файла журнала в формате csv:


Этот формат файла CSV может быть легко импортирован в Excel и в виде графика:



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

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


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

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

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

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


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

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

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


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

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

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


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

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

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