Обзор
ENS160 — это цифровой MOX-газовый датчик, оптимизированный для мониторинга качества воздуха в помещении. Он обеспечивает точные измерения уровней TVOC и eCO₂, а также индексов качества воздуха (AQI), что делает его идеальным для систем вентиляции, умного дома и очистителей воздуха. Датчик поддерживает интерфейсы I²C и SPI.
Быстрая навигация
Характеристики Распиновка Подключение Отладка
Примеры кода
Приобретите ENS160 цифровой мультигазовый датчик
Технические характеристики
| Параметр | Значение |
|---|---|
| Параметры измерения | TVOC, eCO₂, AQI |
| Напряжение питания | 1.71V - 1.98V (VDD), 1.71V - 3.6V (VDDIO) |
| Интерфейс | I²C, SPI |
| Рабочая температура | -40°C - 85°C |
| Рабочая влажность | 5% - 95% RH (без конденсации) |
| Размеры | 3 x 3 x 0.9 mm LGA |
Распиновка ENS160
Датчик ENS160 имеет 8 пинов для I²C или SPI коммуникации.
Схема распиновки

Типы пинов
| Тип | Количество |
|---|---|
| Питание | 2 |
| Управление | 2 |
Описание пинов
| Пин | Тип | Описание |
|---|---|---|
| VIN | Питание | Вход питания (1.71V-1.98V VDD, 1.71V-3.6V VDDIO). Для большинства плат использовать 3.3V. |
| GND | Питание | Земля. Подключить к системной земле. |
| SDA | I²C | Линия данных I²C. Подключить к GPIO 21 (ESP32). Требуется подтягивающий резистор 4.7kΩ. |
| SCL | I²C | Линия тактирования I²C. Подключить к GPIO 22 (ESP32). Требуется подтягивающий резистор 4.7kΩ. |
| INT | Прерывание | Пин прерывания (опционально). Активный LOW. |
| WAKE | Управление | Пин пробуждения. Подтянуть к VCC для нормальной работы. |
| ADDR | Адрес | Выбор I²C адреса. GND = 0x52, VCC = 0x53. |
| CS | Управление | Выбор кристалла для SPI режима. Для I²C подключить к GND. |
Подключение ENS160 к ESP32
Для подключения ENS160 к ESP32 используется интерфейс I²C.
Схема подключения

Таблица подключения
| ENS160 Пин | Подключение | ESP32 Пин | Описание |
|---|---|---|---|
| VIN | Обязательно | 3.3V | Питание 3.3V |
| GND | Обязательно | GND | Земля |
| SDA | Обязательно | GPIO 21 | Линия данных I²C |
| SCL | Обязательно | GPIO 22 | Линия тактирования I²C |
| CS | Обязательно | GND | Выбор режима I²C |
| WAKE | Обязательно | VIN (3.3V) | Пробуждение (HIGH для работы) |
| ADDR | Обязательно | GND или VIN | Выбор адреса (0x52 или 0x53) |
| INT | Опционально | GPIO (любой) | Прерывание |
Важно: требуются подтягивающие резисторы 4.7kΩ на линиях SDA и SCL. Рекомендуется добавить конденсатор 100nF на питание.
Отладка
💻 Ошибка компиляции: 'TwoWire::begin(uint8_t&, uint8_t&)'
Проблема: Ошибка компиляции: no matching function for call to 'TwoWire::begin(uint8_t&, uint8_t&)'
Причина: Библиотека пытается вызвать нестандартную функцию Wire.begin() с двумя аргументами.
Решение: Измените код библиотеки: в файле ScioSense_ENS160.cpp найдите функцию _i2c_init() и замените содержимое на Wire.begin();
❌ Показания ENS160 недоступны в ESPHome
Проблема: Датчик периодически сообщает о недоступности: ENS160 readings unavailable - Normal Operation but readings not ready
Причина: Нестабильное питание, особенно при использовании с AHT21.
Решение: Добавьте дополнительный конденсатор на линии питания датчика для стабилизации напряжения.
⚠️ ENS160 не инициализируется при включенном WiFi на ESP32
Проблема: При использовании ENS160 с ESP32 включение WiFi приводит к нулевым показаниям.
Причина: Конфликт ресурсов или проблемы синхронизации между модулем WiFi и I²C.
Решение: Проверьте конфликты между WiFi и I²C на ESP32. Попробуйте уменьшить скорость I²C. Отключите WiFi для тестирования.
❌ ENS160 не определяется на шине I2C
Проблема: Датчик не распознаётся на шине I2C.
Причина: Неправильный I²C адрес или неправильное подключение.
Решение: Проверьте адрес (0x52 или 0x53). Убедитесь, что пин ADDR правильно подключён. Проверьте все соединения.
Примеры кода
Arduino
#include <Wire.h>
#include "ScioSense_ENS160.h"
ScioSense_ENS160 ens160(ENS160_I2CADDR_1); // I²C адрес 0x53
void setup() {
Serial.begin(115200);
Wire.begin();
if (!ens160.begin()) {
Serial.println("Failed to initialize ENS160 sensor!");
while (1);
}
}
void loop() {
ens160.readData();
Serial.print("eCO2: ");
Serial.print(ens160.geteCO2());
Serial.print(" ppm, TVOC: ");
Serial.print(ens160.getTVOC());
Serial.print(" ppb, AQI: ");
Serial.println(ens160.getAQI());
delay(1000);
}
ESP-IDF
#include <stdio.h>
#include "driver/i2c.h"
#include "ens160.h"
#define I2C_MASTER_SCL_IO 22
#define I2C_MASTER_SDA_IO 21
#define I2C_MASTER_NUM I2C_NUM_0
#define I2C_MASTER_FREQ_HZ 100000
void app_main(void) {
i2c_config_t i2c_config = {
.mode = I2C_MODE_MASTER,
.sda_io_num = I2C_MASTER_SDA_IO,
.scl_io_num = I2C_MASTER_SCL_IO,
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = I2C_MASTER_FREQ_HZ
};
i2c_param_config(I2C_MASTER_NUM, &i2c_config);
i2c_driver_install(I2C_MASTER_NUM, I2C_MODE_MASTER, 0, 0, 0);
ens160_t sensor;
ens160_init(&sensor, I2C_MASTER_NUM, ENS160_I2C_ADDRESS_1);
printf("Initializing ENS160\n");
if (ens160_start(&sensor) != ENS160_OK) {
printf("Failed to start ENS160 sensor\n");
return;
}
while (1) {
uint16_t eco2, tvoc;
uint8_t aqi;
if (ens160_read_data(&sensor, &eco2, &tvoc, &aqi) == ENS160_OK) {
printf("eCO2: %d ppm, TVOC: %d ppb, AQI: %d\n", eco2, tvoc, aqi);
} else {
printf("Error reading data from ENS160\n");
}
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
ESPHome
i2c:
sda: GPIO21
scl: GPIO22
sensor:
- platform: ens160
eco2:
name: "eCO2"
tvoc:
name: "TVOC"
aqi:
name: "Air Quality Index"
address: 0x53
update_interval: 1s
PlatformIO
platformio.ini:
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
main.cpp:
#include <Wire.h>
#include "ScioSense_ENS160.h"
ScioSense_ENS160 ens160(ENS160_I2CADDR_1); // I²C адрес 0x53
void setup() {
Serial.begin(115200);
Wire.begin(21, 22); // SDA: GPIO21, SCL: GPIO22
if (!ens160.begin()) {
Serial.println("Failed to initialize ENS160 sensor!");
while (1);
}
}
void loop() {
ens160.readData();
Serial.print("eCO2: ");
Serial.print(ens160.geteCO2());
Serial.print(" ppm, TVOC: ");
Serial.print(ens160.getTVOC());
Serial.print(" ppb, AQI: ");
Serial.println(ens160.getAQI());
delay(1000);
}
MicroPython
from machine import I2C, Pin
import time
# I2C адрес ENS160
ENS160_ADDR = 0x53
# Регистры
DATA_ECO2 = 0x22
DATA_TVOC = 0x24
DATA_AQI = 0x26
# Инициализация I2C
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
# Функция чтения 16-бит регистра
def read_register(addr, reg):
data = i2c.readfrom_mem(addr, reg, 2)
return (data[0] << 8) | data[1]
while True:
eco2 = read_register(ENS160_ADDR, DATA_ECO2)
tvoc = read_register(ENS160_ADDR, DATA_TVOC)
aqi = i2c.readfrom_mem(ENS160_ADDR, DATA_AQI, 1)[0]
print(f"eCO2: {eco2} ppm, TVOC: {tvoc} ppb, AQI: {aqi}")
time.sleep(1)
Итоги
ENS160 — это высокоточный мультигазовый датчик с поддержкой множества платформ разработки: Arduino, ESP-IDF, ESPHome, PlatformIO и MicroPython.
Рекомендации
- Дайте датчику прогреться минимум 10-15 минут при первом использовании
- Используйте стабильный источник питания 3.3V
- Добавьте подтягивающие резисторы 4.7kΩ на линиях SDA и SCL
- Рекомендуется добавить конденсатор 100nF на питание рядом с датчиком
- Комбинируйте с датчиком влажности (AHT21/SHT) для компенсации
Похожие датчики
- CCS811 — цифровой газовый датчик
- GP2Y1010AU0F — оптический датчик пыли
- MiCS-4514 — двухканальный газовый датчик
Arduino
ESP-IDF
ESPHome
PlatformIO
MicroPython