В начале немного предыстории.
Однажды я был в гостях у своего товарища, который как и я, активно занимается домашней автоматизацией. Я увидел у него смонтированную систему приточной вентиляции и поинтересовался, как он реализовал автоматизацию этой системы. В ответ услышал, что он её включает вручную, так как у него нет устройства, которое анализирует качество воздуха, а готовые решения имеют зачастую слишком неоправданную цену для систем бытового применения. Недолго думая, я предложил ему своё решение, о котором далее и пойдет речь.
❯ Разработка
Уже на этапе разговора у меня в голове сложилась определенная концепция устройства, которая бы идеально вписывалась в существующую систему домашней автоматизации, и некоторые выдвинутые условия товарища (будем их называть ТЗ), уточнили некоторые моменты.
Некоторые моменты:
- Устройство должно иметь эстетичный вид и не выглядеть «колхозно».
- Устройство должно иметь веб интерфейс для конфигурации устройства.
- Устройство должно поддерживать протокол обмена MQTT и иметь возможность интеграции в Home Assistant.
- Разъем питания должен быть USB-C.
- Не стоить как крыло от Boeing.
❯ Разработка аппаратной части
На самом деле здесь ничего сложного. В качестве газового сенсора был выбран проверенный временем BME680 от небезызвестной компании Bosh.
Технические характеристики 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, который можно купить на известном китайском маркетплейсе килограммами за небольшую плату.
После всего вышесказанного у нас «вырисовывается» следующая принципиальная схема устройства.
Принципиальная схема устройства
Как можно видеть, схема достаточно проста и её можно собрать без применения печатной платы, но простой путь это не наш путь.
К счастью, у меня были в наличии изготовленные платы для другого проекта, которые успешно подошли и для этого. Результат сборки печатной платы можно видеть ниже.
Для цветовой индикации о качестве воздуха на устройстве применен адресный светодиод 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. Думаю, что здесь всё понятно и описание излишне.
❯ Интеграция с Home Assistant
Для интеграции нашего устройства в Home Assistant, как бы это странно не звучало, используется протокол MQTT.
Для интеграции в 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. Устройство отлично интегрировалось в автоматизацию управления приточной вентиляцией в качестве источника данных загрязнения воздуха. Ниже предоставлен график, на котором показана эффективность работы приточной вентиляции в автоматическом режиме.
Зеленым обозначен период работы вентиляции в автоматическом режиме.
Спасибо всем, кто дочитал до конца! Вы молодцы!
Файлы проекта:
Возможно, захочется почитать и это:
- ➤ Переделываем настенное зеркало во многофункциональное устройство
- ➤ Starting Electronics: руководство по веб-серверам на Arduino. HTML теги, CSS и JavaScript
- ➤ Электронная игра «лабиринт» на сервоприводах. Никаких arduino, только жесткая логика
- ➤ Lavritech L1: полная версия контроллера на платформе LavriBoard7
- ➤ Как создавалась System Shock
Комментарии (21)
mlnw
05.10.2023 09:02+2Всегда интересовало насколько адекватную информацию показывают подобные датчики. С одним лишь специализированным датчиком СО2 куча маеты с постоянной калибровкой и пр., а тут 4-в-1 за небольшую сумму.
CyberexTech Автор
05.10.2023 09:02+2На самом деле, датчик bme680 отличное решение для бытового применения. Я много датчиков перепробовал для своих проектов, но остановился на этом. Да, калибровка создаёт много проблем для обычного пользователя. Датчик bme680, интеллектуальный, он накапливает статистику замеров, тем самым повышая точность. Ещё есть возможность сохранения sensor state в памяти микроконтроллера, а затем, например, после отключения питания, можно загрузить sensor state обратно в датчик, что ускоряет выход датчика на нормальный режим. Ещё есть отличная штука у этого датчика, он может сообщать нам насколько он точен в данный момент, выводя значение от 0 до 4.
mlnw
05.10.2023 09:02Да, но тот же СО2, который он как бы меряет, его же надо периодически калибровать, вынося на свежий воздух с 400 ppm, иначе показатели уезжают, и прибор показывает, что всё хорошо, когда всё уже не хорошо (и никакая статистика замеров без этого не поможет). BME680 работает на иных физических принципах, чем обычные датчики CO2 (от SenseAir, Winsen etc)?
Antra
05.10.2023 09:02+1Да фигню они показывают. Такое впечатление, что CO2 просто вычисляется исходя из VOC. Можно просто пузырек хоть с раствором канифоли, хоть с чистым спиртом поднести, а он покажет, якобы CO2 зашкалил.
Сколько таких не перепробовал, что-то более-менее адекватное показывал MH-Z19B. Если калибровать периодически. Благо я тогда у леса жил. Проветрил хорошенько, он сам и настроился.
Ну а реально если хочется уровень CO2 видеть, а не просто "качество воздуха ухудшилось", то Sensirion SCD30. Но он и раньше бюджетным не был, а сейчас и подавно.
SensAir S8 вроде еще понравился в свое время (существенно дешевле, а показывал норм).
SolarW
05.10.2023 09:02Интересное ТЗ.
То, что устройство должно выглядеть "не колхозно" есть а что должно измерять - нету.
-
Насчёт прошивки устройства.
Указано что должно работать с Home Assistant. Так может тогда логично использовать ESPHome что заточен на работу с HA и поддерживает этот датчик?
CyberexTech Автор
05.10.2023 09:02+2Указано что должно работать с Home Assistant. Так может тогда логично использовать ESPHome что заточен на работу с HA и поддерживает этот датчик?
Устройство создавалось для универсального использования простым пользователем. ESPHome это хорошо, но это решение не для простого пользователя, это все равно что заставить пользователей смартфона писать самому себе приложения).
Да и устройство может быть самостоятельным, без подключения к системам умного дома, все данные в реальном времени отображаются на странице встроенного веб сервера, а светодиодный индикатор дает возможность визуально оценивать качество воздуха в помещении.
SolarW
05.10.2023 09:02Так вроде умеет все это ESPHome.
https://esphome.io/components/display/addressable_light.html - работа с WS2812B
Компонент Web отобразит значения с датчика на веб-страничке
А captive portal поможет с первоначальной настройкой WiFi.
С
CyberexTech Автор
05.10.2023 09:02+1Безусловно, ESPHome умеет, но как я уже писал ранее, данное решение "коробочное" для простого пользователя, а не продвинутого инженера).
sav13
05.10.2023 09:02-2Коробочное решение у Сяоми и К. Подключил к облаку и забыл. А здесь еще HA ставить и настраивать, MQTT брокер и прочие прелести - тот еще квест для простого пользователя
Lunatikoff
05.10.2023 09:02+1Есть что-то посоветовать готовое с соответствующими описываемому девайсу параметрами, посоветуйте, пожалуйста, чтобы не перерыватт гору инфомусора, в том числе от маркетологов?
А у автора можно поинтересоваться о себестоимости изделия и примерной стоимости продажи , если изделие можно тиражировать? Заранее благодарю
CyberexTech Автор
05.10.2023 09:02Себестоимость $13, насчет тиражирования устройства - ничего не могу сказать.
SolarW
05.10.2023 09:02-1Ну если подразумевалось взять готовый скомпилированный образ вашей прошивки - то да, можно сказать что решение "коробочное".
Я предлагал альтернативу подходу "берем Arduino IDE пишем и компилируем прошивку".
Для тех у кого нет таких навыков (как у меня) и предложено использовать "конструкторы" по типу ESPHome или WiFI-IoT.
Плюс ESPHome "нативная" прошивка для упомянутого в статье Home Assistant.
CyberexTech Автор
05.10.2023 09:02Ну если подразумевалось взять готовый скомпилированный образ вашей прошивки - то да, можно сказать что решение "коробочное".
Да, так оно и есть.
SolarW
05.10.2023 09:02-1Почитал ещё раз статью.
Описывать весь код прошивки в этой статье я не стану, там нет ничего необычного, прошивка написана с применением стандартных технологий, примеры которых вы найдете в среде разработки Arduino IDE.
Т.е. для не умеющих в Arduino IDE (как я) - подразумевается что повторить проект без шансов.
Предложение использовать ESPHome или аналогичный конструктор заиграло новыми красками :-)
deseven
05.10.2023 09:02+1Отлично, где купить готовое если у тебя руки из жопы или нет нужных навыков? :)
HiMem-74
05.10.2023 09:02После заголовка "устройство мониторинга качества среды" ожидал увидеть измеритель уровня формальдегида и соединений серы, тяжелых металлов и пыли в воздухе, в результате всего лишь СО2...
PS: Челябинск.CyberexTech Автор
05.10.2023 09:02+1Ожидаемый комментарий). Большинство, не понимая сути, хотят увидеть измерения лабораторного качества от обычного бытового датчика и за не большие деньги).
Paskin
05.10.2023 09:02этот метод не всегда работает c использованием модуля датчика, который применен в этой статье.
Советую вам прочитать Datasheet на датчик и понять, для чего у него входы CS и SDO и что с ними делать в режиме I2C
sami777
На самом деле здесь ничего сложного
C этого надо было статью начинать.