Измеряем концентрацию CO2 в квартире с помощью MH-Z19

    Практически любая метеостанция, включая дешевые китайские модели за несколько долларов, умеет измерять основные параметры воздуха — температуру и влажность. С углекислым газом все сложнее: бытовых приборов, способных его измерять, практически нет в продаже. Усложняет ситуацию и то, что CO2 — газ без цвета и запаха, так что «носом» ощутить его концентрацию практически невозможно.

    Подробности и измерения под катом.

    Сам датчик MH-Z19 уже описывался здесь на сайте. За основу была взята статья "Обзор инфракрасного датчика CO2", а данный материал является его логическим продолжением. Про измерение концентрации CO2 на улице было написано здесь, однако данных о концентрации в квартире там не приводилось. Восполним этот пробел.

    Железо


    Первым делом на eBay были заказаны следующие компоненты:
    Arduino Micro ATmega32U4 3.3V (цена вопроса 5$). Т.к. датчик имеет 3-вольтовую логику, обычные Arduino лучше не использовать.
    OLED LCD-дисплей I2C 0.91«128x32 (цена вопроса 7$). Дисплей подключается к стандартным i2c-пинам Arduino.
    — Собственно датчик MH-Z19 (цена вопроса 28$).
    — Набор проводов с разъемами для штыревых контактов (цена вопроса 1-2$)
    Таким образом, общая стоимость составила ~40$, или 2600р. Фирменный прибор от известной компании стоит примерно вдвое дороже, хотя здесь скорее вопрос не экономии, а технического интереса.

    Код для Arduino был позаимствован из вышеприведенной статьи, в него был добавлен вывод данных на дисплей, а для более удобного анализа данных вывод был переделан в формат простой строки с разделителем. Также были добавлены метки времени, каждая соответствует 10 секундам.
    Исходный код
    #include <SoftwareSerial.h>
    #include <Wire.h>
    
    // I2C OLED
    #include "SSD1306Ascii.h"
    #include "SSD1306AsciiWire.h"
    #define I2C_ADDRESS 0x3C
    SSD1306AsciiWire oled;
    
    // CO2 sensor:
    SoftwareSerial mySerial(8,9); // RX,TX
    byte cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79}; 
    unsigned char response[9];
    
    void setup() {
      // Serial
      Serial.begin(9600);
      mySerial.begin(9600);
    
      // OLED
      Wire.begin();         
      oled.begin(&Adafruit128x32, I2C_ADDRESS);
      oled.set400kHz();  
      oled.setFont(ZevvPeep8x16);  
    
      oled.clear();  
      oled.println("setup::init()");
    }
    
    long t = 0;
    
    void loop() 
    {
      mySerial.write(cmd, 9);
      memset(response, 0, 9);
      mySerial.readBytes(response, 9);
      int i;
      byte crc = 0;
      for (i = 1; i < 8; i++) crc+=response[i];
      crc = 255 - crc;
      crc++;
    
      oled.clear();  
      if ( !(response[0] == 0xFF && response[1] == 0x86 && response[8] == crc) ) {
        Serial.println("CRC error: " + String(crc) + " / "+ String(response[8]));
        oled.println("Sensor CRC error");
      } else {
        unsigned int responseHigh = (unsigned int) response[2];
        unsigned int responseLow = (unsigned int) response[3];
        unsigned int ppm = (256*responseHigh) + responseLow;
        Serial.print(String(t)); Serial.print(","); Serial.print(ppm); Serial.println(";");
        if (ppm <= 400 || ppm > 4900) {
          oled.println("CO2: no data");          
        } else {
          oled.println("CO2: " + String(ppm) + " ppm"); 
          if (ppm < 450) {   
            oled.println("Very good");
          }
          else if (ppm < 600) {   
            oled.println("Good");
          }
          else if (ppm < 1000) {   
            oled.println("Acceptable");
          }
          else if (ppm < 2500) {   
            oled.println("Bad");
          }
         else {   
            oled.println("Health risk");
          }
        }
      }
      delay(10000);
      t += 10;
    }
    


    Все это было собрано вместе, скетч залит в ардуину, результат выглядит примерно так:
    image

    Конечно это не верх промышленного дизайна (в планах подыскать какой-то корпус), но для задачи показометра, способного работать как автономно, так и передавать данные по USB, устройство вполне справляется. Для получения данных по USB достаточно открыть в Arduino IDE монитор порта, в нем будут выводиться данные. Текст оттуда можно скопировать и открыть в любой программе, например в Excel.

    Измерения


    Следующий вопрос: что мы собственно измеряем? Устройство выдает данные в ppm (parts per million, частей на миллион). 1000 ppm = 0,1% содержания СО2. В интернете можно найти следующую таблицу допустимых концентраций:
    350 — 450 ppm: Нормальный уровень на открытом воздухе.
    < 600 ppm: Приемлемые уровни. Уровень. рекомендованный для спален, детских садов и школ.
    600 — 1000 ppm: Жалобы на несвежий воздух, возможно снижение концентрации внимания.
    1000 ppm: Максимальный уровень стандартов ASHRAE (American Society of Heating, Refrigerating and Air-Conditioning Engineers) и OSHA (Occupational Safety & Health Administration).
    1000 — 2500 ppm: Общая вялость, снижение концентрации внимания, возможна головная боль.
    2500 — 5000 ppm: Возможны нежелательные эффекты на здоровье.

    И наконец, результаты. Датчик был поставлен на кухне, окна металлопластиковые, время измерения около 8 часов.

    Результаты оказались довольно-таки интересными. По горизонтали время в секундах, 3600 секунд соответствуют 1 часу.

    Кривые на графике расшифровываются так:
    0ч: показания около 420ppm (соответствуют уличным), дома никого не было, я пришел с работы и заодно включил датчик.
    0-2 часа: я нахожусь на кухне, видно как в присутствии человека концентрация co2 медленно растет где-то до 900ppm.
    2-4 часа: я ушел из помещения, видно как концентрация медленно спадает.
    4-6 часов: я вернулся обратно, концентрация снова стала расти.
    6й час: на плиту поставлена кастрюля с пельменями. Интересно видеть, как концентрация практически моментально увеличилась до 1700ppm, затем стала медленно спадать. Хотя газ горел недолго (минут 10-15) высокие уровни >1000 ppm держатся не менее часа.
    Конец графика: было открыто окно, и уровень co2 упал практически сразу же.

    Выводы


    Устройство оказалось довольно-таки интересным, и особенно актуальным для работающих дома за компьютером. Так например, за время написания этой статьи уровень co2 вырос в помещении с 500 до 770ppm. Поглядывание на экран заставляет либо чаще открывать окно, либо наконец-таки задуматься об устройстве в доме нормальной вентиляции (наверное режим микропроветривания в окне был бы не лишним, а лучше какая-то вытяжка). Если бы я сейчас покупал новые окна, наверно задумался бы о более-менее качественной модели с нормальным проветриванием.

    Также важно отметить актуальность хорошей вентиляции на кухне: как показывает график, даже за 10 минут одна газовая горелка может „выжечь“ весь запас кислорода, доведя концентрацию CO2 до весьма высокой. Измерения в спальне показали, что в плане вентиляции тоже все не очень хорошо: к утру концентрация co2 составляет более 1000ppm, а для умственного труда хороший сон это весьма актуально.

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

    Комментарии 58

      0
      Где-то здесь же пишет «Тион» – производитель «проветривателей».
      Я лично поставил такой в каждую комнату, и мне довольно сильно нравится результат.

      Окна, открытые или с микропроветриванием, решая или частично решая вопрос с CO2, создают другие проблемы. Это холод, грязь\запахи в воздухе, шум (автосигнализация, песни под окнами и т.п.).

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

          ну, или приостанавливает, до следующего острого периода желания поувлажнять.

          а проветриватель работает, внимания не требует, и свою задачу решает.

          я бы «комбайн», скорее всего, и брать бы не стал — вряд ли удалось бы два полноценных устройства так объединить.

          ну а про ионизатор мнения не имею.
            +1
            я использую увлажнитель в зимний период уже 7 лет, и желание доливать воду не пропадает. Разница сухой/влажный воздух ощущается весьма сильно
              0
              Просто заведите аквариум. И никакого увлажнителя не надо.
                0
                А в аквариум воды не надо доливать?
                  0
                  Надо, но не доливать, а подменять. А это так или иначе приходится делать. В идеале — раз в неделю. Реально — лень мешает, но приходится. Рыбки — они живые.
                    0
                    Подменять? Мне биологи говорили что только доливка.
                      0
                      Сливается примерно четверть, заливается свежая.
                      Если только доливать, то начинает увеличиваться концентрация всего и прежде всего ненужных соединений азота. Испаряется только вода, а добавляете растворы всего на свете, плюс рыбий метаболизм. В общем, со временем аквариум превратится в соленую клоаку. :)
                      Обязательно сливать и только потом доливать. Надо удалять продукты жизнедеятельности рыб.
                        0
                        С этим (частично) могут справляться фильтры и прочие очистители. Если качественную систему поставить — можно будет воду обновлять гораздо реже (не аквариумист, точно не скажу, но что-то около раза в полгода-год). Остальное время только доливая.
                          0
                          Рыбу постоянно кормят, а согласно закону сохранения вещества, всё это остаётся в банке. Важно удалять продукты жизнедеятельности. Как это сделать неважно. Можно и фильтрами. В морских аквариумах так и делают. Но подменить воду проще и гораздо дешевле, что характерно.
                            0
                            .
                        0
                        Если вы увлажняете воздух с помощью аквариума, то вода в нём испаряется, тогда требуется в общем смысле долив. Если долива требуется мало, то и процесс увлажнения воздуха идёт медленно.
                          0
                          Я не увлажняю. Меня и так всё устраивает. У меня рыбки для эстетики.
                      0
                      И какая у его производительность? У меня зимой (~ -25), при вентиляции достаточной для поддержания концентрации CO2 <800ppm при 2-х людях в квартире, увлажнитель с производительностью 400г/ч кое как держал влажность на уровне 20% и то не всегда…
                        0
                        Думаю, поллитра в час не будет. Но в квартире с аквариумом однозначно гораздо лучше обстоят дела чем без оного. Мой совет был больше из области «как побороть свою лень».
                  0
                  СКОЛЬКО-СКОЛЬКО ОН СТОИТ?!?!
                  0
                  Не подскажете насколько изменяются показания датчика с течением времени, нужно ли его калибровать?
                    0
                    Возможность калибровки в datasheet описана: http://eleparts.co.kr/data/design/product_file/SENSOR/gas/MH-Z19_CO2%20Manual%20V2.pdf
                    Но ни разу не читал, чтобы кто-то реально ее делал (да и не очень понятно как).
                      +2
                      Калибровка там по 400 ppm свежего атмосферного воздуха.
                      А вот 4 новых датчика MH-Z19 из упаковки без калибровки:

                      image
                        0
                        Я правильно понимаю что калибруется по принципу «принимаем что норма это 400 ppm»? По моим измерениям на улице датчик показывал 350 ppm
                          0
                          Правильно. На сколько я читал, известный Green Eye при автоматической калибровке берет минимальный показатель CO2 за неделю и сравнивая с эталонными 400 соответственно вводит поправку. У вас получаются показатели на 50 ppm занижены.
                            0
                            А в чем смысл такой калибровки? У нас нет никакой гарантии, что уличный воздух == 400ppm, т.е. легко ту же ошибку в 50ppm опять получить.

                            Да и в общем-то пофиг, ведь в реале интереснее динамика изменения показаний, а не абсолютные значения.
                              0
                              Опять же на сколько я знаю, концентрация CO2 довольно постоянна и разницу в 50ppm на открытом пространстве никак не получить. Вот например цитата из вики — «Углекислый газ в атмосфере Земли, по состоянию на 2013 год, колебался в пределах от 393 ppm (0,0393 %) до 397 ppm (0,0397 %).».
                              А вот на счет того, что интересней, это наверно субъективно. Мне интересней текущие показания. Динамика интересна была только в начале, потом и так становится понятно, что включение газа на кухне влечет быстрый рост концентрации CO2 по всей квартире.
                                0
                                Так ведь станции, измеряющие CO2 в атмосфере земли, располагают чуть ли не в горах. А в городе показания будут меняться от тучи факторов — количества машин за окном, силы и направления ветра который все это разгоняет, и пр. Какая тут точность…
                                  0
                                  Не буду спорить, не удалось найти информации по мониторингу CO2 в городах, но по-моему логично, что показатели в городе могут только ухудшиться, но никак не стать лучше чем в горах
                                    0
                                    Вот здесь написано, как измеряли co2 в атмосфере: https://ru.wikipedia.org/wiki/График_Килинга

                                    В городе суть в том, что значения явно будут меняться ежедневно, и использовать их для калибровки не очень точно имхо.
                                  • НЛО прилетело и опубликовало эту надпись здесь
                                      0
                                      Нет ветра — выхлопные газы не перемешиваются — увеличивается концентрация углекислого газа. На 1 г сожженного бензина больше 3 г углекислого газа. Если 4 млн авто в Москве сожгут за день по 12 л бензина (примерно 1 кг), то на каждый кубометр воздуха в трехметровом приземном слое придется около 60 г углекислого газа — а это 60 ppm. Если взять площадь дорог в Москве (около 9%) — то в пределах дорожной сети концентрация углекислого газа вырастет примерно на 600 ppm, т.е. будет порядка 1000 в лучшем случае, а это уже много.
                                  0
                                  Но конечно ошибка в 50ppm это мелочи, тем более что у MH-Z19 точность ±50+5%. Но со временем она будет расти.
                                    0
                                    Это решения для домашних устройств. Выбор из 2-х зол меньшего: или ничего не делать и смириться с дрейфом параметров (потому что массовый пользователь не имеет доступа к калиброванным смесям газов на которых можно калибровать, да и даже если это можно сделать где-то, не будет этого делать с требуемой частотой), или принять что на улице у нас 400ppm, и мерить не абсолютные значения, а значение относительно того что за окном. От перекалибровки защищаются тем что минимальное значение берется за как-то продолжительный промежуток времени, например неделя, и вводят максимальную допустимую разовую поправку, например 50ppm, если не ошибаюсь так сделано в Green Eye. Для домашнего применения этого достаточно. Ну а где требуется абсолютные значения и точность приборы калибруют на смесях, они проходят поверку, и все остальные прелести серьезных измерительных приборов.
                          0
                          Злободневно. Мы, разработчики, обычно любим заботиться о концентрации внимания — было бы интересно отмониторить типичное офисное помещение, например, openspace.

                          /* Предлагаю поменять по тексту «цена вопроса» и «стоимость» на «цена» — с точки зрения стилистики статья будет сиять. */
                            +1
                            В течение года мониторю (!!! медведевский термин — так себе, лучше слежу, наболюдаю, контролирую) ) офисное пространство на работе. Правда обычным даджетовским USB-датчиком. За это время датчик стал просто незаменим при войне за открытое окно. Планктон смирился, что при горящем желтом диоде надо проветриваться, а при красном — радикально проветриваться. А до этого крики про сквозняки были огого…
                              0
                              В офисе где я работаю, проверял, все ок, 450ppm в течении всего дня (современный бизнес-центр с нормально работающей вентиляцией, окна кстати не открываются вообще, даже ручек нет).
                                0
                                Везет. У нас промпредприятие с еврическим ремонтом. Исходно присутствовавшую вентиляцию замуровали и закрыли подвесными потолками. пластиковые окна воздух почти не подтравливают. Зимой в некоторых помещениях вообще зашкаливает за 2500 ppm. Зато теперь у меня редко больше 600 бывает.
                              0
                              А почему концентрация после включения плиты с таким резким пиком и спадом? Не ошибка-ли это датчика?
                                +1
                                Вероятно, потому, что когда варят пельменьки, то газ обычно сначала включают на максимум, чтобы вода быстрее закипела, затем убавляют, лишь слегка поддерживая кипение.
                                  0
                                  На графике просто масштаб времени мал, в реале разумеется вертикальных линий там нет, «мгновенно» концентрация не повышается.

                                  Фрагмент графика
                                  "
                                    +1

                                    Пик очевидно приходится на момент опускания пельменей в воду и в результате электролиза...

                                    +1
                                    даже за 10 минут одна газовая горелка может „выжечь“ весь запас кислорода


                                    Не соглашусь. Никуда не выжигается ничего. СО2 повышается — это бесспорно.

                                    Вы измеряли концентрацию кислорода? Измерьте. Удивитесь, но она останется той же, тот же самый 21% (плюс-минус копейки).

                                    В вашем случае, чисто математически, уровень СО2 вырос на 0.13% (с 400 до 1700 ppm).
                                      0
                                      Спасибо за уточнение.
                                      0
                                      Поглядывание на экран заставляет либо чаще открывать окно, либо наконец-таки задуматься об устройстве в доме нормальной вентиляции (наверное режим микропроветривания в окне был бы не лишним, а лучше какая-то вытяжка).
                                      Прощай спокойная жизнь. Помню до того как купил анализатор CO2 мне было в квартире только или жарко или холодно, зимой практически никогда не заморачивался открытием окон и чувствовал себя вполне комфортно, а прошлая зима превратилась в сплошную борьбу холод-сквозняк-CO2 с бесконечным открытием-закрытием окон при переходе из одной комнаты в другую а летом все это усугубила еще плохо работающая вытяжка в жару и шум. В итоге я не выдержал и установил приточку (которая в первом комментарии упоминается), пока еще не совсем ясно решила ли она все проблемы, но в квартире теперь при закрытых окнах CO2 держится в районе 900-1100 ppm (раньше даже при микропроветривании во всех комнатах этот показатель мог запросто уйти за 2000).
                                        0
                                        Знакомая проблема. Решил установкой зимой обогревателя на пути холодного воздуха от окна. Решило проблему только частично, да и расходы на электроэнергию возросли. Но 900-1100 дома все же много. Стараюсь держать не больше 700, но получается не всегда.
                                          0
                                          Понаблюдав несколько недель за CO2 пришёл к выводу что без приточных систем сложно обеспечить низкий уровень СО2. Только если окно постоянно открыто. Да и не ощущаю я разницы между разными уровням CO2, кроме особо высоких (больше 2000), поэтому решил поставить уровни предупреждения жёлтый — 1000, красный — 1500.
                                          После приобритения датчика сильно удивился как быстро комната в 60 м3 «надыхивается» всего двумя людьми :)
                                            0
                                            Вы может не ощущаете, а вот кровеносная система — запросто. Это как температура света к комнате. Вроде теплый ничем не отличается от холодного, видно и так и так, а вот через пару часов от теплого света, в сон клонит.
                                            Есть многие недомогания, которые лет 10 назад, я бы никогда не проассоциировал бы с СО2, а теперь запросто. Например утомляемость, сексуальное либидо, уровень мигрени — вполне себе зависят от свежести воздуха (не только, разумеется).
                                          0
                                          Здравствуйте снова. Наконец то все детали дошли но возникла проблема с чего начать, никогда ничего не собирал на arduino и просто сижу смотрю на горку плат и кучку проводов :) Не могли бы вы добавить технических деталей? Может быть можно это сделать в отдельной статье или хотя бы схему. Так же непонятно откуда брать 3.3v? Я так понимаю что сама платка подключается к обычному usb и регулятор напряжения уже есть в плате и управляется программно или надо самому что-то паять? И если плата на 3.3 v то не повредит ли usb который дает 5v её? Заранее большое спасибо!
                                            0
                                            На Arduino есть выход 3v3, поищите эту надпись на одной из ног и подключайтесь туда.
                                            Если у вас nano, то 3v3 нога находится рядом с 13м выводом, около USB порта.
                                              0
                                              Спасибо большое!
                                                0
                                                Так, я все больше и больше запутался. При более внимательном прочтении статьи на которую ссылается автор https://geektimes.ru/post/272090/ написано что питание датчика 3.3v — 5.5v, а напряжение TX/RX должно быть 3.3v. На картинке автора видно, что он подключил питание к VCC выходу Arduino с которго идет 3.3v как вы и говорили и как написано здесь: https://learn.sparkfun.com/tutorials/pro-micro--fio-v3-hookup-guide

                                                — If the board is powered through the ‘RAW’ pin (or USB), this pin can be used as an output to supply other devices.

                                                То есть получается, что автор ошибся или я что-то недопонял?

                                                И еще вопрос, вы не подскажете почему автор (пишу вам, потому что автор молчит :) ) использует software serial, когда у этой платы есть hardware serial?
                                                  0
                                                  Приветствую,
                                                  Все правильно, уровни RX/TX 3.3В.
                                                  .
                                                  http://eleparts.co.kr/data/design/product_file/SENSOR/gas/MH-Z19_CO2%20Manual%20V2.pdf
                                                  Product Model MH-Z19
                                                  Working voltage 3.6 ~ 5.5 V DC
                                                  Interface level 3.3 V

                                                  Напряжение питания датчика — 3.3-5.5В, т.е. от 5В работать будет. Но уровни RX/TX — 3х вольтовые, и я сразу писал что использовал Ардуину с процессором 3.3В.

                                                  Software serial используется потому, что главный serial ардуины используется для коннекта с компом :)

                                                  Схемы как таковой и нет, там всего 4 провода — земля, питание, RX/TX. Посмотрите в гугле по запросу arduino pinout.

                                                  Подключите сначала датчик, убедитесь что работает (в Мониторе порта Arduino IDE должны идти данные), потом дисплей можете подключить.
                                                    0
                                                    Большое спасибо что ответили! Я уже со всем разобрался, но меня только смущает что вы запитали датчик (на фотографии видно) от Arduino VCC выхода с которого снимается 3.3в если это 3-х вольтовый Arduino, и везде написано что 3.3в это мало (минимальное 3.6в иначе может сбоить) об этом говорит автор статьи на которого вы ссылаетесь в начале.
                                                      0
                                                      Я уже не помню, схема разобрана давно, 2 месяца прошло :) По-моему на этой ардуине на пине VCC 5В, померяйте на своей тестером.
                                                        0
                                                        Спасибо! :)
                                                      0
                                                      Большое спасибо, собрал, прошил и вроде заработало! Начало показывать 625 и потом все уменьшаться и уменьшаться, через некоторое время начало показывать «no data». Судя по вашему коду это если меньше 450ppm что в принципе логично так как живем в деревне на возвышенности (500 метров над уровнем моря) практически в лесу и окна все настежь открытые. Завтра возьму на работу проверять.
                                                      П.С. Пока дописал пост поднялся до 523ppm и снова упал, в общем буду играться :)
                                                        0
                                                        Да, вроде показания похожи на правду.
                                                      0
                                                      У датчика стабилизатор стоит на вход VCC, по этому ему и можно подавать до пяти вольт, а брать 3v3 просто ногу удобнее, так как рабочее напряжение датчика аккурат 3v3 и не будет лишних потерь на понижение. Так как датчик обладает своим стабилизатором — на UART он подаст строго 3v3 как максимум.

                                                      Автор не ошибся, просто у всех компонентов есть свои стабилизаторы. Правда я-б не стал дуиной, питаемой на 5v, подавать сигналы через UART на датчик 3v3, по крайней мере без резистора.

                                                      Software Serial удобнее при разработке, поймете почему как столкнетесь с длительной отладкой и перезаливкой скетча через каждые пару минут (:
                                                        0
                                                        Спасибо большое за разъяснения!
                                                          0
                                                          Если у вас дуина на 5в логике (вдруг), можно *duino TX → sensor RX пины соединять через резистор в 1.8к. Я так с SD картой работаю.

                                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                Самое читаемое