Подключение PIR датчика углекислого газа CO2 MH-Z19 к Arduino – Электроник74

Подключение PIR датчика углекислого газа CO2 MH-Z19 к Arduino - Электроник74 Анемометр

Железо

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

Arduino Micro ATmega32U4 3.3V

(цена вопроса 5$). Т.к. датчик имеет 3-вольтовую логику, обычные Arduino лучше не использовать.

OLED LCD-дисплей I2C 0.91«128×32

(цена вопроса 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 — 1000 ppm

: Жалобы на несвежий воздух, возможно снижение концентрации внимания.

1000 ppm

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

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

Подключение PIR датчика углекислого газа CO2 MH-Z19 к Arduino - Электроник74

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

Сперва я подключил датчики температуры, в комнате и на улице. ds18b20
Подключение PIR датчика углекислого газа CO2 MH-Z19 к Arduino - Электроник74

Затем собственно датчик углекислого газа. MH-Z19
Подключение PIR датчика углекислого газа CO2 MH-Z19 к Arduino - Электроник74

И под конец дисплей
Подключение PIR датчика углекислого газа CO2 MH-Z19 к Arduino - Электроник74

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

Подключение PIR датчика углекислого газа CO2 MH-Z19 к Arduino - Электроник74

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

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

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

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

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

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

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

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

Таким получается готовое изделие
Подключение PIR датчика углекислого газа CO2 MH-Z19 к Arduino - Электроник74
Подключение PIR датчика углекислого газа CO2 MH-Z19 к Arduino - Электроник74

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

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

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

Скетч

Для переносного датчика MH-Z19 с дисплеем Nokia 5110. Потребуются библиотеки Adafruit_GFX_5110 и DHT11.

#include<SPI.h>#include<Adafruit_GFX.h>#include<dht11.h>#include<Adafruit_PCD8544.h>Adafruit_PCD8544display=Adafruit_PCD8544(7,6,5,4,3);dht11DHT;#defineDHT11_PIN8#definepwmPin2#defineLedPin13intprevVal=LOW,times=0;longth,tl,h,l,ppm;voidsetup(){  Serial.begin(9600);  pinMode(pwmPin,INPUT);  pinMode(LedPin,OUTPUT);  display.begin();  display.clearDisplay();  display.setContrast(60);  display.setTextSize(2);  display.setTextColor(BLACK);}voidloop(){  longtt=millis();  //чтение PWM от CO2  intmyVal=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));      display.clearDisplay();      display.setCursor(0,0);      if(ppm<1000)        display.println(String(ppm) "ppm");      else        display.print(String(ppm) "ppm");      times ;      if(times>=3){        times=0;        intchk=DHT.read(DHT11_PIN);    // Чтение данных        switch(chk){          caseDHTLIB_OK:            break;          caseDHTLIB_ERROR_CHECKSUM:            display.println("Checksum error, t");            break;          caseDHTLIB_ERROR_TIMEOUT:            display.println("Time out error, t");            break;          default:            display.println("Unknown error, t");            break;        }        // Выводим показания влажности и температуры        display.print("Hum:");        display.println(DHT.humidity,1);        display.print("Temp:");        display.println(DHT.temperature,1);      }      display.display();    }  }}

Выводы

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

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

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

Про анемометры:  Типы электромагнитных расходомеров
Оцените статью
Анемометры