ENS160 цифровой мультигазовый датчик

Узнайте все о ENS160: технические характеристики, распиновка, схемы подключения, datasheet и примеры кода для ESP32, Arduino, Raspberry

Качество воздуха I2C

Обзор

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

Скачать datasheet

Распиновка ENS160

Датчик ENS160 имеет 8 пинов для I²C или SPI коммуникации.

Схема распиновки

ENS160 распиновка

Типы пинов

ТипКоличество
Питание2
Управление2

Описание пинов

ПинТипОписание
VINПитаниеВход питания (1.71V-1.98V VDD, 1.71V-3.6V VDDIO). Для большинства плат использовать 3.3V.
GNDПитаниеЗемля. Подключить к системной земле.
SDAI²CЛиния данных I²C. Подключить к GPIO 21 (ESP32). Требуется подтягивающий резистор 4.7kΩ.
SCLI²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

Таблица подключения

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 — двухканальный газовый датчик