В начале немного предыстории.
Однажды я был в гостях у своего товарища, который как и я, активно занимается домашней автоматизацией. Я увидел у него смонтированную систему приточной вентиляции и поинтересовался, как он реализовал автоматизацию этой системы. В ответ услышал, что он её включает вручную, так как у него нет устройства, которое анализирует качество воздуха, а готовые решения имеют зачастую слишком неоправданную цену для систем бытового применения. Недолго думая, я предложил ему своё решение, о котором далее и пойдет речь.
❯ Разработка
Уже на этапе разговора у меня в голове сложилась определенная концепция устройства, которая бы идеально вписывалась в существующую систему домашней автоматизации, и некоторые выдвинутые условия товарища (будем их называть ТЗ), уточнили некоторые моменты.
Некоторые моменты:
- Устройство должно иметь эстетичный вид и не выглядеть «колхозно».
- Устройство должно иметь веб интерфейс для конфигурации устройства.
- Устройство должно поддерживать протокол обмена 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. Устройство отлично интегрировалось в автоматизацию управления приточной вентиляцией в качестве источника данных загрязнения воздуха. Ниже предоставлен график, на котором показана эффективность работы приточной вентиляции в автоматическом режиме.
Зеленым обозначен период работы вентиляции в автоматическом режиме.
Спасибо всем, кто дочитал до конца! Вы молодцы!