1. Простой измеритель содержания CO2 в воздухе.

  2. STM32F103

    MH-Z19B

    CDM102

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

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

На текущий момент для домашнего применения есть относительно недорогой датчик MH-Z19B. Его можно найти в магазинах радиокомпонентов, что дороже, или заказать у китайцев, и он обойдется примерно в 20$.

датчик MH-Z19B

Принцип действия датчика неоднократно описан в интернете, повторяться не буду. Датчик измеряет концентрацию в пределах 400-5000 ppm. Есть датчики с верхним порогом в 2000 ppm. Нормой считается содержание CO2 от 400 (лес, улица) до 1000 ppm. На практике концентрация в помещении может легко превысить 1500 ppm, поэтому мне кажется правильным для домашнего применения взять датчик с более широким диапазоном измерения. О своих наблюдениях по поводу содержания CO2 расскажу в конце.

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

Чтобы с датчиком общаться по по usart интерфейсу и получить правильные показания нужно:
- задать датчику диапазон измерений 5000
- считанное из датчика значение необходимо умножать на 2/5, чтоб получить правильное значение в PPM. Этот вывод сделан мной после сравнения показаний, считываемых с usart интерфейса и показаний, получаемых на PWM выходе датчика.

Такой-же алгоритм рекомендован и на других сайтах, где обсуждалась работа с данным датчиком.

Описываемая тут конструкция показывает поочередно текущее содержание CO2 в воздухе, температуру и условный график содержания CO2 за прошедшие 12 часов.

В качестве индикатора для измерителя было решено применить очень древний точечный дисплей, снятый с хаба (если кто забыл, то хаб - это вид сетевого оборудования. В настоящее хабы вытеснены с рынка и из лексикона более продвинутыми коммутаторами или свичами).

дисплей CDM102

Индикатор называется CDM102 и представляет собой матрицу 5х12 крупных точек. Каждая точка может быть одного из трех цветов. Яркость регулируется программно и имеет 7 уровней. Управление индикатором производится по SPI-подобному интерфейсу.

Чтоб два раза не вставать, решил сразу добавить датчик температуры DS18B20.

Ночью дисплей светит довольно ярко, поэтому добавил датчик освещённости на фоторезисторе и подключил его к АЦП микроконтроллера. Теперь яркость дисплея регулируется в зависимости от уровня внешней засветки.

Микроконтроллер взял STM32F103CBT6 на плате Mapple Mini, но можно использовать любую плату, на которой установлен STM32F103CBT6 или _С8Т6 (они, как известно, отличаются только объёмом флеш-памяти, которой для такого устройства более чем достаточно).

Mapple Mini stm32F103cbt6

Сейчас в продаже большое количество разнообразных модулей на этом микроконтроллере и стоят они дёшево. Так что наверняка удастся подобрать что-то подходящее. Надо только убедится, что все задействованные в схеме выводы микроконтроллера выведены на пины модуля.

Принципиальная схема

Принципиальная схема измерителя

Принципиальная схема в формате Splan7: (доступно зарегистрированным пользователям)

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

Обратите внимание на то, что хотя микроконтроллер питается напряжением 3.3 вольта, на модуль подаётся питание 5 вольт, в моём случае или через пин Vin или снимается с USB разъёма. Поэтому на плате модуля стоит стабилизатор на 3.3 вольта для питания микроконтроллера (на схеме он не указан, как и прочие компоненты, установленные в модуле). Выход этого стабилизатора 3.3 вольта выведен так-же на пин Vcc модуля. Этот выход используется в схеме для подключения датчика освещённости.

Прошивка

Версия 1.0.17 (02.06.2018)

Версия 1.0.17 от 02.06.2018: (доступно зарегистрированным пользователям)

Немного фотографий работающего измерителя:

Текущая температура

Mapple Mini stm32F103cbt6

Текущее содержание CO2. Из-за ограниченного места на дисплее цифры слиплись. Чтоб их различать, пришлось сделать их разного цвета. Нормально получилось, считывается, не напрягает.

Mapple Mini stm32F103cbt6

График содержания CO2 за последние 12 часов, по одному столбику на час. Значение за час усредняются.

Mapple Mini stm32F103cbt6

После месяца работы прибора можно сказать следующее:

- в городе содержание CO2 в комнате у открытого окна ниже 500 практически не опускается.

- если окно приоткрыто и в помещении есть люди, то содержание будет 600-900, что уже считается превышением нормы.

- если закрыть окно и в помещении есть люди, содержание начинает нарастать и может дойти до 1200-1600. Поэтому проветривание спальни перед сном полезно, но до утра не хватит, надо чтоб и ночью поступал свежий воздух.

- воздух ощущается как "спертый" после 1000

Т.е. "нормы" - они для вакуума в сферической комнате и без людей. Или надо, чтоб всё время было что-то открыто и проветривалось, что не всегда возможно.

Всё.

ОБСУЖДЕНИЯ

Аватар пользователя TinLethax

Привет. Недавно я получил CDM102 для игры. На данный момент я смог установить разные цвета для левой и правой групп дисплея. Но мне любопытно, как вы можете смешивать цвета в одной группе дисплеев. Возможно, вы быстро переключаетесь между двумя цветами (аналогично мультиплексированию)?

Аватар пользователя TinLethax

Привет. Недавно я получил CDM102 для игры. На данный момент я смог установить разные цвета для левой и правой групп дисплея. Но мне любопытно, как вы можете смешивать цвета в одной группе дисплеев. Возможно, вы быстро переключаетесь между двумя цветами (аналогично мультиплексированию)?

Аватар пользователя Leog - Linker.Ru

Насколько я помню, никакого мультиплексирования не требуется. Зеленый и красный на каждый пиксель зажигаются независимо и друг с другом не связаны. Поэтому их можно зажечь одновременно.
Зеленый командой 0xA0 - для группы 0, 0xA1 - для группы 1
Красный командой 0xA2 - для группы 0, 0xA3 - для группы 1

Аватар пользователя TinLethax

Спасибо за ответ. Я на самом деле заставил многоцветный работать несколько часов назад после того, как опубликовал комментарий. Я провел небольшой эксперимент и обнаружил, что команда 0xB0-0xB3 (сначала MSB) предназначена для установки цвета. Это позволяет комбинировать зеленый и оранжевый цвета для создания желтого цвета в одной группе дисплея. Вот ссылка на мой исходный код, если вам интересно: https://github.com/TiNredmc/stm8l_sdcc_template/blob/master/code/SPI-CDM...

Аватар пользователя Leog - Linker.Ru

Спасибо за ссылку. Я баловался этим дисплеем несколько лет назад, забыл уже подробности. К сожалению дисплей в единственном экземпляре, поэтому не рискую нигде применять.