
Привет, Хабр!
В одной из прошлых своих статей, пару лет назад, я уже описывал реализацию дешевого самодельного датчика качества воздуха на базе сенсора 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-канале ↩

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

Javian
17.03.2026 12:21сенсоров ENS160
Похоже дома от него толку нет. Такие химические соединения скорее всего встретишь в мастерской или гараже.

itoolsy
17.03.2026 12:21А в чем смысл собирать что-либо для выявления CO2 на не ndir датчике? Это ж цифры из космоса

aitras
17.03.2026 12:21А зачем замкнуты D+ и D- у USB?

zatim
17.03.2026 12:21Это для слишком умных зарядок. Так они понимают что надо выдать 5 В, 1,5А.
Первый протокол быстрой зарядки, порт специально для зарядки, стихийно придуман в середине 2000-х, и в 2007 году[5] внедрён в стандарт USB 2.0. На конец 2010-х абсолютно все универсальные ЗУ и пауэрбанки, и подавляющее большинство гаджетов поддерживают этот режим, считая его базовым, а не быстрым.
На стороне ЗУ линии D+ и D− замкнуты накоротко. Гаджету доступны 5 В · 1,5 А = 7,5 Вт (в версии USB Battery Charging 1.2, 2010 год)[4][5].

aitras
17.03.2026 12:21На стороне ЗУ линии D+ и D− замкнуты накоротко
Вот именно, что на стороне зарядного устройства, а не девайса.
select26
Автор, у вас нет ни одного конденсатора в обвязке LDO!
Ну и по хорошему (по datasheet'у) нужно возле контроллера и датчика также добавить по емкости. Без этого о стабильно работе можно только надеяться.
peacemakerv
По-моему, там поверх платы датчика при
српаян электролитик...aitras
Датчик то ладно, там минимальная обвязка есть. Для самого стаба нужна емкость.
zatim
Контроллер и датчик - готовые модули, в их составе уже есть емкости. Видно по фото.
Mike-M
На фото — да. Но на принципиальной схеме блокировочных конденсаторов нет — сразу возникает вопрос. Поэтому было бы нелишним описать этот момент в статье.
CyberexTech Автор
На схеме обозначены модули, какой смысл еще и принципиальную схему модулей показывать?
Mike-M
Я не предлагал показывать принципиальную схему модулей. Я предлагал написать о блокировочных конденсаторах в тексте статьи.
SmartTherm
какая разница с конденсаторами или без конденсаторов измерять неведомую фигню?
CyberexTech Автор
Очень громкое заявление!