Простейший измеритель CO2 за 2000 рублей и полчаса / Хабр

Простейший измеритель CO2 за 2000 рублей и полчаса / Хабр Анемометр

▍ введение

Притормозим с открытием САПР для проектирования печатных плат и IDE. Зададим несколько вопросов и соберём нужную нам информацию.

Негативные эффекты от воздействия СО₂ начинают проявляться, когда уже всё — приплыли. Даже если после их проявления проветрить помещение, то они сразу не уйдут и будут о себе напоминать ещё некоторое время (в моём случае это минут 20-30). Чтобы этого избежать нужно измерять уровень СО₂ и сигнализировать о повышенном уровне заранее.

Концентрация СО₂ измеряется в PPM. По сути, PPM это количество молекул СО₂ на миллион молекул другого газа, в нашем случае воздуха. Например, если концентрация равна 400ppm, то это значит, что в измеряемом объёме на каждый 1млн молекул приходится 400 молекул измеряемого газа.

Раз уж мы заговорили о концентрации, то нужно понять, при какой концентрации начинают наступать негативные эффекты. И тут нам поможет вот такая красивая картинка:

Концентрация СО₂ vs последствия

Как видно из шкалы уже при 1000 PPM начитают проявляться первые негативные эффекты, соответственно при этом значении нужно начинать наводить панику. При достижении 2500 PPM начинаются уже более серьёзные последствия, а 5000 ppm гарантировано заставят вас покинуть помещение и сходить за очередной кружкой чая.

Что наблюдается в типичных жилых помещениях?

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

Типичный уровень CO2 тут стабилизируется примерно на отметке 1000-1200. Если в комнате закрыть коридорную дверь, за ночь он поднимается до 1700 единиц. Ставя окно на зимнее проветривание (небольшие щели), уровень CO2 фиксируется на отметке 1200 с закрытой дверью и 800-900 с открытой. Минутное проветривание в осенний период с открытой балконной дверью и окнами на балконе дает падение с 1300 единиц до 800.

Описание и комплектация

С Aliexpress прибор пришел в симпатичной коробке. Внутри краткая инструкция на английском и блок питания со штекером microUSB.

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

Основной экран отображает количество частей СО2 (PPM), температуру и относительную влажность воздуха. Вверху есть индикатор заряда аккумулятора.

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

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

В приборе установлен датчик CO2 шведской компании SenseAir.

И стандартный аккумулятор типоразмера 18650 емкостью 2200 мА·ч.

▍ выбор железа

Я решил использовать STM32F030 в качестве микроконтроллера для обработки данных с датчика. Да, у STM есть L версии микроконтроллеров, которые в разы меньше потребляют, но и цена у них в разы выше. На самом деле у меня их целая коробка и нужно их куда-то определять.

В качестве DC-DC для питания устройства возьмём L6920DTR. Не очень дорогой и требует минимум обвязки, да и эффективность заявлена неплохая — порядка 95%. С питанием тут не всё просто. Для питания датчика нужно 5В, а для питания МК 3.3В. Соответственно проще всего будет поднять напряжение до 5В при помощи DC-DC, а для питания МК опустить напряжение обычным линейным стабилизатором. При токах питания МК потери на стабилизаторе будут минимальные.

Для зарядки АКБ используем микросхему STC4054GR. Она имеет все необходимые нам плюшки в виде установки тока заряда и индикации. Сам аккумулятор выберем позже после разработки ПП, чтобы это всё дело влезло в корпус с максимальным использованием свободного места.

Дисплей возьмём 0.96 дюйма на базе SSD1306:

Простейший измеритель CO2 за 2000 рублей и полчаса / Хабр
Дисплей на базе SSD1306

▍ датчик со₂

Начнём с самого основного — измерительного модуля. Разумеется, мы возьмём готовый OEM вариант, т.к. разрабатывать свой ну это крайне сложная задача и требует наличия людей намного умнее меня. Мой выбор пал на NDIR датчик MH-Z19B, т.к. его проще всего достать:

MH-Z19B

Относительно остальных компонентов это будет самая дорогая часть устройства не только в плане цены, но и в плане потребления. Давайте глянем его характеристики:

Остальные характеристики нас особо не интересуют. Т.к. датчик китайский, то разумеется там погрешность измерений 0% (сарказм).

Давайте немного поговорим о том, как он работает. Упрощённая схема выглядит так:

Простейший измеритель CO2 за 2000 рублей и полчаса / ХабрСхема работы датчика газов

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

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

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

Продолжим ковырять наше устройство дальше.

▍ разработка корпуса

3D модель корпуса

На лицевой части имеются 3 отверстия для светодиодов. Два верхних для индикации концентрации: жёлтый и красный. Жёлтый означает, что пора открыть окно, красный — пора бежать 🙂 Третье отверстие для светодиода индикации процесса заряда АКБ.

Также спереди и снизу имеются отверстия для циркуляции воздуха. Изначально я хотел сделать принудительную циркуляцию при помощи вентилятора. Микроконтроллер периодически запускал бы его и продувал датчик, но впоследствии отказался от этого. Не хочу, чтобы ночью он внезапно начал шуршать вентилятором, да и механические детали не очень надёжны (скрипят, шумят, в них постоянно что-то попадает).

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

Устройство собирается как бутерброд. Сначала ставятся светодиоды и дисплей. Дисплей крепится за направляющие путём их оплавления, т.е. снять его без разрушения элементов корпуса не получится. Не очень хорошее решение, но если подумать «А зачем его вообще снимать оттуда?»

Простейший измеритель CO2 за 2000 рублей и полчаса / Хабр
Крепление дисплея к корпусу

Дальше устанавливается основная плата. Она уже крепится на саморезы, т.к. в процессе отладки приходилось её часто снимать.

Простейший измеритель CO2 за 2000 рублей и полчаса / Хабр
Установка ПП в корпус

Дальше ставится АКБ на плату и прижимается задней крышкой. Кстати, АКБ я выбрал на 1200мА — это самый толстый АКБ, который влез в этот корпус.

Простейший измеритель CO2 за 2000 рублей и полчаса / Хабр
АКБПростейший измеритель CO2 за 2000 рублей и полчаса / Хабр
Задняя крышка устройства

▍ результаты

Устройство получилось достаточно компактным, вполне можно брать с собой и носить в кармане. По потреблению немного скудно — 3 дня без подзарядки. Очень хотелось бы уменьшить частоту измерений до 0.1Гц, это позволило бы снизить потребление в разы, но увы. Ток заряда 300мА и заряжается до 100% за несколько часов.

Итоговая стоимость без учёта моего времени порядка 2000р (2021 год), из которых 60% это стоимость датчика СО₂.

В целом устройство выполняет свою функцию — напоминает о необходимости проветрить помещение и ситуаций вида «тут уже дышать нечем» стало намного меньше. Почему они не исчезли вовсе? «Вот сейчас допишу этот кусок функционала и прервусь», «Да-да ещё чуть-чуть» и.т.п (чтобы меня выгнать из-за компа, это нужно постараться) 🙂

Всем спасибо за внимание и дышите свежим воздухом.

Mh-z14a – датчик углекислого газа, сравнение с конкурентами.

В

прошлом обзоре

я сравнивал три датчика пыли. Сегодня в одном приборе четыре датчика CO2. Рассматриваем плюсы и минусы, изучаем подводные камни. Готовим простое и недорогое устройство для контроля воздуха дома.

Уровень СО2 влияет на наше самочувствие не меньше, чем пыль и аллергены в воздухе. Когда мы говорим, что нам душно, это не кислорода нам не хватает. Его уровень остается более-менее одинаковым. Это повышается уровень углекислого газа. В абсолютных значениях он повышается совсем незначительно. В относительных же диапазон от 0,04 до 0,5 процента — это расстояние от «чистейший горный воздух» до «тут опасно находиться, срочно покинуть помещение». В сети много полезной информации на эту тему, так что приступим сразу к делу.

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

Простейший измеритель CO2 за 2000 рублей и полчаса / Хабр

MH-Z14A
Это относительно старый датчик. Его характеристики:
Разрешающая способность в диапазоне измерения 0-2000 ppm: 5ppm;
Разрешающая способность в диапазоне измерения 2000-5000 ppm: 10ppm;
Разрешающая способность в диапазоне измерения 5000-10000 ppm: 20ppm;
Точность измерения: 50ppm ± 5%;
Повторяемость измерений: 30ppm;
Время измерения: < 30 сек.
Время прогрева: 3 мин.
Напряжение питания: 4-6В
Средний потребляемый ток: < 50mA
Максимальный потребляемый ток: < 100mA
Срок эксплуатации: > 5 лет.

Про анемометры:  СНиП 41-01-2003 Отопление, вентиляция и кондиционирование от 26 июня 2003 -

Простейший измеритель CO2 за 2000 рублей и полчаса / Хабр

Простейший измеритель CO2 за 2000 рублей и полчаса / Хабр

Простейший измеритель CO2 за 2000 рублей и полчаса / Хабр

Датчик выдает показания по трем каналам: UART, ШИМ-модуляция и аналоговый выход. Наиболее функциональный канал связи с датчиком — UART. Он позволяет не только получить точные измеренные значения, но и управлять датчиком. Производить калибровку. Это весьма важный момент, в описании рекомендуется калибровать датчик не реже чем раз в полгода.

MH-Z19A
Этот датчик выпускается тем же производителем, что и предыдущий, и должен был прийти ему на смену. Он заметно компактнее и экономичнее. Датчик выпускается в двух модификациях — «A» и «B». У нас более старая версия — «A». Его характеристики:

Диапазон измерения: 2000 или 5000 ppm;
Точность измерения: 50ppm ± 3%;
Время измерения: < 60 сек.
Средний потребляемый ток: < 18mA
Напряжение питания: 3,6 — 5,5В
Срок эксплуатации: > 5 лет.

Датчик выдает показания по двум каналам: UART и ШИМ-модуляция.

Senseair S8
Этот датчик считается наиболее точным. У нас версия 0053, вот ее характеристики:
Диапазоне измерения 400-2000 ppm;
Точность измерения: 40ppm ± 3%;
Напряжение питания: 4,5 — 5,25В
Средний потребляемый ток: < 18mA
Максимальный потребляемый ток: < 300mA
Срок эксплуатации: > 15 лет.

Датчик способен передавать измеренные значение по UART, шим-модуляцией, по протоколу Modbus, кроме того, имеется выход на внешние устройства, который включается при повышении концентрации CO2 до 1000 ppm и отключается при снижении до 800.
Как и у двух предыдущих датчиков, тут есть возможность калибровки и имеется автоматическая коррекция нулевого уровня.

LGAQS-HT01
Строго говоря, это не датчик углекислоты. Это металлооксидный датчик летучих органических соединений. Он определяет их концентрацию и подсчитывает абстрактный уровень углекислоты, эквивалентно влияющий на здоровье человека. Этот датчик представляет собой комбинацию двух датчиков — CCS811 (отвечает за ЛОС) и Si7021 — он измеряет температуру и влажность. Эти данные нужны для настройки датчика CCS811 для повышения точности измерений. Датчик подключается по I2C шине и доступен сразу по двум адресам — для снятия показаний с CCS811 и для Si7021. По каким-то причинам датчик влажности у меня все время показывает 50%, так что в прибор я добавил еще один датчик — BME280. Он более точно определяет температуру, влажность и давление.

Вот все датчики вместе.

Простейший измеритель CO2 за 2000 рублей и полчаса / Хабр

Простейший измеритель CO2 за 2000 рублей и полчаса / Хабр

А вот прочие элементы будущего устройства:

Простейший измеритель CO2 за 2000 рублей и полчаса / Хабр

Нам потребуются: макетная плата, степдаун преобразователь 5->3,3 В, две платы интерфейса 5<->3,3 для согласования выводов датчиков и Ардуино, Ардуино Про Мини, экран, часы DS3221, «черный ящик» OpenLog, регистрирующий показания всех датчиков и разъем micro-usb, чтобы питаться от телефонной зарядки.

Простейший измеритель CO2 за 2000 рублей и полчаса / Хабр

Простейший измеритель CO2 за 2000 рублей и полчаса / Хабр

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

Простейший измеритель CO2 за 2000 рублей и полчаса / Хабр

Простейший измеритель CO2 за 2000 рублей и полчаса / Хабр

Далее, была написана программа.

Код программы


///////////////////////////////////////////////////////////////////////
///                    © tykhon, 2022
///////////////////////////////////////////////////////////////////////
/*
MH-Z19
TX: 3<->5 A0
RX: 3<->5 A1
PWM:      12
Gnd:      Gnd
Vin:       5v
MH-Z14A
1_ 5v:     5v
2_Gnd:    Gnd
6_Pwm:
11_RX: 3<->5 7
10_TX: 3<->5 6
S8:
G :        5v
G0:       Gnd
Rx: 3<->5 A3
Tx: 3<->5 A2
LGAQS-HT01
SCL:      A5
SDA:      A4
Gnd:      Gnd
VDD:      3.3v
BMP280
SCL:      A5
SDA:      A4
Gnd:      Gnd
VDD:      3.3v
DS3231
SCL:      A5
SDA:      A4
Gnd:      Gnd
VDD:      5v
TFT
Led: -> 150 Ohm -> 5v
SCK: -> 1 KOhm -> 13
SDA: -> 1 KOhm -> 11
A0:  -> 1 KOhm -> 8
Reset: -> 1 KOhm ->  9
CS:  -> 1 KOhm -> 10
Gnd:      Gnd
Vcc:      5v
*/
#include <Adafruit_GFX.h>                 // for LCD Core graphics library
#include <Adafruit_ST7735.h>              // for LCD  Hardware-specific library
#include <CCS811.h>                       // for TVOC sensor
#include <Adafruit_Sensor.h>              // for bme280
#include <Adafruit_BME280.h>              // for bme280
#include <SoftwareSerial.h>
#include "Wire.h"
#define TFT_CS     10
#define TFT_RST    9 
#define TFT_DC     8
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);
#define SEALEVELPRESSURE_HPA (1013.25)      // for bme280
Adafruit_BME280 bme;                        // for bme280 I2C
#define CCS811_ADDR 0x5A                     // for LGAQS-HT01 or ccs811
#define SI7021_ADDR 0x40                     // for LGAQS-HT01 or si7021
#define WAKE_PIN  5                          // for LGAQS-HT01 or ccs811
#define DS1307_ADDR 0x68                     // RTC address
CCS811 sensor;
float si7021_h = 0;
float si7021_t = 0;
unsigned int data[2];
int ccs188_co2 = 0;
int ccs188_tvoc = 0;
int z14_co2;
int z19_co2;
int z19_t;
int z19_ss;
int ccs188_co2_last;
int ccs188_tvoc_last;
int z14_co2_last;
int z19_co2_last;
unsigned long s8_co2_sum = 0;
unsigned long z14_co2_sum = 0;
unsigned long z19_co2_sum = 0;
unsigned long ccs188_co2_sum = 0;
unsigned long ccs188_tvoc_sum = 0;
unsigned long bme_t_sum = 0;
unsigned long bme_h_sum = 0;
unsigned long bme_p_mm_sum = 0;
unsigned int polls = 0;
unsigned long s8_co2 = 0;
unsigned long s8_co2_last = 0;
int bme_t;
int bme_h;
float bme_p;
int bme_p_mm;
const float hpa2mm = 133.3224;
SoftwareSerial mySerial_z19(A0, A1);     
SoftwareSerial mySerial_s8(A2, A3);      
SoftwareSerial mySerial_z14(7, 6);       
byte cmd_z14[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79}; 
unsigned char response_z14[9]; 
String ppmString = " ";
byte cmd_z19[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79}; 
byte cmd_s8[7] = {0xFE,0x44,0x00,0x08,0x02,0x9F,0x25}; 
unsigned char response_z19[9];
byte response_s8[] = {0,0,0,0,0,0,0};
unsigned int current_minute, lastminute;
int second_delay = 30000;                    // delay between measurements, ms
int work_period = 3;                        // period for recording data, min
////////////////////////////////////////   functions    //////////////////////////////////////////////
byte bcdToDec(byte val)  {
return ( (val/16*10)   (val) );
}
String getdate(){
Wire.beginTransmission(DS1307_ADDR);      // Reset the register pointer
byte zero = 0x00;
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDR, 7);
int secondint = bcdToDec(Wire.read());
int minuteint = bcdToDec(Wire.read());
current_minute = minuteint;
int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday
int monthDay = bcdToDec(Wire.read());
int month = bcdToDec(Wire.read());
int year = bcdToDec(Wire.read());
String second = String(secondint); if (secondint < 10) {second ="0" second;};
String minute = String(minuteint); if (minuteint < 10) {minute ="0" minute;};
return String(hour) ":" minute ":" second " " String(monthDay) "/" String(month) "/" String(year);
}
void sendRequest_s8(byte packet[]){ 
mySerial_s8.begin(9600);
while(!mySerial_s8.available()){                       //keep sending request until we start to get a response 
mySerial_s8.write(cmd_s8,7); 
delay(50); 
} 
int timeout=0;                                         //set a timeout counter 
while(mySerial_s8.available() < 7 ) {                 //Wait to get a 7 byte response 
timeout  ; 
if(timeout > 10) {                                  //if it takes to long there was probably an error 
while(mySerial_s8.available())                  //flush whatever we have 
mySerial_s8.read(); 
break;                                          //exit and try again 
} 
delay(50); 
} 
for (int i=0; i < 7; i  ) { 
response_s8[i] = mySerial_s8.read(); 
}
mySerial_s8.end();
}                      
unsigned long getValue_s8(byte packet[]) 
{ 
int high = packet[3];                                   //high byte for value is 4th byte in packet in the packet 
int low = packet[4];                                    //low byte for value is 5th byte in the packet 
unsigned long val = high*256   low;                     //Combine high byte and low byte with this formula to get value 
return val; 
}
void sendRequest_SI7021(){
Wire.beginTransmission(SI7021_ADDR);
Wire.endTransmission();
delay(500);
Wire.requestFrom(SI7021_ADDR, 2);                         // Request 2 bytes of data
if(Wire.available() == 2)                                 // Read 2 bytes of data to get humidity
{
data[0] = Wire.read();
data[1] = Wire.read();
}
float hum = ((data[0] * 256.0)   data[1]);                // Convert the data
si7021_h = ((125 * hum) / 65536.0) - 6;
Wire.begin();
Wire.beginTransmission(SI7021_ADDR);                      // Send temperature measurement command
Wire.write(0xF3);
Wire.endTransmission();
delay(500);
Wire.requestFrom(SI7021_ADDR, 2);                         // Request 2 bytes of data
if(Wire.available() == 2)                                 // Read 2 bytes of data for temperature
{
data[0] = Wire.read();
data[1] = Wire.read();
}
float temp  = ((data[0] * 256.0)   data[1]);              // Convert the data
si7021_t = ((175.72 * temp) / 65536.0) - 46.85;           // 
}
void sendRequest_ccs188(){
sensor.compensate(si7021_t, si7021_h);                    // replace with t and rh values from sensor
sensor.getData();
ccs188_co2 = sensor.readCO2();
ccs188_tvoc = sensor.readTVOC();
}
void sendRequest_z14(){
mySerial_z14.begin(9600);
mySerial_z14.write(cmd_z14, 9);
memset(response_z14, 0, 9);
mySerial_z14.readBytes(response_z14, 9);
int i;
byte crc = 0;
for (i = 1; i < 8; i  ) crc =response_z14[i];
crc = 255 - crc;
crc  ;
if ( !(response_z14[0] == 0xFF && response_z14[1] == 0x86 && response_z14[8] == crc) ) {
Serial.println("CRC error z14: "   String(crc)   " / "  String(response_z14[8]));
} else { 
unsigned int responseHigh = (unsigned int) response_z14[2];
unsigned int responseLow = (unsigned int) response_z14[3];
z14_co2 = (256*responseHigh)   responseLow;
};
mySerial_z14.end();
}
void sendRequest_z19(){
mySerial_z19.begin(9600);
mySerial_z19.write(cmd_z19, 9);
memset(response_z19, 0, 9);
mySerial_z19.readBytes(response_z19, 9);
int i;
byte crc = 0;
for (i = 1; i < 8; i  ) crc =response_z19[i];
crc = 255 - crc;
crc  ;
if (response_z19[0] != 0xFF) {Serial.println("CRC error z19: response_z19[0] != 0xFF: "   String(response_z19[0]));};
if (response_z19[1] != 0x86) {Serial.println("CRC error z19: response_z19[1] != 0x86: "   String(response_z19[1]));};
if (response_z19[8] != crc) {Serial.println("CRC error z19: response_z19[8] != crc: "   String(response_z19[8])   " / "  String(crc));};
unsigned int responseHigh = (unsigned int) response_z19[2];
unsigned int responseLow = (unsigned int) response_z19[3];
unsigned int responseTT = (unsigned int) response_z19[4];
unsigned int responseSS = (unsigned int) response_z19[5];
z19_t = responseTT-40;
z19_ss =  responseSS;
z19_co2 = (256*responseHigh)   responseLow;
mySerial_z19.end();
}
void tft_form(){
tft.setTextSize(2);
tft.setCursor(0, 4);
tft.print("ccs: ");
tft.setCursor(0, 30);
tft.print("z19: ");
tft.setCursor(0, 60);
tft.print("z14: ");
tft.setCursor(0, 90);
tft.print("s8: ");
}
void tft_output(){
tft.setTextSize(2);
tft.setTextColor(ST7735_BLACK);
tft.setCursor(60, 4);
tft.print(String(ccs188_co2_last));
tft.print(String("/"));
tft.print(String(ccs188_tvoc_last));
tft.setTextColor(ST7735_WHITE);
tft.setCursor(60, 4);
tft.print(String(ccs188_co2));
tft.print(String("/"));
tft.print(String(ccs188_tvoc));
ccs188_co2_last = ccs188_co2;
ccs188_tvoc_last = ccs188_tvoc;
tft.setCursor(60, 30);
tft.setTextColor(ST7735_BLACK);
tft.print(String(z19_co2_last));
tft.setCursor(60, 30);
tft.setTextColor(ST7735_WHITE);
tft.print(String(z19_co2));
z19_co2_last = z19_co2;
tft.setCursor(60, 60);
tft.setTextColor(ST7735_BLACK);
tft.print(String(z14_co2_last));
tft.setCursor(60, 60);
tft.setTextColor(ST7735_WHITE);
tft.print(String(z14_co2));
z14_co2_last = z14_co2;
tft.setCursor(60, 90);
tft.setTextColor(ST7735_BLACK);
tft.print(String(s8_co2_last));
tft.setCursor(60, 90);
tft.setTextColor(ST7735_WHITE);
tft.print(String(s8_co2));
s8_co2_last = s8_co2;
tft.setTextSize(1);
tft.fillRect(0, 117, 160, 120, ST7735_BLACK);
tft.setCursor(0, 117);
tft.print(String(getdate()));
}
///////////////////////////////////////  setup   /////////////////////////////////////////
void setup(void) {
Serial.begin(9600);
bool status;
status = bme.begin();
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
delay(100); // let sensor boot up
tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
Serial.println("init");
if(!sensor.begin(uint8_t(CCS811_ADDR), uint8_t(WAKE_PIN)))
Serial.println("Init fail");
tft.setTextWrap(false); // Allow text to run off right edge
tft.setRotation(3);
tft.fillScreen(ST7735_BLACK);
tft_form();
}
////////////////////////////////////////////////   loop    /////////////////////////////////////////////////////
void loop() {
sendRequest_SI7021();
sendRequest_ccs188();
sendRequest_z14();
sendRequest_z19();
sendRequest_s8(cmd_s8); 
s8_co2 = getValue_s8(response_s8); 
bme_p = bme.readPressure();
bme_p_mm = int(bme_p/hpa2mm);
bme_h = bme.readHumidity();
bme_t = bme.readTemperature();
s8_co2_sum  = s8_co2;
z14_co2_sum  = z14_co2;
z19_co2_sum  = z19_co2;
ccs188_co2_sum  = ccs188_co2;
ccs188_tvoc_sum  = ccs188_tvoc;
bme_t_sum  = bme_t;
bme_h_sum  = bme_h;
bme_p_mm_sum  = bme_p_mm;
polls   ;
getdate();
tft_output();
if (((current_minute)%work_period == 0)&&(lastminute != current_minute)) {
s8_co2 = s8_co2_sum/polls;
z14_co2 = z14_co2_sum/polls;
z19_co2 = z19_co2_sum/polls;
ccs188_co2 = ccs188_co2_sum/polls;
ccs188_tvoc = ccs188_tvoc_sum/polls;
bme_t = bme_t_sum/polls;
bme_h = bme_h_sum/polls;  
bme_p_mm = bme_p_mm_sum/polls;
String dataString = getdate() "  s8:  " String(s8_co2) "  z14:  " String(z14_co2) "  z19:  " String(z19_co2) "  z19_t:  " String(z19_t) "  ccs:  " String(ccs188_co2)   "  TVOC:  " String(ccs188_tvoc) "  ccs_t:  " String(si7021_t) "  ccs_h:  " String(si7021_h) "  bme_t:  " String(bme_t) "  bme_h:  " String(bme_h);
dataString.replace(".",",");
dataString.replace("  ","t");
Serial.println(dataString);
lastminute = current_minute;
polls = 0;
s8_co2_sum = 0;
z14_co2_sum = 0;
z19_co2_sum = 0;
ccs188_co2_sum = 0;
ccs188_tvoc_sum = 0;
bme_t_sum = 0;
bme_h_sum = 0;
bme_p_mm_sum = 0;
};
delay(second_delay);
}

Простейший измеритель CO2 за 2000 рублей и полчаса / Хабр

Первые данные, снятые с прибора, выглядят на графике вот так:

Простейший измеритель CO2 за 2000 рублей и полчаса / Хабр

Датчик MH-Z14 включился впервые, так что он какое-то время потратил и еще потратит на калибровку. Видно, что его показания сильно коррелируют с показаниями датчика S8, но Z14 несколько шатает из стороны в сторону. Механизм автокалибровки состоит в следующем: датчик помнит минимальное значение измеренного уровня за какое-то время (около недели). Если минимум превышает 400 ppm, то скорее всего датчик завышает показания. Внутренние коэффициенты изменяются так, чтобы выдаваемое значение снижалось. За одну неделю вносимая поправка не может превышать 30-50 ppm, так что датчик необходимо «проветривать» раз в неделю для корректировки нулевых значений.

Про анемометры:  Почему тухнет газовый котёл: причины и устранение неисправностей -

Вот еще пример графика снятых значений:

Простейший измеритель CO2 за 2000 рублей и полчаса / Хабр

Видно, что теперь датчик слегка занижает уровень относительно S8. Но его более современный собрат Z14 занижает еще сильнее. Вероятно, в нем произошла калибровка нулевого значения. У этих датчиков, MH-Z14, есть специальный вывод для калибровки. При замыкании его на землю и удержании в течении 7 секунд датчик калибруется, рассматривая текущую атмосферу как нулевую точку.
Более свежая модификация «B» этого датчика отличается наличием аналогового выхода и возможностью калибровки не только по нулевому уровню, но и по произвольной точке, что особенно полезно, потому что газ, совершенно свободный от примеси углекислоты, в домашних условиях получить хлопотно. Вероятно, мой датчик случайно замкнул эту ногу и перекалибровался по 400ppm. Теперь могут уйти долгие недели на то, чтоб автокалибровка вернула более-менее правдоподобные показания. Или нужно искать жидкий азот, чтоб обеспечить для него безуглекислотную атмосферу.

Простейший измеритель CO2 за 2000 рублей и полчаса / Хабр

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

Что в итоге:

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

Датчик MH-Z14 оказался очень неплохим, его показания почти совпадают с более дорогим Senseair S8.
Датчик LGAQS-HT01 тоже правдоподобно показывает наличие примесей в атмосфере и послужит хорошим дополнением к датчикам углекислоты.

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

Простейший измеритель CO2 за 2000 рублей и полчаса / Хабр

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

MH-Z14A — рабочий датчик, рекомендую к покупке. Сейчас прилагается USB to RS485 TTL преобразователь, в хозяйстве пригодится.

Товар предоставлен для написания обзора магазином. Обзор опубликован в соответствии с п.18 Правил сайта.

S s regeltechnik

И еще один производитель инфракрасных датчиков – немецкая компания S S Regeltechnik – производитель контрольно-измерительного, вентиляционного и климатического оборудования (датчиков воды, дыма, тепла, розеток с термостатом и т.д).

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

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

Senseair

На сегодняшний день самым известным производителем датчиков углекислого газа является шведская компания SenseAir. Мировой лидер в отрасли разработки и производства не только газовых анализаторов, но и оборудования для систем “Умный дом”(датчиков движения, автоматических розеток, GSM охранных сигнализаций).

Углекислые датчики компании SenseAir, работающие по методу недисперсионной ИК-спектрометрии, в отличие от своих аналогов, имеют более высокие эксплуатационные характеристики.

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

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

Vahigcy

Похожий на 1й вариант прибор. Но отображает на цветном дисплее большее количество параметров качества воздуха:

  • Углекислый газ (CO2): 350-2000 ppm
  • Летучая органика (TVOC): 0,000-2,000 мг/м3
  • Формальдегид (HCHO): 0,000-1,000 мг/м3
  • Температура: 0-90 С
  • Влажность: 0-99% RH

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

У прибора встроенный аккумулятор на 1200 мАч, которого хватает примерно на 5 ч работы и, конечно, внешнее питание DC 5 В.

В работе

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

В помещении от 400 до 2000. Т.е. ровно столько, сколько и ожидаешь. Реакция на изменения условий не сильно быстра: при переносе из комнаты на улицу показания с 800 до 300 единиц будут постепенно снижаться в течение примерно 40 секунд. Если на прибор дыхнуть, пик показаний будет достигнут секунд через 20.

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

На изменение влажности прибор реагирует практически мгновенно, что приятно. При этом показания коррелируют (с незначительным превышением на 4-6%) с показаниями имеющейся под рукой метеостанцией Beurer HM20 и дешевого китайского гигрометра.

От встроенного аккумулятора емкостью 2200 мА·ч прибор работает ровно сутки.

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

Виды датчиков со2

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

  • Стационарные (работающие от электрической сети), предназначенные для настенного монтажа, настольные, напольные и монтируемые непосредственно в воздушный канал;
  • Автономные (получающие энергию от внешнего аккумулятора).

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

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

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

Достоинства и недостатки

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

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

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

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

Недостатки:

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

Зачем это надо

Уровень углекислого газа в окружающем воздухе достаточно сильно влияет на самочувствие. В атмосфере нашей планеты его примерно 0,04%, потому приборы дают показатели, отражающие количество частей на один миллион (PPM). Нормальным уровнем для улицы считаются показатели 250-400.

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

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

Конструкция датчика со2

Канальный датчик CO2 - VCP CDD24Недисперсионные газоанализаторы, применяющиеся для определения концентрации углекислого газа в воздухе, комплектуются светофильтрами или специальными приемниками, использующими немонохроматическое излучение.

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

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

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

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

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

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

Про анемометры:  Выбираем монитор-детектор качества воздуха (PM2.5, CO2, TVOC, HCHO): лучшие модели на страже вашего здоровья / Блог им. lexus08 / iXBT Live

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

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

Меры предосторожности

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

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

Перед снятием детектора СО2 его следует предварительно отключать от источника электропитания.

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

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

Особенности

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

Контроллеры количества СО2 отличаются такими эксплуатационными особенностями:

  • Нормальная работа обеспечивается при влажности до 90-95%, то есть образование конденсата на поверхности следует исключить;
  • Сенсоры чувствительны к пыли и ударам. Соответственно, место их установки выбирают таким образом, чтобы свести эти негативные факторы к минимуму;
  • Если прибор монтируется на открытой площадке, где возможно попадание ветра и осадков, то его дополнительно закрывают щитком;
  • В процессе использования проводится регулярное техническое обслуживание, во время которого проверяют работоспособность частей и снимают скопившийся заряд статического электричества;
  • Корпуса изготавливаются герметичными, поэтому попадание воды внутрь прибора затруднено. Однако нельзя допускать эксплуатацию во влажных помещениях, где происходит выпадение конденсата, поскольку это приводит к коррозии проводов и ослаблению клемм;
  • Возникающие в процессе работы сбои устраняются повторными калибровками. Основные неисправности могут быть связаны с перегревом из-за попадания прямого солнечного света и намоканием токоведущих частей (и, как следствие, их коррозии).

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

Применение

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

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

Простейший измеритель co2 за 2000 рублей и полчаса

Измеритель уровня углекислого газа (CO2) наверное самый недооценённый прибор, который на мой взгляд должен быть в каждой квартире, ведь он показывает, насколько воздух пригоден для дыхания и с помощью него всегда видно, когда пора проветривать.

Такой измеритель в квартирах большая редкость прежде всего из-за высокой цены. Свой первый измеритель AZ Instruments 7798 CO2 datalogger я покупал за $139 и это была самая дешёвая модель на рынке.

Сейчас готовый измеритель CO2 стоит около 4000 рублей, а самодельный обойдётся вдвое дешевле.

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

В большинстве самоделок используют датчик MH Z19B, но у него есть нехорошая особенность — если помещение не проветривается до состояния уличного воздуха каждый день, показания начинают «уплывать» (датчик автоматически калибруется каждый день и считает минимальный уровень CO2 в помещении за 400 ppm). Я заказал два более продвинутых датчика — Sensair S8 004-0-0053 (он обошёлся мне в $28.86, сейчас стоит $32.30) и Telaire T6703 (его я купил за $19.41, сейчас он стоит $28.35).

Я подключил датчики к Arduino Nano (его можно купить за $2.98), но можно использовать и другую плату Arduino. Для отображения значения CO2 используется дешёвый светодиодный экранчик TM1637 (он стоит $0.67). Для соединения удобно использовать готовые провода с коннекторами Dupont F-F (20 штук по 10 см стоят $0.87), для подключения сенсоров их можно разрезать пополам и подпаять.

Помимо индикации на экранчике, мои измерители передают данные в порт, поэтому их можно подключить к компьютеру, зайти в режим платформы Arduino «Монитор порта» (скорость 9600), наблюдать значения CO2 и использовать измеритель, как даталоггер (нужно просто скопировать данные из окошка монитора порта в Excel).

Кстати, экран можно не подключать и пользоваться только монитором порта.

Оба сенсора дают точные результаты (я сравнивал с хорошими измерителями уровня углекислого газа Даджет МТ8057s и AZ Instruments 7798 CO2 datalogger). Более дешёвый Telaire T6703 мне понравился даже больше — он выходит на правильные показания секунд за тридцать после включения и его результаты ближе к результатам дорогих приборов с двухлучевыми сенсорами.

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

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

© 2021, Алексей Надёжин

Устройство

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

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

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

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

Функции датчика со2

Датчик концентрации CO2 Mooij AgroДатчики СО2 предназначены для измерения концентрации и контроля граничных значений углекислого газа в диапазоне от 0 до 100%. Данные устройства применяются в системах охранных сигнализаций, автоматических системах вентиляции, контролирующих качество воздуха, для определения содержания углекислоты в воздушном потоке, а также уровня газа в помещении и на свежем воздухе.

В норме концентрация СО2 должна находиться в пределах 0,04%. Разумеется, такое его количество постоянно поддерживать в помещении практически невозможно.

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

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

Итоги

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

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

P.S. минимальные цены на Aliexpress я видел тут. Но не ленитесь заглянуть в блок «У другого продавца» внизу этих страниц – там могут всплыть более дешевые предложения. И тут еще важно не перепутать этот прибор с HT-502, который анализирует количество формальдегида и при этом выглядит абсолютно идентично HT-501.

P.P.S. На Али стали появляться условно недорогие (~3000 руб.) приборы, которые тоже обещают замеры CO2, но встроенного датчика углекислого газа там нет! Данные они получают экстраполируя показания датчика частиц пыли, которые к обозначенной теме никакого отношения не имеют! Логика ушлых китайцев такова:  мол чем больше пыли, тем меньше проветривали, тем больше CO2. Будьте внимательны!

Заключение:

После того, как мы добились маленькой победы в офисе, я забрал датчик к себе домой. Где и поставил его на постоянной основе в гостиной, запитав от зарядного устройства от старого телефона. Удобно, что при повышении уровня СО2 в квартире датчик начинает пищать, призывая открыть окна и проветрить квартиру.

Удобно и полезно для всей семьи. Думаю, даже такой контроль за качеством воздуха в квартире также только благоприятно отразится на здоровье моих домочадцев.Детектор можно купить тут.При использовании кодового слова COII можно получить скидку в -10% от цены.

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