Как показывает практика, открытая форточка в спальне - еще не гарантия свежего воздуха, здорового сна и отсутствия головной боли на утро. Да и понятие «спертый воздух» настолько субъективно, что частенько становится предметом серьезных семейных конфликтов.
Поэтому спаять устройство, которое позволило бы объективно оценить качество воздуха в комнате и включить систему вентиляции в нужный момент, было моей давней мечтой.
Но какие параметры воздуха нужно отслеживать, чтобы держать атмосферу в вашей квартире пригодной для проживания?
Как оказалось, главным индикатором свежести воздуха является концентрация углекислого газа СО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 |
Другими словами, этот датчик измеряет поглощение света длинной волны 4 мкм, которое будет зависеть от концентрации в воздухе измеряемого газа.
Запитывается он напряжением от 3,6 до 5,5 Вольта и может передавать показание на Ардуино по протоколу UART или посредством сигнала PWM.
Неприятным для меня моментом оказалось то, что логические уровни датчика MH-Z19B рассчитаны под напряжение 3,3 V, поэтому пришлось его связывать с платой Ардуино через конвертер логических уровней по цене 0,95 доллара за 5 штук. Затраты не велики, но количество припаиваемых проводов увеличивается.
Система контроля СО2
Принцип работы конструируемой системы контроля содержания углекислого газа такой.
Первый блок располагается в том месте, где вы планируете контролировать качество воздуха (в моем случае в спальне возле кровати).
Он определяет концентрацию СО2 и по радиоканалу на частоте 2,4 гГц передает это значение второму блоку.
В состав первого блока входят:
Задача
Второго блока – получить числовое значения концентрации СО2 по радиоканалу и в зависимости от этого значения либо включить, либо выключить вентилятор.
В состав второго блока входят:
Тут же имело смысл продумать способы индикации результатов измерения.
Идеальным вариантом была бы, конечно, установка небольшого экранчика, на который выводились бы цифровые значения концентрации СО2.
Но я остановился на более простом способе. Поставил три светодиода - зеленый, желтый и красный. Первый горит при концентрации СО2 в воздухе не превышающей 600 ppm, второй - 800 ppm. А красный загорается тогда, когда концентрация углекислого газа переваливает за 1000 ppm.
Такая индикация вполне меня устраивает.
Теперь поговорим о схемах подключения.
Первый блок выглядит следующим образом:
|
Электрическая схема первого блока с датчиком СО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 и один раз в 10 секунд отправляет ее значение по радиоканалу. Сигнал принимается по всей квартире.
Замечаний по работе первого блока нет.
Единственное дополнение, которое я бы сделал – добавил бы кнопку для принудительной вентиляции. Такую, какая есть на втором блоке. Иногда хочется, лежа в постели, добавить в спальню дополнительную порцию свежего воздуха, несмотря на то, что концентрация СО2 находится в пределах нормы.
По второму блоку тоже все хорошо, за исключением одной возникшей проблемы.
Ардуино и радиомодуль достаточно сильно нагревались. Сначала я грешил на дешевый преобразователь AC220 - DC5.
Писали, что качество выпрямления он дает очень плохое. Однако после его замены на более мощную и дорогую модель проблема так и не разрешилась.
После долгих поисков выяснилось, что нагрев дает радиомодуль nRF24L01, который в режиме непрерывной прослушки эфира имеет очень большое тепловыделение.
Пришлось переписать скетчи так, чтобы Ардуино и радиомодуль в течение 7 секунд погружались в сон, потом просыпались на 3 секунды, обменивались данными и снова засыпали.
Позднее я также добавил на этот блок маленький
OLED экранчик, на котором постоянно высвечивается значение концентрации СО2. Для управления им я использовал библиотеку OLED_I2C.h
Если говорить в целом, работа данной системы мне очень понравилась. Просыпаться утром с больной головой стал на порядок реже.
Планирую только купить какой-нибудь более тихий вентилятор, поскольку мой – старый и раздолбанный – иногда создает неудобства в плане засыпания.
Хотя, наверное, привыкнуть можно и к этому.
Валерий МИШАКОВ