Датчик углекислого газа 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 блоком питания:
Источник: