Для контроля качества воздуха в помещении знать температуру недостаточно. Даже с кондиционером часто бывает прохладно, но душно. Спертый воздух. Оказалось, на это больше всего влияет концентрация со2. Когда я узнал стоимость готовых приборов хотел от этой идеи отказаться. Но случайно увидел описание оптического датчика концентрации со2 MH-Z19.
Цена конечно тоже не маленькая, но все-таки близко к разумным пределам. И руки давно чесались по паяльнику. В качестве контролера использовать решил ESP8266. Во первых дешево, во вторых что бы передавать информацию на компьютер, свой и любого желающего в комнате. После того как собрал и оттестировал первый вариант, с программой-монитором на компьютере, решил добавить экран. Во первых это красиво. Во вторых, во многих случаях удобно.
Устройство построено на модуле ESP8266 NodeMcu Lua wi-fi. Для него была написана программа на скриптовом языке LUA. Прошивку для интерпретатора Lua под мое устройство сгенерил на on-line сервере nodemcu-build.com. Выбрал там только те модули, которые мне были необходимы для создания проекта.
Дальше я взялся за сборку устройства. Подключил датчики температуры. ds18b20. Они работают по интерфейсу 1-wire:
Затем собственно датчик углекислого газа MH-Z19. Он может использовать два интерфейса ШИМ и UART. Я решил сперва попробовать ШИМ, и в результате он меня удовлетворил по надежности и точности показаний.
И подключил дисплей по шине ISP:
Была написана вот такая программа под Windows. На Delphi XE8:
Используемый мной контролер имеет встроенный модуль WIFI, который рассылает полученную с датчиков информации как UDP broadcast пакеты по всей сети офиса. И пользователи у которых стоит программа монитор, получают информацию о состоянии воздуха в помещении и предупреждения, если ситуация становится критической.
А теперь собственно впечатления.
Прибор оказался намного полезней и интереснее чем я ожидал. Во первых больше нет проблем с проветриванием, никто не возмущается, так как у всех выскакивает предупреждение и они довольно хорошо согласуются с личными ощущениями. Ну и просто наблюдения показали что в солнечный день уровень со2 значительно ниже чем в пасмурный и дождливый, утром загрязненность воздуха выше чем днем. С первого взгляда можно понять что делать, проветривать, если зашкаливает со2, или включить кондиционер, если повышенная температура. Датчик температуры на улице хорошо показывает получится ли охладить проветриванием, или только кондиционер. Стало очевидным и понятным, что творится в комнате и как в этом жить. Был случай когда решили проветрить, открыли окно, и тут же закрыли его, датчик буквально зашкалило, И дома прибор оказался очень полезным, особенно в детской комнате, тем более что за показаниями можно следить удаленно через WiFi.
В результате все это выглядит примерно так:
Программа для прошивки ESP8266: github.com/nodemcu/nodemcu-flasher
Прошивка MCU lua: drive.google.com/file/d/0B4KYGXb6-nxpOUdXdTFpcjlFZXM/view
Тут можно взять скрипты lua: drive.google.com/file/d/0B4KYGXb6-nxpeGNNbGM0U2g2dEU/view
ESPlorer для загрузки скриптов на esp8266 и отладки: esp8266.ru/esplorer/#download
Windows приложение написано на Delphi XE8. Тут исходники: drive.google.com/file/d/0B4KYGXb6-nxpei1RUWhHVXV5aTQ/view
Необходимы дополнительные компоненты:
JEDI:
wiki.delphi-jedi.org/index.php?title=JEDI_Code_Library
sourceforge.net/projects/jvcl/files
SDL Delphi Component Suite:
www.lohninger.com/sdlindex.html
Скомпилированная программа для windows: drive.google.com/file/d/0B4KYGXb6-nxpUmVXcElLektOQXM/view
Комментарии (25)
Bobnecat
20.05.2016 16:53Хотелось бы по подробнее узнать как вы реализовали считывание СО2 уровня с этого датчика, так как по моим опытам показания от последующих считываний скачут значительно и следует усреднять показания за н-ное количество циклов.
Migrator
20.05.2016 17:26+2Это есть в исходных скриптах.
Примерно так:
local function pin1cb(level) -- Функция обработки прерывания
local tt = tmr.now()/1000; -- получаем текущее время
if level == 1 then Если уровень высокий
h = tt;
tl = h - l; -- вычисляем промежуток времени прошедший с предыдущего цикла
ppm = 5000 * (th - 2) / (th + tl - 4) -- вычисляем значение со2 по формуле из даташита.
if ppm>300 then ListTime[3]={time=tmr.time(), data=ppm} end; -- Если данные похожи на правду записываем их в глобальную переменную
else -- если низкий фронт
l = tt; -- сохраняем текущее время
th = l - h; -- вычисляем прошедшее время с предыдущего цикла
end
if c>3 then gpio.mode(1,gpio.INPUT) print('pp1',ppm) return ppm end -- если прошло больше 3 циклов считаем что значение получено
c=c+1
if level == 1 then gpio.trig(1, "down") else gpio.trig(1, "up") end -- переключаем прерывание с повышающегося фронта на понижающий и обратно.
end
gpio.mode(1,gpio.INT) -- устанавливаем 1 пин в режим прерывания
gpio.trig(1, "up",pin1cb) -- настройка прерывания на 1 пине. Если фронт сигнала возрастает вызываем функцию pin1cb
У меня нет проблем с скачущими значениями. Считываю все подряд. Даже когда прибор стоит у окна и вокруг него неспокойная воздушная обстановка. Значения конечно скачут. Но плюс/минус 150 — 250 ppm за 10 минут. И это похоже на реальную картину.
IRainman
20.05.2016 17:40+1Проверьте у себя питание, на всякий случай, осциллографом. Вполне вероятно что с ним что-то не так ибо совсем скачкообразных значений там быть не должно.
Bobnecat
20.05.2016 18:02+1Да думаю я зря волнуюсь на счет скачкообразности, в моем случае они в пределах 50 ppm в пустой квартире и 100ppm когда кто-то присутствует при измерениях каждые 10 минут (при этом каждый замер это 5 усредненных PWM циклов) Просто на графике народмон такие скачки не очень эстетично выглядят. Питаю кстати от китайского БП на 5 вольт, который на самом деле дает 5,6в, а вся схема напичкана конденсаторами. Сам CO2 датчик во время «мигания» потребляет ~45мА.
Кстати, самое крутое что я наблюдал этим датчиком было дыхание маленького деревца которое живет у меня в гостиной. Когда я уезжал из дома на несколько дней, по ночам CO2 медленно поднимался до самого утра, а потом резко падал с наполнением комнаты светом.
В моем случае я собрал погодную станцию в связке Atmega328+ESP8266+BMP180+MH-Z19 и наружный датчик с автономным питанием на Atmega328+light sensor+DHT22 отправляющий данные по 433mhz каналу.
alexpp
20.05.2016 17:01+2Писал прошивку для подобного устройства, с тем же СО2-датчиком и тем же дисплеем — на lua постоянно получал ошибку про нехватку памяти для прошивки. Плюнул — и написал все в Arduino IDE. Получилось компактнее и понятнее, а lua — забыл как страшный сон.
Migrator
20.05.2016 17:32Не соглашусь. Это довольно простой проект, и очень не критичный к ресурсам.
У меня есть другой проект где несколько десятков программных модулей, десяток датчиков, управление оборудованием, обработка связи по WIFI.
И все нормально работает.
Да о памяти конечно приходится задумываться, но не настолько критично.
Лично мне нравится lua своим изяществом, универсальностью, и очень быстрой отладкой.
DarkByte
20.05.2016 22:37+2Если речь о NodeMCU, то тоже столкнулся с проблемой нехватки памяти, причём на довольно простом скрипте. Позже оказалось, что есть какой то лимит на размер одного файла, поэтому скрипт нужно разбивать на модули, иначе будет ошибка нехватки памяти. Но, по-моему, писать на Си не сильно сложнее, чем на Lua, особенно когда стоит задача поморгать светодиодом с использованием готового модуля.
Migrator
20.05.2016 22:53+1Для меня в Lua есть одна совершенно замечательная особенность. Можно в готовое, работающее устройство добавлять и изменять скрипты на ходу. Через USB или WiFi. Мне нравится что можно добавлять и менять функциональность в живую, просто пересылая из управляющей программы на PC скрипты. Проблема с памятью решается разбиением на модули и правильным их оформлением. В том числе широким использованием локальных переменных и функций.
Undiabler
20.05.2016 17:37+1На делфи еще пишут?! Расскажите пожалуйста современное применение данного языка.
Последний раз встречал делфи года три назад на производственной фирме где люди со стажем по 5-10 лет на нем работают и банально нет времени и средств переучиваться и переводить процесс на что-то поновее.
Есть какие-то перспективы или отрасли конкретно под этот язык?IRainman
20.05.2016 17:41Вроде пишут, по идее даже десктопный AIMP на нём написан. Хотя я сам не особо в теме.
Migrator
20.05.2016 17:43+1Я (и не только я) на работе пишу клинские места в клиент-серверных проектах на delphi. И да, контора работает уже 15 лет.
Delphi универсальный язык, какая в сущности разница, что на нем писать, если это не сказывается на результат?
nik_vr
20.05.2016 19:41> На делфи еще пишут?! Расскажите пожалуйста современное применение данного языка.
Total Commander — достаточно современное применение? 32-битная версия до сих пор компилируется в очень старой версии Delphi. 64-битная — в Lazarus.
flyme
20.05.2016 17:43И во сколько времени/денег обошёлся прибор с софтом?
Migrator
20.05.2016 17:47+1По деньгам примерно 3000р за детали + корпус от 200р до 1500р Мне корпус достался бесплатно.
По времени — сейчас могу повторить за 1 день. Когда делал, экспериментировал, переделывал, думал…
Месяц наверное.
merlin-vrn
21.05.2016 10:23Скажите, а где контроль влажности? Это вообще-то важный показатель для самочувствия. А если есть дети — очень важный показатель (от которого зависит, например, ваш сон по ночам).
Migrator
21.05.2016 11:31В офисе не актуально. Там влажностью нет ни какого способа управлять. Для дома несомненно актуально. Прикрутить датчик влажности не проблема, надо придумать как вписать показания в интерфейс. Есть такие заявки, я над этим думаю.
sim31r
22.05.2016 03:36Насчет сна у меня нет такой информации. Знаю что вреден сухой воздух при длительном воздействии, как для человека, так и для некоторого оборудования и книг. Сухой воздух вызывает пересыхание слизистых оболочек и повышает вероятность заболеть ОРЗ. Зимой, без увлажнения, типично 40% влажности всего. Зимой, вентилируя помещение, снижаем влажность, так что ориентация на СО2 без учета влажности может быть вредна. Получим низкое содержание СО2, но при пересушенном воздухе.
DmitrySpb79
21.05.2016 13:33Спасибо за материал, интересно. Подскажите плз, а какой из датчиков лучше брать?
В описании на ебее написано:
Measuring Range
0~2000 ppm
0~5000 ppm
Please let us know the measuring range you need in the Remarks. If no remarks, we will ship 0~5000ppm by default.
И кстати, $29.58+free shipping за датчик это адекватная цена?Vadim028
21.05.2016 15:30+1По ссылкам на статьи автора можно найти как он подбирал компоненты:
drive.google.com/file/d/0B4KYGXb6-nxpZVc0Z2trU2VHRUE/view
Там приведена ссылка на датчик MH-Z19 за 24$ (1700 Р)
ru.aliexpress.com/item/1PCS-module-MH-Z19-infrared-co2-sensor-for-co2-monitor-Free-shipping-new-stock-best-quality/32643995676.html
— Migrator, было бы не плохо добавить информацию о детальках в статью, для полноценной, так сказать, инструкции.
Также, если посмотреть Ваше видео о приборе без корпуса, можно увидеть не указанный блок питания для макетирования MB102 (3,3В 5В)
СпасибоMigrator
21.05.2016 15:31Собственно Вы дали исчерпывающую информацию:) Блок питания оказался лишним, от микро USB питания вполне достаточно.
Migrator
21.05.2016 15:26Дороговато будет. На Алли, С платной доставкой получается US $25.93. Трудно сказать. С одной стороны 2000 это уже ахтунг. С другой, точность у них одинаковая. У меня 5000. Меня устраивает.
Это был ответ для DmitrySpb79
nik_vr
Около месяца назад подозрительно похожа статья была на MySku: http://mysku.ru/blog/aliexpress/40219.html
Migrator
Да, это моя статья, и она действительно похожа.