IoT Based Indoor Air Quality Monitoring Using BME680 & ESP8266
BME680 Indoor Air Quality Monitoring Using ESP8266
- Overview: Indoor Air Quality Monitoring using BME680
- Components Required
- Circuit Diagram: IoT & BME680 Indoor Air Quality Monitoring System
- Blynk App configuration for BME680 IAQ Monitoring
- Preparing Arduino IDE For BME680
- Program Code Explanation
- Demonstration: IoT Based Indoor Air Quality Monitoring Using BME680 & ESP8266
- Video Tutorial & Guide
- Wrapping Up
Overview: Indoor Air Quality Monitoring using BME680
Today, in this session, we are going to build IoT Based Indoor Air Quality Monitoring Using BME680 & ESP8266. The BME680 is an environmental Digital Sensor that measures Gas (VOC) & IAQ, Pressure, Humidity, Temperature, Altitude, and using some mathematical calculations we can derive the Dew point. In this guide, you will learn to interfere BME680 sensor with the ESP8266 NodeMCU development board and program using Arduino IDE to monitor its parameters on the Blynk Application. This BME680 environmental sensor can communicate with microcontrollers using both I2C or SPI communication protocols.
By the end of this tutorial, you will be able to interface the BME680 sensor with the ESP8266 board, install the required libraries, and program the ESP8266 development board. Furthermore, we will design a blynk app dashboard to remotely monitor the BME680 sensor data from anywhere in the world using smartphones.
Components Required
These are the components required for making BME680 Indoor Air Quality Monitoring System using ESP8266.
S.N | Components Name | Quantity | |
---|---|---|---|
1 | NodeMCU ESP8266 12E Board | 1 | https://amzn.to/3mTuL95 |
2 | BME680 Environmental Sensor | 1 | https://amzn.to/2R7LhXZ |
3 | Jumper Wires | 4 | https://amzn.to/3vw9ZAt |
4 | Breadboard | 1 | https://amzn.to/2NP2UKL |
You can get all the parts for your projects at the best price on Amazon.
Introduction to BME680 Environmental Sensor
The BME680 is an Environmental sensor that has the capabilities to measure gas (VOCs), pressure, humidity, temperature, and even altitude. The gas sensor on BME680 can detect a wide range of gases, such as volatile organic compounds (VOCs). So the BME680 sensor can be used to control the indoor quality of air.
BME680 Sensor Measures
As I already mentioned above, The BME680 is a five in one Environmental digital sensor that measures:
- Gas: Volatile Organic Compounds (VOC) like ethanol and carbon monoxide
- Temperature
- Humidity
- Barometric pressure &
- Altitude
Accuracy of BME680 Sensor
The following table shows the Accuracy and operation range of the temperature, humidity, pressure, altitude, and gas sensors of the BME680 Environmental Sensor:
Sensor | Accuracy | Operation Range |
Temperature | +/- 1.0ºC | -40 to 85 ºC |
Humidity | +/- 3% | 0 to 100 % |
Pressure | +/- 1 hPa | 300 to 1100 hPa |
Altitude | +/- 1 M | 0 – 30,000ft |
The Gas Sensor used on BME680
For this IoT Based Indoor Air Quality Monitoring Project. We have used the BME680 sensor. That includes a MOX (metal-oxide) sensor that detects VOCs in the air.
The MOX sensor is made up of a sensitive layer of the metal-oxide surface. It detects VOCs by absorbing oxygen molecules in its sensitive layer.
Basically, when the sensor is exposed to low gases, oxygen molecules react and increase conductivity across the surface. BME680 sensor provides resistance values as a raw signal. These values changes because of differences in VOC concentrations:
- Low resistance means A high concentration of VOCs
- High resistance means Low concentration of VOCs
BME680 sensor Pinout
The following table is the BME680 sensor Pinout table:
VCC | Powers the sensor |
GND | Ground Pin |
SCL | SCL pin for I2C communication SCK pin for SPI communication |
SDA | SDA pin for I2C communication SDI (MOSI) pin for SPI communication |
SDO | SDO (MISO) pin for SPI communication |
CS | Chip select pin for SPI communication |
Circuit Diagram: IoT & BME680 Indoor Air Quality Monitoring System
The BME680 Environmental Sensor can communicate using I2C or SPI communication protocols. So, In this IoT Based Indoor Air Quality Monitoring Using BME680 & ESP8266 Project. we will learn the wiring for both I2C and SPI communication protocol.
Following is the schematic diagram to wire the BME680 to the ESP8266 NodeMCU using the default I2C pins.
ESP8266 with BME680 using I2C
BME680 | ESP8266 NodeMCU |
SCL | GPIO 05 (D1) |
SDA | GPIO 04 (D2) |
VCC | 3.3V |
GND | GND |
ESP8266 with BME680 using SPI
Alternatively, you can use the SPI communication protocol instead. In that case, the following connection table will help you to wire the BME680 to the ESP8266 using the default SPI pins.
BME680 | ESP8266 NodeMCU |
VCC | 3.3V |
GND | GND |
SCL (SCK SPI Clock) | GPIO 05 |
SDA (SDI MOSI) | GPIO 04 |
SDO (MISO) | GPIO 12 |
CS (Chip Select) | GPIO 15 |
I have assembled the circuit on breadboard but you can order a custom PCB from PCBWay.com
This tutorial is sponsored by the PCBWay Company. PCBWay is quite professional in the field of PCB manufacturing. you can try their services at extremely low prices. Only $5 for 10 PCBs and $30 in total for 20 PCBs assembly. besides this, the new members also get a $5 signup bonus. That means the new users can order 10 PCBs for free.
Blynk App configuration for BME680 IAQ Monitoring
I have done many projects related to IoT with the Blynk application and designed many apps before. In this session, I am designing IoT based Indoor Air Quality Monitoring App. So, Make sure you download and install the Blynk app from Playstore/Appstore.
- First of all, open the blynk application.
- Click on the create a new project and enter the project name as “Indoor Air Quality“. Instead, you can type any name. You can change the name later.
- Click on Choice Tools and select NodeMCU ESP8266.
- Make sure the connection type is set to WIFI.
- Finally, click on the create button, a verification token will be sent to your email ID, which will be used in the Program CODE.
- Click + icon on the screen and search for the Gauge widget add 3 of them and search for the value display Widget. Add 3 of them to your Blynk App dashboard. Lastly, add a text display widget and configure them as shown in the image below. Now the application for IoT Indoor Air Quality Monitoring is ready to use.
Preparing Arduino IDE For BME680
Actually, We’ll program the ESP8266 board using Arduino IDE. So, make sure you have the ESP8266 add-on installed.
Basically, to compile this program we also need to install the Adafruit BME680 library and the Adafruit Unified Sensor library.
Installing the BME680 Library
To get readings from the BME680 Environmental sensor module we’ll use the Adafruit_BME680 library. Actually, following are steps to install the library in your Arduino IDE:
Open your Arduino IDE and go to Sketch > Include Library > and Manage Libraries. Now the Library Manager should open. Here, search for “adafruit bme680 ” on the Search box and click on install to install the library.
Installing the Adafruit_Sensor Library
Actually, to use the BME680 library, we also need to install the Adafruit_Sensor library. Follow the same steps mentioned above to install the library in your Arduino IDE:
Go to Sketch > Include Library > Manage Libraries and then type “Adafruit Unified Sensor” in the search box. Scroll all the way down to find the library. Now, you click on the install button and install it.
Note: After installing the libraries, restart your Arduino IDE.
Program Code Explanation
Firstly, the code starts by including the required libraries: Wire.h Library to use the I2C communication protocol. SPI.h Library to use SPI communication protocol instead of I2C. Secondly, Adafruit_Sensor and Adafruit_BME680 libraries to read data from BME680 sensors. Similarly, BlynkSimpleEsp8266.h to communicate between NodeMCU ESP8266 and Blynk IoT Cloud.
Install BlynkSimpleEsp8266.h library from here: Installing BlynkSimpleEsp8266.h library on Arduino IDE
#include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> #include <Wire.h> #include <Adafruit_Sensor.h> #include "Adafruit_BME680.h"
Initialize the BME680 sensor.
Adafruit_BME680 bme;
Define the different variables for storing sensor data like temperature, humidity, pressure, altitude, dewpoint, & gas.
float Temperature; float Humidity; float Pressure; float Gas; float Altitude; float DewPont;
Replace the following field with your Blynk Authentication token and Wi-Fi Network credentials
char auth[] = " xxx-xxxx-xxx"; char ssid[] = "xxx-xxxx-xxx"; char pass[] = "xxx-xxxx-xxx";
Connect to Blynk cloud then Initialize the BME680 Environmental sensor.
Blynk.begin(auth, ssid, pass); bme.begin(0x76);
In the void BME680(), we’ll get readings from the BME680 sensor. First, tell the sensor to start reading data and store them on variables. Do some calculations and send those reading to Blynk IoT Cloud through virtual pin as defined.
Finally, After adding the following code, we can get the readings as follows:
- bme.readTemperature: provides a temperature reading
- bme.readPressure: provides a pressure reading
- bme.readHumidity: provides humidity reading
- bme.gas_resistance: provides gas resistance
- bme.readAltitude: provides altitude value.
- DewPointFast(Temperature, Humidity) calculates dew point.
void bme680() { Temperature = bme.readTemperature(); Blynk.virtualWrite(V1, Temperature); Humidity = bme.readHumidity(); Blynk.virtualWrite(V2, Humidity); Pressure = bme.readPressure() / 100.0F; Blynk.virtualWrite(V3, Pressure); Altitude = bme.readAltitude(SEALEVELPRESSURE_HPA); Blynk.virtualWrite(V4, Altitude); Gas = (bme.gas_resistance / 1000.0); Blynk.virtualWrite(V5, Gas); if ((Gas > 0) && (Gas <= 50)) { Blynk.virtualWrite(V6, "IAQ GOOD"); } if ((Gas > 51) && (Gas <= 100)) { Blynk.virtualWrite(V6, "IAQ Average"); } if ((Gas > 101) && (Gas <= 150)) { Blynk.virtualWrite(V6, "IAQ Little Bad"); } if ((Gas > 151) && (Gas <= 200)) { Blynk.virtualWrite(V6, "IAQ Bad"); } if ((Gas > 201) && (Gas <= 300)) { Blynk.virtualWrite(V6, "IAQ Worse"); } if ((Gas > 301) && (Gas <= 500)) { Blynk.virtualWrite(V6, "IAQ Very Bad"); } double DewPoint = DewPointFast(Temperature, Humidity); Blynk.virtualWrite(V7, DewPoint); }
In a loop blynk.runand timer.run function is initiated. We also do some mathematical calculation for deriving dewpoint using Temperature & Humidity values.
void loop() { Blynk.run(); timer.run(); } // DewPoint Calculation double DewPointFast(double celsius, double Humidity) { double a = 17.271; double b = 237.7; double temp = (a * celsius) / (b + celsius) + log(Humidity * 0.01); double Td = (b * temp) / (a - temp); return Td; }
Final Program Code for BME680 IAQ Monitoring
#include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> #include <Wire.h> #include <Adafruit_Sensor.h> #include "Adafruit_BME680.h" #define SEALEVELPRESSURE_HPA (1013.25) Adafruit_BME680 bme; float Temperature; float Humidity; float Pressure; float Gas; float Altitude; float DewPont; BlynkTimer timer; char auth[] = " xxx-xxxx-xxx"; char ssid[] = "xxx-xxxx-xxx"; char pass[] = "xxx-xxxx-xxx"; void setup() { Blynk.begin(auth, ssid, pass); bme.begin(0x76); // Set up oversampling and filter initialization bme.setTemperatureOversampling(BME680_OS_8X); bme.setHumidityOversampling(BME680_OS_2X); bme.setPressureOversampling(BME680_OS_4X); bme.setIIRFilterSize(BME680_FILTER_SIZE_3); bme.setGasHeater(320, 150); // 320*C for 150 ms timer.setInterval(2000L, bme680); } void bme680() { Temperature = bme.readTemperature(); Blynk.virtualWrite(V1, Temperature); Humidity = bme.readHumidity(); Blynk.virtualWrite(V2, Humidity); Pressure = bme.readPressure() / 100.0F; Blynk.virtualWrite(V3, Pressure); Altitude = bme.readAltitude(SEALEVELPRESSURE_HPA); Blynk.virtualWrite(V4, Altitude); Gas = (bme.gas_resistance / 1000.0); Blynk.virtualWrite(V5, Gas); if ((Gas > 0) && (Gas <= 50)) { Blynk.virtualWrite(V6, "IAQ GOOD"); } if ((Gas > 51) && (Gas <= 100)) { Blynk.virtualWrite(V6, "IAQ Average"); } if ((Gas > 101) && (Gas <= 150)) { Blynk.virtualWrite(V6, "IAQ Little Bad"); } if ((Gas > 151) && (Gas <= 200)) { Blynk.virtualWrite(V6, "IAQ Bad"); } if ((Gas > 201) && (Gas <= 300)) { Blynk.virtualWrite(V6, "IAQ Worse"); } if ((Gas > 301) && (Gas <= 500)) { Blynk.virtualWrite(V6, "IAQ Very Bad"); } double DewPoint = DewPointFast(Temperature, Humidity); Blynk.virtualWrite(V7, DewPoint); } void loop() { Blynk.run(); timer.run(); } // DewPoint Calculation double DewPointFast(double celsius, double Humidity) { double a = 17.271; double b = 237.7; double temp = (a * celsius) / (b + celsius) + log(Humidity * 0.01); double Td = (b * temp) / (a - temp); return Td; }
Finally, copy the above program code on your Arduino IDE. Now compile the code and upload it to the NodeMCU ESP8266 board by selecting the correct board and correct port.
Open the blynk App to see the real-time data on your smartphone.
Demonstration: IoT Based Indoor Air Quality Monitoring Using BME680 & ESP8266
Run freshly configured blynk app dashboard. Now, you will get access to the cloud server with the latest BME680 sensor reading. You can access this data from any network on your smartphone from anywhere in the world.
Note: The readings are updated every second. You can customize it according to your requirements.
Video Tutorial & Guide
Wrapping Up
In this tutorial, I have shown you the IoT Based Indoor Air Quality Monitoring Using BME680 & ESP8266. This project is very helpful for monitoring our internal (home) environment wirelessly. I hope you enjoyed reading this article. If you have any questions, comments, or ideas? Let me know in the comment section below.
Recommended Readings: