
Привет, Хабр!
В одной из прошлых своих статей, пару лет назад, я уже описывал реализацию дешевого самодельного датчика качества воздуха на базе сенсора BME680. Но прошло время, многое изменилось, и теперь возникла потребность в подобном устройстве на новом месте. Недавно на одном маркетплейсе мне попалась комбинированная плата с датчиками ENS160+AHT21, которая подходит под мои задачи, а что в итоге получилось, читайте далее.
❯ Небольшое предисловие
Наверное, многие из ва�� понимают важность отслеживания состояния воздуха в современном мире. Ведь полученные данные могут быть использованы не только для оценки воздействия на здоровье человека, но и найдут применение в системах домашней автоматизации: например, для управления вентиляцией в доме или своевременного оповещения о негативных изменениях окружающей среды. Поэтому, полагаю, вопрос «А для чего это нужно?» отпадет сам собой.
❯ Аппаратная платформа
Так как мы придерживаемся принципа максимальной экономии, то будем использовать максимально дешевые и проверенные временем решения. Ранее я уже упомянул, что в качестве основного сенсора будем использовать комбинированную плату с датчиками ENS160+AHT21, а в качестве «мозгов» устройства будем использовать модуль ESP-02S на базе SoC ESP8285 — уж очень мне нравится с ним работать.
Ниже представлен внешний вид платы датчика.

И небольшая техническая информация модуля:
Параметр | Значение |
|---|---|
Напряжение питания | 3.3 В (совместим с 5 В системами) |
Интерфейс | I²C / SPI |
Диапазон измерения температур | –40°C … +85°C |
Диапазон измерения влажности | 5 … 95% RH |
Диапазон измерения газов | 0–65535 ppb |
Изменяемые параметры | eCO₂, TVOC, AQI, температура, влажность |
Время прогрева | < 1 мин |
Размеры модуля | 24 × 19 мм |
Итак, с основными компонентами устройства мы разобрались, поэтому, с вашего позволения, ниже представлена принципиальная схема нашего устройства:

Схема достаточно простая и не требует каких-либо пояснений, единственное, что хочется добавить, это интерфейс питания: у нас он реализован с помощью разъема USB Type-C.
❯ Корпус устройства
Одна из интересных вещей — это моделирование корпуса устройств, для меня это как успокоительное. Здесь моя фантазия просто разыгралась: мне хотелось сделать что-то красивое и практичное. И как всегда, разработка корпуса велась в открытой САПР FreeCAD, ниже представлен рендер модели корпуса:

Как можно видеть на изображении, расположение датчика организовано в отдельном модуле, чтобы минимизировать нагрев от микроконтроллера на датчик.
❯ Сборка датчика
Приступим к самому интересному — где наша задумка воплощается в реальность с нотками магии из детства, когда родители купили новый конструктор и тебе не терпится его собрать. Для начала распечатаем наш корпус. Благо деталей немного, и с моим 3D-принтером FlashForge 5M это занимает считанные минуты.

Далее припаиваем провода к USB-разъему, не забыв припаять перемычку на линию DATA.

Затем запрессовываем разъем в корпус, предварительно просунув провода в отверстие. И монтируем всю электронику в корпус.

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

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



На этом сборка устройства завершена и вы можете оценить его внешний вид во всей красе.
❯ Прошивка и интеграция в HomeAssistant
Микро ПО устройства разрабатывалось в среде Arduino IDE и базируется на собственной прошивке для IoT устройств. Для удобства я объединил библиотеки для сенсоров ENS160 и AHT21 в единую библиотеку, ниже представлен пример использования библиотеки:
Код для работы с датчиками
#include <ENS160_AHT2x.h> // Подключаем библиотеку сенсоров #include <Wire.h> // Для использования I2C // Пины подключения к датчику #define sda_pin 14 // SDA #define scl_pin 12 // SCL Sensor_ENS160 ENS160; // Инициализируем класс датчика качества воздуха AHT20 AHT21; // Инициализируем класс датчика температуры и влажности bool sens_stat_q, sens_stat_th; // Статусы инициализации датчиков int ensStatus(NAN), AQI(NAN), TVOC(NAN), ECO2(NAN); // Переменные для хранения данных датчиков float temp(NAN), hum(NAN); void setup() { Wire.begin(sda_pin, scl_pin); // Инициализация шины I2C for(int x = 0; x < 160; x ++){ // Цикл ожидания подключения датчика качества воздуха if (ENS160.begin()){ sens_stat_q = true; break; } delay(100); } for(int x = 0; x < 160; x ++){ // Цикл ожидания подключения датчика влажности и температуры if (AHT21.begin()){ sens_stat_th = true; break; } delay(100); } ENS160.setOperatingMode(SFE_ENS160_RESET); // Сбрасываем датчик ENS160.setOperatingMode(SFE_ENS160_STANDARD); // Установка стандартных параметров } void loop(){ // Чтение данных if(ENS160.checkDataStatus() && sens_stat_q){ AQI = ENS160.getAQI(); TVOC = ENS160.getTVOC(); ECO2 = ENS160.getECO2(); ensStatus = ENS160.getFlags(); } if(sens_stat_th){ temp = AHT21.getTemperature(); hum = AHT21.getHumidity();; } delay(1000); }
Первоначальная прошивка устройства выполняется с помощью USB-TTL адаптера, а дальнейшее обновление реализовано с помощью встроенной функции FOTA. Первоначальная настройка подключения к Wi-Fi сети выполняется с помощью технологии Captive Portal. Ниже показаны несколько скриншотов интерфейса устройства.

По умолчанию пароль доступа к устройству «admin», который позже можно изменить.

Здесь все по «классике»: отображаются измеряемые параметры датчика и некоторые настройки.

Интеграция в HomeAssistant
Для интеграции датчика в умный дом HomeAssistant используются протокол MQTT и механизм MQTT Discovery, благодаря которому интеграция устройства выполняется по принципу Plug&Play. Ниже представлены скриншоты из HomeAssistant.



❯ Итоги
В итоге у нас получился простой и бюджетный датчик качест��а воздуха для HomeAssistant, позволяющий автоматизировать работу вентиляции. И как всегда, все исходники проекта прикрепляю ниже.
На этом можно и завершить статью. Надеюсь, она была вам полезна! И большое спасибо за вашу финансовую поддержку, для меня это очень важно и мотивирует делиться своим опытом на Хабре. Если у вас возникли вопросы или есть чем поделиться, то добро пожаловать в комментарии! Всем интересных проектов и успехов!
Ссылки к статье:
Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале ↩

