image

В начале немного предыстории.

Однажды я был в гостях у своего товарища, который как и я, активно занимается домашней автоматизацией. Я увидел у него смонтированную систему приточной вентиляции и поинтересовался, как он реализовал автоматизацию этой системы. В ответ услышал, что он её включает вручную, так как у него нет устройства, которое анализирует качество воздуха, а готовые решения имеют зачастую слишком неоправданную цену для систем бытового применения. Недолго думая, я предложил ему своё решение, о котором далее и пойдет речь.

Разработка


Уже на этапе разговора у меня в голове сложилась определенная концепция устройства, которая бы идеально вписывалась в существующую систему домашней автоматизации, и некоторые выдвинутые условия товарища (будем их называть ТЗ), уточнили некоторые моменты.

Некоторые моменты:

  • Устройство должно иметь эстетичный вид и не выглядеть «колхозно».
  • Устройство должно иметь веб интерфейс для конфигурации устройства.
  • Устройство должно поддерживать протокол обмена MQTT и иметь возможность интеграции в Home Assistant.
  • Разъем питания должен быть USB-C.
  • Не стоить как крыло от Boeing.


Разработка аппаратной части


На самом деле здесь ничего сложного. В качестве газового сенсора был выбран проверенный временем BME680 от небезызвестной компании Bosh.

Внешний вид датчика BME680, установленного на плате


Технические характеристики BME680:

  • Датчик ЛОВ: IAQ 0…500 с разрешением 1, потребление от 0,1 мА;
  • Датчик влажности: 0…100 %, точность ±3%, время отклика 8 с;
  • Датчик давления: диапазон 300…1100 кПа, точность ± 0,6 кПа;
  • Датчик температуры: диапазон измерений –40 … 85 °С, абсолютная точность ±1 °С;
  • Потребление: 3,1 мкА температура/ давление при 1 Гц; 3,7 мкА температура/ давление/ влажность; 0,09…12 мА температура/ давление/ влажность/ воздух;
  • Потребление в режиме сна: 0,15 мкА;
  • Коммуникационные интерфейсы: I2C или SPI;
  • Напряжение питания: 1,2…3,6 В (VDD); 1,71…3,6 В (VDDIO);
  • Диапазон рабочих температур: –40 … 85 °С;
  • Корпус: 8 — выводный LGA размером 3,0 x 3,0 x 1 мм.

Более подробную техническую информацию о датчике можно узнать на сайте компании.

В качестве микроконтроллера, который будет обрабатывать данные с датчика и выполнять функции коммуникации с Home Assistant, применим всеми любимый ESP8266 от компании Espressif Systems.

Функцию разъема питания устройства будет выполнять модуль с USB type C, который можно купить на известном китайском маркетплейсе килограммами за небольшую плату.

Модуль с разъёмом USB-C

После всего вышесказанного у нас «вырисовывается» следующая принципиальная схема устройства.

Принципиальная схема устройстваПринципиальная схема устройства

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

Рендер печатной платы устройства

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

Готовая плата устройства

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

Зависимость цвета индикатора от уровня загрязнения

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

Разработка корпуса


Так как в ТЗ заказчика прозвучала фраза:

Устройство должно иметь эстетичный вид и не выглядеть «колхозно».

Постараемся следовать данному запросу.

Используя FreeCAD в соответствии с размерами платы, была разработана модель корпуса. Рендеры корпуса можно увидеть ниже.

Рендер корпуса (все элементы)

Рендер корпуса в сборе

После печати и обработки корпуса получаем следующий результат.

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

Подключенное устройство с индикацией уровня загрязнения воздуха

Ссылка на STL файлы для печати на 3D принтере будет размещена в конце статьи.

Разработка программного обеспечения (микро ПО) устройства


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

Самые большие трудности для пользователя возникают при первоначальной конфигурации устройства, особенно если речь идет о ESP8266 и первоначальной настройки сетевого подключения, так как устройство обладает только Wi-Fi интерфейсом, и конфигурация выполняется путем подключения к точке доступа, созданной устройством.

Как это обычно происходит:

  • Пользователь должен подключиться к Wi-Fi точке доступа, созданной устройством.
  • Пользователь должен узнать IP адрес подключения в документации, если его нет, то нужно зайти в конфигурацию Wi-Fi и посмотреть IP основного шлюза текущего подключения, чтобы перейти по нему для конфигурации.
  • Открыть браузер.
  • Ввести в адресной строке IP адрес для перехода на страницу конфигурации.

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

Перейдем к техническим сущностям. Так как для разработки используется среда Arduino IDE, соответственно для работы с датчиком BME680 используется библиотека для Arduino, которая опубликована в официальном репозитории на GitHub. Библиотека имеет некоторые нюансы при использовании в Arduino IDE, но они хорошо описаны в Readme.

Библиотека BSEC достаточно понятна и в ней разберется даже начинающий «Ардуинщик», но стоит обратить внимание на некоторые моменты в инициализации подключения датчика по I2C шине. В примере описан следующий метод инициализации, однако этот метод не всегда работает c использованием модуля датчика, который применен в этой статье.

iaqSensor.begin(BME68X_I2C_ADDR_LOW, Wire);

Если обмен с датчиком не выполняется, то необходимо использовать следующий метод инициализации:

iaqSensor.begin(BME68X_I2C_ADDR_HIGH, Wire);

И для общего развития ниже описан пример получения данных с датчика BME680:

String ouput;

if (iaqSensor.run()) {                     // If new data is available
    output = String(time_trigger);
    output += ", " + String(iaqSensor.iaq);
    output += ", " + String(iaqSensor.iaqAccuracy);
    output += ", " + String(iaqSensor.staticIaq);
    output += ", " + String(iaqSensor.co2Equivalent);
    output += ", " + String(iaqSensor.breathVocEquivalent);
    output += ", " + String(iaqSensor.rawTemperature);
    output += ", " + String(iaqSensor.pressure);
    output += ", " + String(iaqSensor.rawHumidity);
    output += ", " + String(iaqSensor.gasResistance);
    output += ", " + String(iaqSensor.stabStatus);
    output += ", " + String(iaqSensor.runInStatus);
    output += ", " + String(iaqSensor.temperature);
    output += ", " + String(iaqSensor.humidity);
    output += ", " + String(iaqSensor.gasPercentage);
    Serial.println(output);
  }

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

Пользовательский интерфейс


Как уже было описано ранее, устройство должно иметь веб-интерфейс для конфигурации. Каких-либо особенностей при использовании интерфейса нет. Ниже представлены скриншоты некоторых страниц.

Страница входа

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

Главная страница устройства

На главной странице устройства в реальном времени отображаются следующие параметры:

  • Время работы устройства, с момента включения. Формат ДД: ЧЧ: ММ: ММ.
  • Статус MQTT. Статус «подключен» отображается только в момент отправки данных на MQTT сервер. Постоянного соединения с MQTT сервером устройство не имеет.
  • Данные сенсора. Параметр «точность датчика» имеет пять значений от 0 до 4, чем выше значение, тем точнее данные. Данный параметр зависит от накопленной внутренней статистики датчика BME680.
  • Активация светодиодного индикатора и регулировка яркости.

Страница конфигурации передачи данных с использованием MQTT протокола

Страница конфигурации передачи данных по MQTT. Думаю, что здесь всё понятно и описание излишне.

Интеграция с Home Assistant


Для интеграции нашего устройства в Home Assistant, как бы это странно не звучало, используется протокол MQTT.

Карточка нашего устройства на приборной панели Home Assistant

Для интеграции в Home Assistant нужно сделать два простых шага:

  • В конфигурационном файле указать параметры датчиков устройства.
  • На панели Home Assistant создать новые карточки.

Ниже пример кода интеграции в файле configuration.yaml. В примере указано имя топика "qsens/jsondata", формат данных JSON.

mqtt:
  sensor:   #датчик качества воздуха
    - name: "Датчик температуры"
      unique_id: 5bc54f8b-791-46fdg97-bfce-e98e92409d3e
      state_topic: "qsens/jsondata"
      unit_of_measurement: "°C"
      value_template: "{{ value_json.temp }}"
      device_class: temperature 
    - name: "Датчик влажности"
      unique_id: 5bc54f8b-7d741-4df99-bfce-e98e92409d3e
      state_topic: "qsens/jsondata"
      unit_of_measurement: "%"
      value_template: "{{ value_json.hum }}"
      device_class: humidity
    - name: "Датчик атмосферного давления"
      unique_id: 5bc54f8b-7d671-47fg74-e98e924
      state_topic: "qsens/jsondata"
      unit_of_measurement: "mmHg"
      value_template: "{{ value_json.pressure_sensor }}"
      device_class: pressure
    - name: "Датчик качества воздуха IAQ"
      unique_id: 5bc54f8b-7d7078671-47fg74-e98e924
      state_topic: "qsens/jsondata"
      unit_of_measurement: "ed"
      value_template: "{{ value_json.ppm_iaq }}"
      device_class: aqi
    - name: "Датчик качества воздуха TVOC"
      unique_id: 5bc54f8b-7d70734671-47fg74-e98e924
      state_topic: "qsens/jsondata"
      unit_of_measurement: "ppb"
      value_template: "{{ value_json.ppm_TVOC }}"
      device_class: volatile_organic_compounds
    - name: "Датчик качества воздуха CO2_Eq"
      unique_id: 5bc54f8b-778671-47fg74-e98e924
      state_topic: "qsens/jsondata"
      unit_of_measurement: "ppm"
      value_template: "{{ value_json.qual }}"
      device_class: carbon_dioxide

Код карточки типа "сетка" для отображения стрелочных индикаторов:

square: true
type: grid
cards:
  - type: gauge
    entity: sensor.datchik_kachestva_vozdukha_iaq
    severity:
      green: 0
      yellow: 100
      red: 200
    needle: false
    min: 0
    name: iAq
    max: 500
    unit: ' '
  - type: gauge
    entity: sensor.datchik_kachestva_vozdukha_co2_eq
    name: CO2_Eq
    unit: ppm
    needle: false
    severity:
      green: 0
      yellow: 800
      red: 1500
    max: 3000
  - type: gauge
    entity: sensor.datchik_kachestva_vozdukha_tvoc
    name: TVOC
    needle: false
    severity:
      green: 0
      yellow: 660
      red: 1431
    min: 0
    max: 500

Код карточки "объекты" для отображения основных параметров устройства:
type: entities
entities:
  - entity: sensor.datchik_temperatury
  - entity: sensor.datchik_vlazhnosti
  - entity: sensor.datchik_atmosfernogo_davleniia_2
  - entity: sensor.datchik_kachestva_vozdukha_co2_eq
  - entity: sensor.datchik_kachestva_vozdukha_tvoc
  - entity: sensor.datchik_kachestva_vozdukha_iaq
title: Система мониторинга среды
footer:
  type: graph
  entity: sensor.datchik_kachestva_vozdukha_co2_eq
  detail: 2

Заключение


В итоге у нас разработано и собрано компактное устройство для мониторинга качества воздуха в помещении по цене не более $13. Устройство отлично интегрировалось в автоматизацию управления приточной вентиляцией в качестве источника данных загрязнения воздуха. Ниже предоставлен график, на котором показана эффективность работы приточной вентиляции в автоматическом режиме.

Общая оценка качества воздуха, при работе проточной вентиляции в автоматическом режиме


Зеленым обозначен период работы вентиляции в автоматическом режиме.

Спасибо всем, кто дочитал до конца! Вы молодцы!

Файлы проекта:






Возможно, захочется почитать и это:


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


  1. sami777
    05.10.2023 09:02
    +1

    На самом деле здесь ничего сложного

    C этого надо было статью начинать.


  1. mlnw
    05.10.2023 09:02
    +2

    Всегда интересовало насколько адекватную информацию показывают подобные датчики. С одним лишь специализированным датчиком СО2 куча маеты с постоянной калибровкой и пр., а тут 4-в-1 за небольшую сумму.


    1. CyberexTech Автор
      05.10.2023 09:02
      +2

      На самом деле, датчик bme680 отличное решение для бытового применения. Я много датчиков перепробовал для своих проектов, но остановился на этом. Да, калибровка создаёт много проблем для обычного пользователя. Датчик bme680, интеллектуальный, он накапливает статистику замеров, тем самым повышая точность. Ещё есть возможность сохранения sensor state в памяти микроконтроллера, а затем, например, после отключения питания, можно загрузить sensor state обратно в датчик, что ускоряет выход датчика на нормальный режим. Ещё есть отличная штука у этого датчика, он может сообщать нам насколько он точен в данный момент, выводя значение от 0 до 4.


      1. mlnw
        05.10.2023 09:02

        Да, но тот же СО2, который он как бы меряет, его же надо периодически калибровать, вынося на свежий воздух с 400 ppm, иначе показатели уезжают, и прибор показывает, что всё хорошо, когда всё уже не хорошо (и никакая статистика замеров без этого не поможет). BME680 работает на иных физических принципах, чем обычные датчики CO2 (от SenseAir, Winsen etc)?


    1. Antra
      05.10.2023 09:02
      +1

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

      Сколько таких не перепробовал, что-то более-менее адекватное показывал MH-Z19B. Если калибровать периодически. Благо я тогда у леса жил. Проветрил хорошенько, он сам и настроился.

      Ну а реально если хочется уровень CO2 видеть, а не просто "качество воздуха ухудшилось", то Sensirion SCD30. Но он и раньше бюджетным не был, а сейчас и подавно.

      SensAir S8 вроде еще понравился в свое время (существенно дешевле, а показывал норм).


  1. SolarW
    05.10.2023 09:02

    1. Интересное ТЗ.

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

    1. Насчёт прошивки устройства.

      Указано что должно работать с Home Assistant. Так может тогда логично использовать ESPHome что заточен на работу с HA и поддерживает этот датчик?

      https://esphome.io/components/sensor/bme680.html


    1. CyberexTech Автор
      05.10.2023 09:02
      +2

      Указано что должно работать с Home Assistant. Так может тогда логично использовать ESPHome что заточен на работу с HA и поддерживает этот датчик?

      Устройство создавалось для универсального использования простым пользователем. ESPHome это хорошо, но это решение не для простого пользователя, это все равно что заставить пользователей смартфона писать самому себе приложения).

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


      1. SolarW
        05.10.2023 09:02

        Так вроде умеет все это ESPHome.

        https://esphome.io/components/display/addressable_light.html - работа с WS2812B

        Компонент Web отобразит значения с датчика на веб-страничке

        А captive portal поможет с первоначальной настройкой WiFi.

        С


        1. CyberexTech Автор
          05.10.2023 09:02
          +1

          Безусловно, ESPHome умеет, но как я уже писал ранее, данное решение "коробочное" для простого пользователя, а не продвинутого инженера).


          1. sav13
            05.10.2023 09:02
            -2

            Коробочное решение у Сяоми и К. Подключил к облаку и забыл. А здесь еще HA ставить и настраивать, MQTT брокер и прочие прелести - тот еще квест для простого пользователя


            1. Lunatikoff
              05.10.2023 09:02
              +1

              Есть что-то посоветовать готовое с соответствующими описываемому девайсу параметрами, посоветуйте, пожалуйста, чтобы не перерыватт гору инфомусора, в том числе от маркетологов?

              А у автора можно поинтересоваться о себестоимости изделия и примерной стоимости продажи , если изделие можно тиражировать? Заранее благодарю


              1. CyberexTech Автор
                05.10.2023 09:02

                Себестоимость $13, насчет тиражирования устройства - ничего не могу сказать.


          1. SolarW
            05.10.2023 09:02
            -1

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

            Я предлагал альтернативу подходу "берем Arduino IDE пишем и компилируем прошивку".

            Для тех у кого нет таких навыков (как у меня) и предложено использовать "конструкторы" по типу ESPHome или WiFI-IoT.

            Плюс ESPHome "нативная" прошивка для упомянутого в статье Home Assistant.


            1. CyberexTech Автор
              05.10.2023 09:02

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

              Да, так оно и есть.


          1. SolarW
            05.10.2023 09:02
            -1

            Почитал ещё раз статью.

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

            Т.е. для не умеющих в Arduino IDE (как я) - подразумевается что повторить проект без шансов.

            Предложение использовать ESPHome или аналогичный конструктор заиграло новыми красками :-)


  1. deseven
    05.10.2023 09:02
    +1

    Отлично, где купить готовое если у тебя руки из жопы или нет нужных навыков? :)


    1. SolarW
      05.10.2023 09:02

      1. deseven
        05.10.2023 09:02
        +2

        В 15 раз дороже и проприетарный протокол/приложение. Слишком большая наценка за руки из жопы :)


  1. HiMem-74
    05.10.2023 09:02

    После заголовка "устройство мониторинга качества среды" ожидал увидеть измеритель уровня формальдегида и соединений серы, тяжелых металлов и пыли в воздухе, в результате всего лишь СО2...
    PS: Челябинск.


    1. CyberexTech Автор
      05.10.2023 09:02
      +1

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


  1. Paskin
    05.10.2023 09:02

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

    Советую вам прочитать Datasheet на датчик и понять, для чего у него входы CS и SDO и что с ними делать в режиме I2C