Example Code for Arduino-Read Environmental Data With IAQ

Last revision 2025/12/17

Program Function: read data from BME680 sensor and serial printing(with IAQ).

Hardware Preparation

Software Preparation

Wiring Diagram

This product supports both IIC and SPI wiring connector. Please select suitable connector according to the wiring. Below is the connection diagram for your reference.
IIC wiring connector is recommended, since it is plug & play and easy to use.

IIC Connection Diagram

You must pay attention to the wiring order, VCC to Power Supply, GND to Ground.

IIC Connection Diagram

SPI Connection Diagram

You must pay attention to the wiring order, VCC to Power Supply, GND to Ground.

SPI Connection Diagram

Other Preparation Work

  • At present, only FireBeetle ESP8266 IOT Microcontroller can read IAQ, other controllers can not support.
  • For FireBeetle ESP8266 IOT Microcontroller,please use Arduino IDE 1.8.x. Then update the SDK to 2.3.1 or above. Refer to section 4.2 of the FireBeetle ESP8266 Wiki for the tutorial.
  • Calibration is needed to monitor altitude value exactly. So that please fill in the sample code with correct local altitude value:
seaLevel = bme.readSeaLevel (your correct local altitude value)

Sample Code

#include "DFRobot_BME680_I2C.h"
#include "Wire.h"

/*use an accurate altitude to calibrate sea level air pressure*/
#define CALIBRATE_PRESSURE

DFRobot_BME680_I2C bme(0x77);  //0x77 I2C address


float seaLevel;
void setup()
{
  uint8_t       rslt = 1;
  Serial.begin(115200);
  while(!Serial);
  delay(1000);
  Serial.println();
  while(rslt != 0) {
    rslt = bme.begin();
    if(rslt != 0) {
      Serial.println("bme begin faild");
      delay(2000);
    }
  }
  Serial.println("bme begin successful");
  bme.supportIAQ();
}

void loop()
{
  static uint8_t       firstCalibrate = 0;

  #ifdef CALIBRATE_PRESSURE
  if(firstCalibrate == 0) {
    if(bme.iaqUpdate() == 0) {
      /*You can use an accurate altitude to calibrate sea level air pressure.
       *And then use this calibrated sea level pressure as a reference to obtain the calibrated altitude.
       *In this case,525.0m is chendu accurate altitude.
       */
      seaLevel = bme.readSeaLevel(525.0);
      Serial.print("seaLevel :");
      Serial.println(seaLevel);
      firstCalibrate = 1;
    }
  }
  #else
    firstCalibrate = 1;
  #endif

  if(firstCalibrate) {
    uint8_t rslt = bme.iaqUpdate();
    if(rslt == 0) {
      Serial.println();
      Serial.print("time(ms) :");
      Serial.println(millis());
      Serial.print("temperature(C) :");
      Serial.println(bme.readTemperature(), 2);
      Serial.print("pressure(Pa) :");
      Serial.println(bme.readPressure());
      Serial.print("humidity(%rh) :");
      Serial.println(bme.readHumidity(), 2);
      Serial.print("altitude(m) :");
      Serial.println(bme.readAltitude());
#ifdef CALIBRATE_PRESSURE
      Serial.print("calibrated altitude(m) :");
      Serial.println(bme.readCalibratedAltitude(seaLevel));
#endif
      Serial.print("gas resistance :");
      Serial.println(bme.readGasResistance());
      if(bme.isIAQReady()) {
        Serial.print("IAQ :");
        float iaq = bme.readIAQ();
        Serial.print(iaq);
        if(iaq < 50) Serial.println(" good");
        else if(iaq < 100) Serial.println(" average");
        else if(iaq < 150) Serial.println(" little bad");
        else if(iaq < 200) Serial.println(" bad");
        else if(iaq < 300) Serial.println(" worse");
        else Serial.println(" very bad");
      } else Serial.println("IAQ not ready, please wait about 5 minutes");
    }
  }
}

Result

BME680_result_iaq.png

Additional Information

IAQ values require approximately 5 minutes of initialization before being ready.

Was this article helpful?

TOP