Сразу должен сказать, что идея не моя. Изначально речь шла об устройстве на дисплее epaper, который бы на экран выводил значения CO2, температуру и влажность. Ну еще время. В процессе обсуждения родился проект, который мы назвали Air Quality Monitor.

Изучение рынка готовых устройств похожего направления привело к пониманию, а что же мы хотим получить на выходе.

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

Далее выбор датчиков — CO2, VOC, температуры, влажности, давления, освещенности. Также нужна подсветка, но не просто, а чтобы меняла цвет в зависимости от качества воздуха, чтобы можно было определить это качество не глядя на экран, а ориентируясь только по цвету. Ну и хорошо бы уметь управлять яркостью этой подсветки, вплоть до полного ее выключения.

Далее выбор возможности управления — например включать вытяжку (или еще что‑то) по данным качества воздуха — CO2 и (или) VOC.

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

Далее, чего не должно быть в Мониторе — самовозгорающихся компонентов, таких, как например, аккумуляторы.

Итак, рассмотрим основные компоненты Air Quality Monitor, с некоторыми комментариями по выбору.

  • WeAct 4.2» — epaper экран от WeAct Studio — большой, контрастный, с возможностью вывода больших символов, которые хорошо видны даже людям с плохим зрением.

  • SCD40 — высокоточный цифровой датчик углекислого газа (CO2) — умеет отдавать температуру и влажность, но в Мониторе эти показания не используются, потому что в процессе работы датчик нагревается и показания уплывают.

  • BME280 — комбинированный цифровой датчик влажности, давления и температуры фирмы Bosch Sensortec — умеет, помимо температуры и влажности, отдавать давление, которое нужно датчику CO2 для более корректного расчета показаний.

  • SGP40 — цифровой датчик летучих органических соединений (VOC) от Sensirion.

  • BH1750 — цифровой датчик освещённости.

  • DS3231 — часы реального времени (допускается установка DS1307) — изначально проект был без RTC, но в процессе тестирования выяснилось, что считать время основным микроконтроллером не получается с достаточной точностью.

  • WS2812B — адресные светодиоды, которые помогают визуально по цвету определить качество воздуха.

  • TMB12A05 — звуковой извещатель.

  • ZTU — модуль Zigbee от фирмы Tuya, выполненный на чипе TLSR8258F1KET32 фирмы Telink — основной и единственный микроконтроллер Монитора.

Схема монитора выглядит так.

Принципиальная схема Air Quality Monitor
Принципиальная схема Air Quality Monitor
Верхняя сторона платы
Верхняя сторона платы
Нижняя сторона платы
Нижняя сторона платы

Краткое описание возможностей Air Quality Monitor.

  • Монитор выводит следующие показания внутренних датчиков:

    • углекислого газа CO2,

    • летучих органических веществ VOC,

    • температуры,

    • влажности,

    • атмосферного давления,

    • освещенности.

  • Монитор имеет возможность отображать показания температуры, влажности и заряда батареи с внешнего датчика напрямую, минуя координатор (прямой биндинг).

  • Монитор имеет возможность управлять внешним устройством (реле/вентилятор) напрямую, минуя координатор (прямой биндинг) на основании показаний датчиков CO2 и (или) VOC, посылая команды On‑Off.

  • Монитор может отображать данные в горизонтальном или вертикальном положении, а также менять режим вывода — черное на белом или белое на черном.

  • Настраиваемые параметры сохраняет в энергонезависимой памяти модуля ZTU.

  • Взаимодействие с «умными домами» через zigbee2mqtt.

  • Первоначальная настройка происходит через web‑интерфейс zigbee2mqtt.

  • Монитор питается от источника постоянного тока напряжением 5 вольт через разъем USB Type‑C и является роутером.

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

  1. Дата, день недели и время. Периодически, если Монитор сопряжен, он запрашивает время у координатора и синхронизируется с полученным временем.

  2. Иконка сети Zigbee. Выводится, когда устройство присоединено к сети, иначе иконка отсутствует.

  3. Значение VOC. Показания передаются в Index Points. Датчик SGP40 выдает некое RAW значение. Измерения происходят с периодом в 10 секунд. И это значение передается в специальную библиотеку, которую предоставляет производитель этого датчика. В этой библиотеке и вычисляется Index Points. Его диапазон от 0 до 500

  4. Значение CO2 в PPM от 400 до 2000 (вне этого диапазона показания будут с большой погрешностью). Для более корректного вычисления содержания углекислого газа в датчик SCD40 каждый раз, перед измерением, передается значение атмосферного давления с датчика BME280. При желании датчик SCD40 может быть откалиброван принудительно или сброшен на заводские настройки. По умолчанию включена автоматическая калибровка.

  5. Температура внутреннего датчика. Диапазон измерения от -45 до +85 °С.

  6. Влажность внутреннего датчика. Диапазон измерения от 0 до 100%.

  7. Влажность внешнего датчика.

  8. Температура внешнего датчика.

  9. Заряд батареи внешнего датчика.

  10. LQI — уровень сигнала в единицах от 0 до 255.

  11. Давление в гектопаскалях. Диапазон измерения от 300 до 1100 hPa.

  12. Давление в мм ртутного столба.

  13. Освещение в LUX от 0 до 65535.

  14. Уровень сигнала в виде пиктограммы, вычисляется из LQI.

Световая индикация

Тут все просто. Цвет меняется в зависимости от показаний CO2 и VOC.

  • Зеленый — хорошо (CO2 400... 600 и VOC 0... 100)

  • Желтый — приемлемо (CO2 601... 900 и VOC 101... 250)

  • Пурпурный — плохо (CO2 901... 1200 и VOC 251... 400)

  • Красный — очень плохо (CO2 1201... 2000 и VOC 401... 500)

Уровень интенсивности свечения можно регулировать от 0 (выключено) до 255 (максимальное свечение).

Еще индикатор будет мерцать красным цветом — при попытке сопряжения и зеленым — когда сопряжение произошло.

Настройки с помощью кнопки на Мониторе

  • Нажать один раз — происходит отправка отчетов по всем параметрам в сеть Zigbee.

  • Нажать быстро два раза — экран меняет ориентацию на 90 градусов.

  • Нажать быстро три раза — экран меняет вывод с черного на белом на белое на черном и наоборот.

  • Нажать быстро четыре раза — изменит вывод температуры с Цельсия на Фаренгейты и наоборот.

  • Нажать быстро пять раз — перезагрузить Монитор.

  • Нажать и держать кнопку более 5 секунд — подключиться к сети или покинуть сеть Zigbee (светодиод должен погаснуть и начать моргать красным цветом). Время присоединения к сети — полторы минуты (или пока моргает светодиод).

Каждое нажатие кнопки сопровождается промаргиванием световой индикации красным цветом.

Настройка и управление с помощью интерфейса zigbee2mqtt

Вкладка Exposes

Exposes
Exposes
  • CO2 — выводит текущее значение CO2.

  • Voc index — выводит текущее значение VOC.

  • Temperature — выводит текущее значение внутреннего датчика температуры.

  • Humidity — выводит текущее значение внутреннего датчика влажности.

  • Pressure — выводит текущее значение внутреннего датчика давления.

  • Illuminance — выводит текущее значение освещенности.

  • Display rotate — как выводить информацию, в горизонтальной или вертикальной плоскости.

  • Display inversion — как выводить информацию, черное на белом или белое на черном.

  • Temperature display mode — показывать на экране градусы температуры с Цельсиях или в Фаренгейтах.

  • Temperature offset — подстроить датчик температуры, если по каким‑то причинам он показывает неверную температуру. Диапазон настроек от -5 до +5 °С с шагом 0,1. По умолчанию значение подстройки датчика температуры выставлено в 0.

  • Read interval — как часто будут опрашиваться внутренние датчики. Диапазон опроса от 5 до 600 секунд. По умолчанию 10 секунд. Это не относится к датчику VOC SGP40, его опрос осуществляется по таймеру каждые 10 секунд. Связано с библиотекой вычисления Index Points от производителя датчика.

  • Enabling co2 control — включение и отключение управления внешним устройством по показаниям CO2. Также эта настройка активирует звук.

  • Low co2 — нижний порог CO2, если значение становится ниже этого порога, внешнее устройство выключается.

  • High co2 — верхний порог CO2, если значение становится больше этого порога, внешнее устройство включается. Также, при прохождении порога, Монитор сообщает об этом звуковым сигналом.

  • Enabling voc control — включение и отключение управления внешним устройством по показаниям VOC. Также эта настройка активирует звук.

  • Low voc — нижний порог VOC, если значение становится ниже этого порога, внешнее устройство выключается.

  • High voc — верхний порог VOC, если значение становится больше этого порога, внешнее устройство включается. Также, при прохождении порога, Монитор сообщает об этом звуковым сигналом.

  • Switch actions — какая команда отправляется для включения и выключения внешнего устройства. Если выставлено в on, то для включения внешнего устройства посылается команда On, а для выключения Off. Если выставлено в off, то для включения внешнего устройства посылается команда Off, а для выключения On.

  • Brightness — регулировка яркости светодиодной индикации. От 0 до 255. При 0 — светодиоды остаются выключены. 255 — соответствует максимальной яркости.

  • Enabling sound — глобальное включение и выключение звука.

  • Frc co2 correction — выводит значение поправки для CO2, если была выполнена принудительная калибровка. Значение может быть как положительным, так и отрицательным.

  • Features sensors — специфические настройки Монитора, которые выведены в отдельную группу.

    • CO2 forced calibration — принудительная ручная калибровка датчика CO2. Нужно вынести устройство на свежий воздух минут на 15 и потом подать команду калибровки. Датчик примет значение, измеренное при калибровке за «эталон» и выставит поправку, которую можно увидеть в Frc co2 correction.

    • CO2 factory reset — сброс датчика CO2 к заводским настройкам. Значение ручной калибровки, если таковая была сделана, тоже сбрасываются.

    • Bind reset — очистит таблицу биндинга внешнего датчика температуры/влажности.

Владка Bind

Bind
Bind

Настройка прямого биндинга на исполнительное устройство — реле/вентилятор и т. п., которое будет включаться и выключаться, если включен Enabling co2 control и/или Enabling voc control и выставлены соответствующие пороги. Нужно только учесть, что если минимальный порог выставлен слишком низким, то внешнее устройство никогда не выключится. Для настройки, нужно выбрать эндпоинт в Source endpoint, где на Мониторе находится кластер On‑Off — это 1, далее выбрать внешнее устройство в Destination и кластер на внешнем устройстве в Destination endpoint, отметить галочкой OnOff и нажать на Bind справа. Если управление станет не нужным или нужно будет изменить внешнее устройство, нужно нажать Unbind.

Вкладка Reporting

Reporting
Reporting

Репортинг кастомных атрибутов лучше не трогать. Их можно сразу отличить по имени — attr6, attr7 и т. д. Репортинг основных параметров — CO2, VOC, Temperature, Humidity, Pressure и Illuminance можно настроить в соответствии с вашими желаниями.

Настройка внешнего датчика температуры и влажности.

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

Поиск таких датчиков привел к выводу, что их практически никто не делает. Ну вот EfektaLab, если только. Потому было принято решение, взять какой‑нибудь заводской датчик на таком же модуле ZTU и просто переписать ему прошивку. Сильно не буду вдаваться в подробности, это можно еще одну статью написать:)) В общем какой датчик можно перепрограммировать и как, читайте в проекте на github'е

Для получения показаний с внешнего датчика нужно настроить на нем прямой биндинг на Монитор. Для этого нужно в web‑интерфейсе zigbee2mqtt зайти в этот датчик, перейти во вкладку Bind, выбрать кластер 1, выбрать Монитор и отметить передачу нужных параметров — температуру, влажность и батарейку. И после этого нажать Bind. Если по какой‑то причине вывод показаний с внешнего датчика станет не нужным, то в этой же вкладке нужно нажать Unbind. К сожалению, сам Монитор не умеет отслеживать, если от него отписались. Поэтому во вкладке Exposes самого Монитора сделана настройка — Clear Bind — если нужно очистить информацию о внешнем датчике. Это нужно сделать, если вы хотите поменять внешний датчик на другой. Или подождать пару часов — если в течение 2-х часов внешний датчик ничего не присылает, то информация о нем автоматически стирается и данные с экрана очищаются. Если по какой‑то причине будут присоединены несколько датчиков температуры к одному Монитору, то на экран будет выводится информация с того датчика, который первым прислал отчет. Все отчеты от других датчиков будут игнорироваться.

Прошивка.

Хотелось бы поделиться некоторыми трудностями, с которыми пришлось столкнуться при написании прошивки. Самая большая трудность в том, что для TLSR8258 практически нет примеров. И все приходится адаптировать самому и проверять. На это уходит очень много времени. Вот например экран. Да, у WeAct Studio есть примеры. Но для других чипов. Но это полбеды. Существуют программы, которые помогают перенести шрифты или иконки в формат, понятный экрану. Но WeAct Studio зачем‑то пошла не совсем стандартным путем. Пришлось переписывать работу с images. Также нет готовых примеров работы с датчиками по i2c. Нет, в открытом доступе есть примеры, но опять же, это все для других контроллеров. Но в результате мы со всем справились:‑))

Где взять прошивку и как ее загрузить читайте в самом конце статьи, там будут ссылки на github.

Немного фотографий.

Спасибы.

Олегу Novgorod_DIYZi — за идею, за техническое обеспечение, за советы, за тестирование и за предоставленные фотографии. Ну и если кто‑то хочет поучаствовать в тестировании такого Монитора, обращайтесь к Олегу напрямую.

Сергею SGHome — за тестирование оборудования и видео‑обзоры.

Джону Гудману — за прояснение некоторых тонких моментов в работе с датчиками CO2 и VOC.


Если кто‑то хочет обсудить Zigbee, или получить помощь в настройке или создании устройств, есть несколько хороших телеграм‑чатов.

Вокруг да около Zigbee — Обсуждение устройств, прошивок и прочего софта, работающего с Zigbee

zigdev — Группа для разработчиков zigbee девайсов/прошивок. Здесь помогают разобраться как скомпилировать/написать прошивку. Помогают с разработкой железа под зигби.

DIY DEV — группа о DIY электронике. Умные дома, интернет вещей, разработка электроники, программирование.

zigbazar — базар для Zigbee устройств, только объявления продажа/покупка/обмен/дарение/отзывы


Проект Air Quality Monitor на github'е.

Проект датчика температуры на github'е

Комментарии (5)


  1. xSVPx
    21.08.2025 22:12

    А ээээ вы датчик со2 не калибруете ?


    1. DmitryOlkhovoi
      21.08.2025 22:12

      я кстати не сильно шарю, но игрался с датчиком, для калибровки его достаточно было выставить в окно, пока не покажет 400.


      1. xSVPx
        21.08.2025 22:12

        Беда в том, что происходит с такими датчиками если их не выставлять раз в неделю в окно....


        1. Oleg-AC
          21.08.2025 22:12

          Надо ли "выставлять" сильно зависит от самих датчиков.

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

          Как-раз, чтобы не заниматься калибровкой и "продуванием".


  1. REPISOT
    21.08.2025 22:12

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

    При этом датчик BME280 прямо над стабилизатором, и нагретый воздух будет течь прямо на него. Да, с обратной стороны платы тоже.

    Скрытый текст

    Вижу решетку снизу, но у корпуса нет ножек, чтобы она работала. И судя по задней крышке, там вентиляции тоже нет.

    А на фото, как я понимаю, плату просто положили, чтобы сфотографировать, потому что датчики не с той стороны.

    Скрытый текст

    А так бы я собрал такой гаджет. У меня даже лежат некоторые из примененных модулей.

    P.S. Поиск выдает, что есть экран с красным цветом в такую же цену. Было бы неплохо использовать его вместе с цветом подсветки.

    Скрытый текст