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
- FireBeetle ESP8266 IOT Microcontroller x 1 (only this controller supports IAQ)
- DFRobot Gravity BME680 environmental sensor x1
- Gravity 4Pin Sensor wire (or Dupont wires) x1
Software Preparation
- Arduino IDE (V1.8.x), Click to Download Arduino IDE from Arduino® (for FireBeetle ESP8266, update the SDK to 2.3.1 or above. Refer to section 4.2 of the FireBeetle ESP8266 Wiki for the tutorial.)
- Download and install the BME680 Library. How to install the library?
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.

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

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

Additional Information
IAQ values require approximately 5 minutes of initialization before being ready.
Was this article helpful?
