Project #15: Environment – ENS160 Air Quality Sensor – Mk46

——

#DonLucElectronics #DonLuc #ENS160 #BME280 #Environment #FireBeetle2ESP32C6 #ESP32 #Display #IoT #Project #Fritzing #Programming #Electronics #Microcontrollers #Consultant

——

ENS160 Air Quality Sensor

——

ENS160 Air Quality Sensor

——

ENS160 Air Quality Sensor

——

ENS160 Air Quality Sensor

This Gravity: ENS160 Air Quality Sensor, based on ScioSense’s new ENS160 sensor chip, is specifically designed for indoor air quality monitoring and offers detection of multiple IAQ data (TVOC, eCO2, AQI). The innovative TrueVOC™ technology combines the metal oxide (MOX) technology that brings this sensor superior accuracy, fast response, anti-interference, etc. With intelligent on-chip algorithms, the ENS160 can directly output rich and easy-to-understand environmental data. Preheat the sensor 3 minutes before use then you can obtain accurate data more quickly. What’s more, the built-in automatic baseline correction algorithm ensures the long-term stability of the sensor.

DL2608Mk03

1 x FireBeetle 2 ESP32-C6
1 x Fermion: 2.0″ 320×240 IPS TFT LCD
1 x GDL Line 10 CM
1 x Fermion: ENS160+BME280 Environmental Sensor
1 x Lithium Ion Battery – 1000mAh
1 x USB 3.0 to Type-C Cable

DL2608Mk03p

DL2608Mk03p.ino

/****** Don Luc Electronics © ******
Software Version Information
Project #15: Environment – ENS160 Air Quality Sensor – Mk46
15-46
DL2608Mk03p.ino
DL2608Mk03
1 x FireBeetle 2 ESP32-C6
1 x Fermion: 2.0" 320x240 IPS TFT LCD
1 x GDL Line 10 CM
1 x Fermion: ENS160+BME280 Environmental Sensor
1 x Lithium Ion Battery - 1000mAh
1 x USB 3.0 to Type-C Cable
*/

// Include the Library Code
// DFRobot Display GDL API
#include <DFRobot_GDL.h>
// BME280 Environmental
#include <DFRobot_BME280.h>
// ENS160 Air Quality Sensor
#include <DFRobot_ENS160.h>

// ENS160 Air Quality Sensor
// I2C communication.
#define I2C_COMMUNICATION  
// I2C address is 0x53
DFRobot_ENS160_I2C ENS160(&Wire, 0x53);
// Status
uint8_t Status;
// AQI
uint8_t AQI;
// TVOC
uint16_t TVOC;
// ECO2
uint16_t ECO2;

// BME280 Environmental
typedef DFRobot_BME280_IIC BME;
// Wire
BME   bme(&Wire, 0x76);
// Sea Level Pressure
#define SEA_LEVEL_PRESSURE 1015.0f
// Temperature
float   temp = bme.getTemperature();
// Pressure
uint32_t    press = bme.getPressure();
// Altitude
float alti;
// Humidity
float humi;

// Defined ESP32
#define TFT_DC  D2
#define TFT_CS  D6
#define TFT_RST D3

/*dc=*/ /*cs=*/ /*rst=*/
// DFRobot Display 240x320
DFRobot_ST7789_240x320_HW_SPI screen(TFT_DC, TFT_CS, TFT_RST);

// Software Version Information
String sver = "15-46";

void loop() {
  
  // isBME280
  isBME280();
  
  // isENS160
  isENS160();
  
  // isDisplay ENS160
  isDisplayENS160();

  // Delay 1 Second
  delay( 1000 );
  
}

getBME280.ino

// BME280 Environmental
// isBME280
void isBME280(){

  // Temperature
  temp = bme.getTemperature();
  // Pressure
  press = bme.getPressure();
  // Altitude
  alti = bme.calAltitude(SEA_LEVEL_PRESSURE, press);
  // Humidity
  humi = bme.getHumidity();

}

getDisplay.ino

// DFRobot Display 240x320
// DFRobot Display 240x320 - UID
void isDisplayUID(){

  // DFRobot Display 240x320
  // Text Display
  // Text Wrap
  screen.setTextWrap(false);
  // Rotation
  screen.setRotation(3);
  // Fill Screen => black
  screen.fillScreen(0x0000);
  // Text Color => white
  screen.setTextColor(0xffff);
  // Font => Free Mono 9pt
  screen.setFont(&FreeMono9pt7b);
  // TextSize => 1.5
  screen.setTextSize(1.5);
  // Don Luc Electronics
  screen.setCursor(0, 30);
  screen.println("Don Luc Electronics");
  // BME280 Environmental
  screen.setCursor(0, 60);
  screen.println("ENS160 Air Quality Sensor");
  // Version
  screen.setCursor(0, 90);
  screen.println("Version");
  screen.setCursor(0, 120);
  screen.println( sver );

}
// isDisplay ENS160
void isDisplayENS160(){

  // DFRobot Display 240x320
  // Text Display
  // Text Wrap
  screen.setTextWrap(false);
  // Rotation
  screen.setRotation(3);
  // Fill Screen => black
  screen.fillScreen(0x0000);
  // Text Color => white
  screen.setTextColor(0xffff);
  // Font => Free Mono 9pt
  screen.setFont(&FreeMono9pt7b);
  // TextSize => 1.5
  screen.setTextSize(1.5);
  // ENS160 Air Quality Sensor
  screen.setCursor(0, 30);
  screen.println("ENS160 Air Quality Sensor");
  // AQI
  screen.setCursor(0, 60);
  screen.print("AQI : ");
  screen.setCursor(70, 60);
  screen.println( AQI );
  // TVOC
  screen.setCursor(0, 90);
  screen.print("TVOC: ");
  screen.setCursor(70, 90);
  screen.print( TVOC );
  screen.setCursor(150, 90);
  screen.println( "ppb" );
  // ECO2
  screen.setCursor(0, 120);
  screen.print("ECO2: ");
  screen.setCursor(70, 120);
  screen.print( ECO2 );
  screen.setCursor(150, 120);
  screen.println( "ppb" );
  // Temperature
  screen.setCursor(0, 150);
  screen.print("Temp: ");
  screen.setCursor(70, 150);
  screen.print( temp );
  screen.setCursor(150, 150);
  screen.println( "C" );
  // Humidity
  screen.setCursor(0, 180);
  screen.print("Humi: ");
  screen.setCursor(70, 180);
  screen.print( humi );
  screen.setCursor(150, 180);
  screen.println( "%" );

}

getENS160.ino

// ENS160 Air Quality Sensor
// isENS160
void isENS160(){

  // Status - Return value: 0-Normal operation 1-Warm-Up phase 
  // 2-Initial Start-Up phase
  Status = ENS160.getENS160Status();

  // AQI - Return value: 1-Excellent, 2-Good, 3-Moderate, 4-Poor, 5-Unhealthy
  AQI = ENS160.getAQI();

  // TVOC - Return value range: 0–65000, unit: ppb
  TVOC = ENS160.getTVOC();

  // ECO2 = Return value range: 400–65000, unit: ppm
  // Five levels: Excellent(400 - 600), Good(600 - 800), Moderate(800 - 1000), 
  // Poor(1000 - 1500), Unhealthy(> 1500)
  ECO2 = ENS160.getECO2();

}

setup.ino

// Setup
void setup()
{
 
  // Delay
  delay(100);

  // DFRobot Display 128x160
  screen.begin();

  // Delay
  delay( 100 );

  // BME280 Environmental
  bme.begin();

  // Delay
  delay( 100 );

  // ENS160 Air Quality Sensor
  ENS160.begin();
  /**
   * 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 humidity, float type, unit: %rH
   * Temperature
   * Humidity=
   */
  ENS160.setTempAndHum(temp, humi);

  // Delay
  delay( 100 );

  // DFRobot Display 240x320 - UID
  // Don Luc Electronics
  // Versioc
  isDisplayUID();
  
  // Delay
  delay( 5000 );

}

——

People can contact us: https://www.donluc.com/?page_id=1927

Consultant, R&D, Electronics, IoT, Teacher and Instructor

  • Programming Language
  • Single-Board Microcontrollers (PIC, Arduino, Raspberry Pi, Arm, Silicon Labs, Espressif, Etc…)
  • IoT
  • Wireless (Radio Frequency, Bluetooth, WiFi, Etc…)
  • Robotics
  • Automation
  • Camera and Video Capture Receiver Stationary, Wheel/Tank , Underwater and UAV Vehicle
  • Unmanned Vehicles Terrestrial, Marine and UAV
  • Machine Learning
  • Artificial Intelligence (AI)
  • RTOS
  • Sensors, eHealth Sensors, Biosensor, and Biometric
  • Research & Development (R & D)
  • Consulting

Follow Us

Luc Paquin – Curriculum Vitae – 2026
https://www.donluc.com/luc/LucPaquinCVEng2026Mk01.pdf
https://www.donluc.com/luc/

Web: https://www.donluc.com/
Web: https://www.jlpconsultants.com/
Facebook: https://www.facebook.com/neosteam.labs.9/
YouTube: https://www.youtube.com/@thesass2063
DFRobot: https://learn.dfrobot.com/user-10186.html
TikTok: https://www.tiktok.com/@luc.paquin8
Hackster: https://www.hackster.io/luc-paquin
LinkedIn: https://www.linkedin.com/in/jlucpaquin/

Don Luc

Leave a Comment