Главная О себе Статьи Фотографии Теория Кинорубка

Главная > Статьи > Статьи 2 > Система контроля содержания углекислого газа на Ардуино


Популярные статьи
Радиомодули для Ардуино с большим радиусом действия
Апгрейд квадрокоптера Jjrc H31 для FPV полетов
Как покупать в китайских Интернет-магазинах
Как добраться бюджетно на Тенерифе



Ардуино Нано







Система контроля содержания углекислого газа на Ардуино


Как сделать своими руками устройство, поддерживающее свежесть воздуха в квартире

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

Но какие параметры воздуха нужно отслеживать, чтобы держать атмосферу в вашей квартире пригодной для проживания? Как оказалось, главным индикатором свежести воздуха является концентрация углекислого газа СО2, которая измеряется в ppm (1ppm = 0,0001 %)

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

Если на улице города концентрация СО2 обычно находится в пределах 400 – 500 ppm, то в закрытом помещении в присутствии людей она может подниматься до нескольких тысяч ppm.

При этом в ГОСТе 30494-2011 под названием «Здания жилые и общественные. Параметры микроклимата в помещениях» приемлемым для человека считается концентрация 800 – 1000 ppm. А максимально допустимой - 1400 ppm.

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

Стало быть, наш прибор должен следить за тем, чтобы количество СО2 в комнате ни в коем случае не превышало 1000 ppm. А в идеале – находилось в пределах 600 – 700 ppm.

Датчик для измерения концентрации СО2

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

Я задался целью найти голый работоспособный датчик СО2 за минимальную цену, способный передавать показание на плату Ардуино и работать с ней в паре. После изучения множества отзывов, мой выбор пал на китайский датчик MH-Z19B стоимостью порядка 20 долларов, основанный на принципе недисперсионной инфракрасной спектрометрии.

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

Другими словами, этот датчик измеряет поглощение света длинной волны 4 мкм, которое будет зависеть от концентрации в воздухе измеряемого газа. Запитывается он напряжением от 3,6 до 5,5 Вольта и может передавать показание на Ардуино по протоколу UART или посредством сигнала PWM.

Неприятным для меня моментом оказалось то, что логические уровни датчика MH-Z19B рассчитаны под напряжение 3,3 V, поэтому пришлось его связывать с платой Ардуино через конвертер логических уровней по цене 0,95 доллара за 5 штук. Затраты не велики, но количество припаиваемых проводов увеличивается.

Система контроля СО2

Принцип работы конструируемой системы контроля содержания углекислого газа такой.

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

В состав первого блока входят:

Датчик углекислого газа MH-Z19B
20$
Датчик MH-Z19B
Ардуино про мини 168
1,45$
Ардуино про мини 168
Радиомодуль nRF24L01
0,75$
Радиомодуль nRF24L01
Адаптер радиомодуля nRF24L01
0,36$
Адаптер радиомодуля nRF24L01
Преобразователь питания HLK-PM01 AC 220 – DC 5v
2,2$
Преобразователь питания HLK-PM01
Конвертер логических уровней
0,21$
Конвертер логических уровней


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

В состав второго блока входят:

Ардуино нано
1,99$
Ардуино нано
Радиомодуль nRF24L01
0,75$
Радиомодуль nRF24L01
Адаптер радиомодуля nRF24L01
0,36$
Адаптер радиомодуля nRF24L01
Преобразователь питания AC 220 – DC 5v
0,77$
Преобразователь питания
Реле SRD-05VDC-SL-C
1,87$ за 5 штук
Реле SRD-05VDC-SL-C


Тут же имело смысл продумать способы индикации результатов измерения.
Идеальным вариантом была бы, конечно, установка небольшого экранчика, на который выводились бы цифровые значения концентрации СО2. Но я остановился на более простом способе. Поставил три светодиода - зеленый, желтый и красный. Первый горит при концентрации СО2 в воздухе не превышающей 600 ppm, второй - 800 ppm. А красный загорается тогда, когда концентрация углекислого газа переваливает за 1000 ppm.

Такая индикация вполне меня устраивает.

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

Электрическая схема первого блока с датчиком СО2
Электрическая схема первого блока с датчиком СО2(кликабельна)


Электрическая схема второго блока такая:

Электрическая схема второго блока
Электрическая схема второго блока(кликабельна)


Здесь я предусмотрел кнопку, при нажатии которой вентилятор принудительно включается на заданное время. У меня на 400 секунд. А также переменный резистор, которым можно изменять пределы срабатывания вентилятора без изменения программного кода.

Скетч для первого блока:

#include <SoftwareSerial.h>
SoftwareSerial swSerial(A0, A1); // RX, TX
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <stdint.h>
#define CE_PIN 9
#define CSN_PIN 10
const uint64_t writingPipe = 0xE8E8F0F0AALL;
int out = 1;
#define green 6 // Зеленый светодиод на 6 пине
#define yellow 7// Желтый светодиод на 7 пине
#define red 8 // Красный светодиод на 8 пине
RF24 radio(CE_PIN, CSN_PIN);
void setup() {
Serial.begin(9600);
swSerial.begin(9600);
pinMode(green, INPUT);
pinMode(yellow, INPUT);
pinMode(red, INPUT);
delay(2000);
radio.begin();
delay(2000);
radio.setChannel(5);
radio.setRetries(15,15);
radio.setDataRate(RF24_250KBPS);
radio.setPALevel(RF24_PA_MAX);
radio.setAutoAck(1);
radio.openWritingPipe(writingPipe);
}
void loop() {
digitalWrite(green, LOW);
digitalWrite(yellow, LOW);
digitalWrite(red, LOW);
byte measure_cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
unsigned char measure_response[9];
int ppm = 0;
// ***** узнаём концентрацию CO2 через UART: *****
swSerial.write(measure_cmd,9);
swSerial.readBytes(measure_response, 9);
int i;
byte crc = 0;
for (i = 1; i < 8; i++) crc+=measure_response[i];
crc = 255 - crc;
crc += 1;

if ( !(measure_response[0] == 0xFF && measure_response[1] == 0x86 && measure_response[8] == crc) ) {
Serial.println("CRC error: " + String(crc) + " / "+ String(measure_response[8]));
}
unsigned int responseHigh = (unsigned int) measure_response[2];
unsigned int responseLow = (unsigned int) measure_response[3];
ppm = (256*responseHigh) + responseLow;
radio.write( &ppm, sizeof(ppm) ); // Отправляем значение ppm по радиоканалу на второй блок.
Serial.println(ppm);
if (ppm < 600) { // Если ppm меньше 600ppm - зажигаем зеленый светодиод
digitalWrite(green, HIGH);
}
if (ppm >= 600&&ppm <= 1000) { // Если ppm в промежутке 600 -1000 ppm - зажигаем желтый светодиод
digitalWrite(yellow, HIGH);
}
if (ppm > 1000) { // Если ppm больше 1000ppm - зажигаем красный светодиод
digitalWrite(red, HIGH);
}
delay(10000);
}


Скетч для второго блока:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <stdint.h>
#include <MsTimer2.h>
#define CE_PIN 9
#define CSN_PIN 10
const uint64_t readingPipe = 0xE8E8F0F0AALL;
int in =1;
RF24 radio(CE_PIN, CSN_PIN);
#define rel 5 //Реле на 5 пине
#define knopka 3 //Кнопка на 3 пине
#define pot A4 //Потенциометр на пине А4
void setup()
{
Serial.begin(9600);
radio.begin();
delay(2000);
radio.setChannel(5);
radio.setRetries(15,15);
radio.setDataRate(RF24_250KBPS);
radio.setPALevel(RF24_PA_MAX);
radio.setAutoAck(1);
radio.openReadingPipe(1,readingPipe);
radio.startListening();
MsTimer2::set(10000, chekRF); // Таймер на 10 сек
MsTimer2::start();
pinMode(rel, OUTPUT);
pinMode(pot, INPUT);// пин с потенциометром - вход
pinMode(knopka, INPUT);
Serial.println("Redy");
digitalWrite(rel, LOW);
}
void loop()
{
int buttonState = digitalRead(knopka);
if (buttonState == HIGH) { // если нажата кнопка
MsTimer2::stop();
digitalWrite(rel, HIGH); // включаем вентилятор
delay(400000);
digitalWrite(rel, LOW); // выключаем вентилятор
MsTimer2::start();
}
}
int Sredn(){
int y=0;
for (int i=0; i < 10; i++){
y = y + analogRead(A5);
delay(100);
}
y=y/50;
if (y<0){
y=0;
}
return y;
}
void chekRF() {
if( radio.available()){
radio.read(&in,sizeof(in)); // по адресу переменной in функция записывает принятые данные;
}
delay(100);
Serial.println(in);
int x = Sredn();
Serial.print("Diapazon=");
Serial.print(400+x);
Serial.print("---");
Serial.println(500+x);
if (in > 500+x) {
digitalWrite(rel, HIGH);
}
if (in < 400+x) {
digitalWrite(rel, LOW);
}
}


Реализация в «металле»

Поскольку датчик MH-Z19B сам по себе достаточно инерционен, я не стал засовывать его в корпус первого блока, а оставил снаружи. Так он лучше омывается воздухом.

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

Единственное дополнение, которое я бы сделал – добавил бы кнопку для принудительной вентиляции. Такую, какая есть на втором блоке. Иногда хочется, лежа в постели, добавить в спальню дополнительную порцию свежего воздуха, несмотря на то, что концентрация СО2 находится в пределах нормы.

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

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

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

Пришлось переписать скетчи так, чтобы Ардуино и радиомодуль в течение 7 секунд погружались в сон, потом просыпались на 3 секунды, обменивались данными и снова засыпали.

Позднее я также добавил на этот блок маленький OLED экранчик, на котором постоянно высвечивается значение концентрации СО2. Для управления им я использовал библиотеку OLED_I2C.h

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




Валерий МИШАКОВ














Главная | О себе | Статьи | Фотографии | Теория творчества | Кинорубка

Copyright © Valery Mishakov   Email:  mishakov@inbox.ru
Сайт Валерия Мишакова