Example Code for Arduino-Data Pooling
Last revision 2025/12/18
Burn the program to DFRuino Uno through Arduino IDE, open the serial port, we can see the printed sensor status, AQI level, TVOC and eCO2 concentration in sequence on the serial monitor.
Hardware Preparation
- Name: DFRduino UNO R3, Model/SKU: product-838, Quantity: 1, Purchase Link: DFRduino UNO R3
- Name: Gravity: NS160 Air Quality Sensor, Quantity: 1
- Name: Wires, Quantity: 1
Software Preparation
- Development tools: Arduino IDE
- Library: Download and install the ENS160 Library. (About how to install the library?)
Wiring Diagram

For other motherboards, connect to the corresponding SCL, SDA interface.
Other Preparation Work
- Please dial the I2C address on the module to 0x53 (example default address).
- The ambient temperature and humidity will affect the accuracy of the data, please fill in the current ambient temperature and humidity in the
setTempAndHum(/*temperature=*/temp, /*humidity=*/hum);function. - Sensor operating status:
| Status | Description |
|---|---|
| 0 | Operate normally |
| 1 | Preheat, the first 3 minutes when powered on(No more inital startup status for the sensor) |
| 2 | Initial startup, the first 1 hours when powered on(the sensor will no longer be in this state after 24 hours of continuous operation, if there is a power failure during this period, the sensor will still enter the initial startup state after power-on again) |
For more details, please refer to Chapter 10 in the Chip Manual.
Sample Code
/*!
* @file getMeasureData.ino
* @brief Get the sensor data by polling (use 3.3V main controller for Fermion version)
* @details Configure the sensor power mode and parameters (for compensating the calibrated temperature and relative humidity in gas measurement)
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
* @license The MIT License (MIT)
* @author [qsjhyy]([email protected])
* @version V1.0
* @date 2021-10-26
* @url https://github.com/DFRobot/DFRobot_ENS160
*/
#include <DFRobot_ENS160.h>
#define I2C_COMMUNICATION //I2C communication. Comment out this line of code if you want to use SPI communication.
#ifdef I2C_COMMUNICATION
/**
* For Fermion version, the default I2C address is 0x53, connect SDO pin to GND and I2C address will be 0x52
*/
DFRobot_ENS160_I2C ENS160(&Wire, /*I2CAddr*/ 0x53);
#else
/**
* Set up digital pin according to the on-board pin connected with SPI chip-select pin
* csPin Available Pins. For example: ESP32&ESP8266(D3), m0(6)
*/
uint8_t csPin = D3;
DFRobot_ENS160_SPI ENS160(&SPI, csPin);
#endif
void setup(void)
{
Serial.begin(115200);
// Init the sensor
while( NO_ERR != ENS160.begin() ){
Serial.println("Communication with device failed, please check connection");
delay(3000);
}
Serial.println("Begin ok!");
/**
* Set power mode
* mode Configurable power mode:
* ENS160_SLEEP_MODE: DEEP SLEEP mode (low power standby)
* ENS160_IDLE_MODE: IDLE mode (low-power)
* ENS160_STANDARD_MODE: STANDARD Gas Sensing Modes
*/
ENS160.setPWRMode(ENS160_STANDARD_MODE);
/**
* Users write ambient temperature and relative humidity into ENS160 for calibration and compensation of the measured gas data.
* ambientTemp Compensate the current ambient temperature, float type, unit: C
* relativeHumidity Compensate the current ambient temperature, float type, unit: %rH
*/
ENS160.setTempAndHum(/*temperature=*/25.0, /*humidity=*/50.0);
}
void loop()
{
/**
* Get the sensor operating status
* Return value: 0-Normal operation,
* 1-Warm-Up phase, first 3 minutes after power-on.
* 2-Initial Start-Up phase, first full hour of operation after initial power-on. Only once in the sensor’s lifetime.
* note: Note that the status will only be stored in the non-volatile memory after an initial 24h of continuous
* operation. If unpowered before conclusion of said period, the ENS160 will resume "Initial Start-up" mode
* after re-powering.
*/
uint8_t Status = ENS160.getENS160Status();
Serial.print("Sensor operating status : ");
Serial.println(Status);
/**
* Get the air quality index
* Return value: 1-Excellent, 2-Good, 3-Moderate, 4-Poor, 5-Unhealthy
*/
uint8_t AQI = ENS160.getAQI();
Serial.print("Air quality index : ");
Serial.println(AQI);
/**
* Get TVOC concentration
* Return value range: 0–65000, unit: ppb
*/
uint16_t TVOC = ENS160.getTVOC();
Serial.print("Concentration of total volatile organic compounds : ");
Serial.print(TVOC);
Serial.println(" ppb");
/**
* Get CO2 equivalent concentration calculated according to the detected data of VOCs and hydrogen (eCO2 – Equivalent CO2)
* Return value range: 400–65000, unit: ppm
* Five levels: Excellent(400 - 600), Good(600 - 800), Moderate(800 - 1000),
* Poor(1000 - 1500), Unhealthy(> 1500)
*/
uint16_t ECO2 = ENS160.getECO2();
Serial.print("Carbon dioxide equivalent concentration : ");
Serial.print(ECO2);
Serial.println(" ppm");
Serial.println();
delay(1000);
}
Result
Serial print eCO2, TVOC concentration, AQI level, and sensor operating status in real time.

Was this article helpful?
