

The ENS160 is a digital air quality sensor manufactured by PiicoDev, designed to measure various air quality parameters such as volatile organic compounds (VOCs), carbon dioxide (CO2), and total volatile organic compounds (TVOCs). This sensor provides real-time data, making it ideal for monitoring indoor air quality in applications like smart homes, HVAC systems, air purifiers, and IoT devices.
The ENS160 leverages advanced metal oxide (MOX) technology and integrates a microcontroller for on-chip processing, enabling accurate and reliable air quality measurements. Its compact design and I²C/SPI communication interfaces make it easy to integrate into a wide range of projects.








Below are the key technical details of the ENS160 air quality sensor:
| Parameter | Value |
|---|---|
| Manufacturer | PiicoDev |
| Part ID | ENS160 |
| Measurement Parameters | VOCs, CO2, TVOCs |
| Operating Voltage | 1.8V to 3.6V |
| Communication Interfaces | I²C, SPI |
| Operating Temperature Range | -40°C to +85°C |
| Power Consumption | 1.1 mA (typical) |
| Package Type | LGA |
The ENS160 sensor has the following pin configuration:
| Pin Name | Pin Number | Description |
|---|---|---|
| VDD | 1 | Power supply input (1.8V to 3.6V) |
| GND | 2 | Ground |
| SDA | 3 | I²C data line |
| SCL | 4 | I²C clock line |
| CS | 5 | Chip select for SPI (active low) |
| SDO | 6 | SPI data output |
| SDI | 7 | SPI data input |
| INT | 8 | Interrupt output (optional, configurable) |
| RST | 9 | Reset pin (active low, optional) |
0x53. Ensure no address conflicts if multiple devices are on the same bus.Below is an example of how to interface the ENS160 with an Arduino UNO using the I²C protocol:
#include <Wire.h> // Include the Wire library for I²C communication
#define ENS160_I2C_ADDRESS 0x53 // Default I²C address of the ENS160
void setup() {
Wire.begin(); // Initialize I²C communication
Serial.begin(9600); // Start serial communication for debugging
// Initialize the ENS160
Wire.beginTransmission(ENS160_I2C_ADDRESS);
Wire.write(0x10); // Example: Write to a configuration register
Wire.write(0x01); // Example: Set the sensor to active mode
if (Wire.endTransmission() == 0) {
Serial.println("ENS160 initialized successfully.");
} else {
Serial.println("Failed to initialize ENS160.");
}
}
void loop() {
// Request air quality data from the ENS160
Wire.beginTransmission(ENS160_I2C_ADDRESS);
Wire.write(0x02); // Example: Register address for air quality data
Wire.endTransmission();
Wire.requestFrom(ENS160_I2C_ADDRESS, 2); // Request 2 bytes of data
if (Wire.available() == 2) {
uint8_t highByte = Wire.read(); // Read high byte
uint8_t lowByte = Wire.read(); // Read low byte
int airQuality = (highByte << 8) | lowByte; // Combine bytes into a 16-bit value
Serial.print("Air Quality Index: ");
Serial.println(airQuality);
}
delay(1000); // Wait 1 second before the next reading
}
Sensor Not Responding
0x53) is used.Inaccurate Readings
Communication Errors
High Power Consumption
Can the ENS160 measure CO2 directly?
What is the typical response time of the ENS160?
Is the ENS160 suitable for outdoor use?
Can I use the ENS160 with a 5V microcontroller?