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

Содержание

Разбирая свои закрома радиодеталей наткнулся на любопытный модуль — MH-Z19b. Это простенький датчик уровня углекислого газа. Немножко поковырявшись в интернете, выяснил его возможности:

  • Питание +5в, можно кормить любой зарядкой для мобильного
  • Данные можно снимать через последовательный порт
  • Диапазон измерения — от 400ppm до 5000ppm

На свежем воздухе концентрация углекислого газа составляет примерно 400ppm, но может зависеть от множества факторов.

В помещении нормальным считается содержание углекислого газа до 800ppm. Если концентрация поднимается 1000ppm, то появляется чувство усталости. А при концентрации выше 1400ppm голова станет ощутимо ватной.

Попробую на базе этого датчика собрать простой сигнализатор качества воздуха.

Прототип

В качестве “мозга” устройства будет полюбившийся мне в последнее время ESP8266. Для его подключения достаточно всего четырёх проводов, значит можно использовать самую простую версию — ESP-01. В качестве основы всей конструкции — макетная плата, несколько разъёмов и немного провода.

исходные модули

Разъёма питания на макетке не предусмотрено, но в закромах нашлась старая плата с припаянными Micro USB разъемом и регулятором напряжения на 3.3в. То, что надо. Отпилил всё лишнее и прикрутил к макетке двумя винтами М2.

Схема подключения тривиальная. Если нигде не напутать, то заработает сразу.

схема устройства

Резисторы по 10К, конденсаторы на питание я проигнорировал — прототип, все-таки.

собранный прототип

Программа

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

Первым делом в скетч был добавлена возможность загрузки микропрограммы через WiFi — чтобы не переключать постоянно модуль между программатором и датчиком, называется Arduino OTA. Кстати, прошивка загружается так гораздо быстрее чем через UART.

Для получения данных с датчика специальная библиотека тоже есть, но её я не использовал — там и так всего несколько строк:

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

Сбор данных

Для сбора данных у меня сейчас используется валявшийся ранее без дела микрокомпьютер Raspberry PI. На него был установлен брокер протокола MQTT mosquitto с конфигурацией по умолчанию. Внутри локальной домашней сети это достаточно безопасно, да и ничего секретного там все равно нет.

Все настройки — по умолчанию, этого достаточно для домашней сети. Единственный важный момент — надо настроить маршрутизатор так, чтобы у малинки был статический IP адрес, а если можно — то и имя прописать в DNS.

После этого малинка готова к приему циферок от датчика. Надо только установить библиотеку PubSubClient.

В программу добавилось следующее:

Данные отправляются в формате InfluxDB — это пригодится на следующем шаге.

Хранение истории для анализа

Хранятся данные в InfluxDB. Это специальная база данных для записей, упорядоченных по времени. Самое то для истории показаний разных датчиков.

Установка немножко более замороченная, потому что хочется последнюю версию от разработчиков:

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

Получаем данные из mosquitto, отправляем в influxdb.

Таким образом в базе данных sensors появятся показания нашего датчика.

Визуализация

Красивые динамичные графики рисует пакет Grafana.

Установка, тоже последняя версия:

После этого можно окрыть в браузере страницу http://адрес малинки:3000/ и настроить источник данных (InfluxDB) и панель с графиками. В результате можно сделать вот такую красоту:

график уровня углекислого газа

Результаты прототипирования

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

Где-то неделю я наблюдал за графиками. Показания, может и не точные, но представление о свежести воздуха дают. При закрытых окнах концентрация медленно растет и за несколько часов добирается до 1000ppm, что, действительно, субъективно ощущается как чувство усталости и потери внимания. Если проветрить — опять опускается до 400-500ppm и становится ощутимо легче.

Результаты работы прототипа мне понравились и я решил собрать устройство более качественно — на нормальной печатной плате.

Второй прототип

Плату развёл, как обычно, в Eagle CAD и заказал у JLCPCB. Десяток плат стоит всего $2, что вполне доступно. Изготовление и доставка заняли порядка трёх недель.

Для уменьшения габаритов датчик припаян “вверх ногами”. Под ним располагается преобразователь напряжения на 3.3V, с другой стороны платы — модуль ESP8266 ESP-12e и, по желанию, датчик температуры и влажности DHT22. На свободном месте — трёхцветный светодиодный модуль WS2812b для простой индикации. Для питания — разъем USB, можно воткнуть напрямую в любой блок питания с выходом USB. Получилось весьма просто и компактно.

собранное устройство собранное устройство

Разъема для программирования на плате нет. Я подпаял провода напрямую к ESP8266 и залил туда минимальную прошивку, которая подключается к домашней сети WiFi и включает режим обновления прошивки по сети.

Индикация

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

Пока воздух свежий, устройство медленно и неярко “дышит” зелёным светом. Когда концентрация начинает превышать 1000ppm, то начинает более ярко и настойчиво моргать жёлтым, а при концентрации более 1400ppm резко вспыхивает красным на полной яркости.

Вполне наглядно и удобно. А вот так устройство выглядит на рабочем столе в розетке со встроенным USB блоком питания:


Источник: ovcharov.me