{"id":99497,"date":"2020-12-19T15:49:56","date_gmt":"2020-12-19T15:49:56","guid":{"rendered":"https:\/\/randomnerdtutorials.com\/?p=99497"},"modified":"2020-12-19T15:49:58","modified_gmt":"2020-12-19T15:49:58","slug":"esp8266-nodemcu-mqtt-publish-bme680-arduino","status":"publish","type":"post","link":"https:\/\/randomnerdtutorials.com\/esp8266-nodemcu-mqtt-publish-bme680-arduino\/","title":{"rendered":"ESP8266 NodeMCU MQTT \u2013 Publish BME680 Temperature, Humidity, Pressure, and Gas Readings (Arduino IDE)"},"content":{"rendered":"\n<p>Learn how to publish BME680 sensor readings (temperature, humidity, pressure and gas air quality) via MQTT with the ESP8266 NodeMCU to any platform that supports MQTT or any MQTT client. As an example, we&#8217;ll publish sensor readings to Node-RED Dashboard and the ESP8266 will be programmed using Arduino IDE.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" fetchpriority=\"high\" decoding=\"async\" width=\"1200\" height=\"675\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/ESP8266-NodeMCU-MQTT-Publish-BME680-Temperature-Humidity-Pressure-Gas-Readings-Arduino-IDE.jpg?resize=1200%2C675&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP8266 NodeMCU MQTT Publish BME680 Temperature Humidity Pressure and Gas Readings Arduino IDE\" class=\"wp-image-99509\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/ESP8266-NodeMCU-MQTT-Publish-BME680-Temperature-Humidity-Pressure-Gas-Readings-Arduino-IDE.jpg?w=1280&amp;quality=100&amp;strip=all&amp;ssl=1 1280w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/ESP8266-NodeMCU-MQTT-Publish-BME680-Temperature-Humidity-Pressure-Gas-Readings-Arduino-IDE.jpg?resize=300%2C169&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/ESP8266-NodeMCU-MQTT-Publish-BME680-Temperature-Humidity-Pressure-Gas-Readings-Arduino-IDE.jpg?resize=1024%2C576&amp;quality=100&amp;strip=all&amp;ssl=1 1024w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/ESP8266-NodeMCU-MQTT-Publish-BME680-Temperature-Humidity-Pressure-Gas-Readings-Arduino-IDE.jpg?resize=768%2C432&amp;quality=100&amp;strip=all&amp;ssl=1 768w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" \/><\/figure><\/div>\n\n\n\n<p class=\"rntbox rntclgray\"><strong>Recommended reading:<\/strong> <a href=\"https:\/\/randomnerdtutorials.com\/what-is-mqtt-and-how-it-works\/\">What is MQTT and How It Works<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Project Overview<\/h2>\n\n\n\n<p>The following diagram shows a high-level overview of the project we&#8217;ll build.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" decoding=\"async\" width=\"862\" height=\"632\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/ESP8266-NodeMCU-Overview-MQTT-Publish-BME680-Temperature-Humidity-Pressure-Gas-Readings.png?resize=862%2C632&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP8266 NodeMCU Project Overview MQTT Publish BME680 Temperature Humidity Pressure Gas Readings\" class=\"wp-image-99511\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/ESP8266-NodeMCU-Overview-MQTT-Publish-BME680-Temperature-Humidity-Pressure-Gas-Readings.png?w=862&amp;quality=100&amp;strip=all&amp;ssl=1 862w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/ESP8266-NodeMCU-Overview-MQTT-Publish-BME680-Temperature-Humidity-Pressure-Gas-Readings.png?resize=300%2C220&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/ESP8266-NodeMCU-Overview-MQTT-Publish-BME680-Temperature-Humidity-Pressure-Gas-Readings.png?resize=768%2C563&amp;quality=100&amp;strip=all&amp;ssl=1 768w\" sizes=\"(max-width: 862px) 100vw, 862px\" \/><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li>The ESP8266 requests sensor readings from the BME680 sensor.<\/li><li>The temperature readings are published in the&nbsp;<strong>esp\/bme680\/temperature<\/strong>&nbsp;topic;<\/li><li>Humidity readings are published in the&nbsp;<strong>esp\/bme680\/humidity<\/strong>topic;<\/li><li>Pressure readings are published in the&nbsp;<strong>esp\/bme680\/pressure<\/strong> topic;<\/li><li>Gas readings are published in the&nbsp;<strong>esp\/bme680\/gas<\/strong> topic;<\/li><li>Node-RED is subscribed to those topics;<\/li><li>Node-RED receives the sensor readings and then displays them on gauges and text fields;<\/li><li>You can receive the readings in any other platform that supports MQTT and handle the readings as you want.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Prerequisites<\/h2>\n\n\n\n<p>Before proceeding with this tutorial, make sure you check the following prerequisites.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Arduino IDE<\/h3>\n\n\n\n<p>We&#8217;ll program the ESP8266 using Arduino IDE, so make sure you have the ESP8266 add-on installed.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/randomnerdtutorials.com\/how-to-install-esp8266-board-arduino-ide\/\">Installing the ESP8266 NodeMCU Board in Arduino IDE (Windows, Mac OS X, Linux)<\/a><\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">MQTT Broker<\/h3>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" decoding=\"async\" width=\"200\" height=\"197\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/01\/mosquitto-broker.png?resize=200%2C197&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"Installing Mosquitto MQTT broker Raspberry Pi\" class=\"wp-image-73566\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/01\/mosquitto-broker.png?w=200&amp;quality=100&amp;strip=all&amp;ssl=1 200w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/01\/mosquitto-broker.png?resize=80%2C80&amp;quality=100&amp;strip=all&amp;ssl=1 80w\" sizes=\"(max-width: 200px) 100vw, 200px\" \/><\/figure><\/div>\n\n\n\n<p>To use MQTT, you need a broker. We\u2019ll be using&nbsp;<a href=\"https:\/\/mosquitto.org\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\">Mosquitto broker<\/a>&nbsp;installed on a Raspberry Pi. Read&nbsp;<a rel=\"noreferrer noopener\" href=\"https:\/\/randomnerdtutorials.com\/how-to-install-mosquitto-broker-on-raspberry-pi\/\" target=\"_blank\">How to Install Mosquitto Broker on Raspberry Pi<\/a>.<\/p>\n\n\n\n<p>You can use any other MQTT broker, including a cloud MQTT broker. We&#8217;ll show you how to do that in the code later on.<\/p>\n\n\n\n<p>If you\u2019re not familiar with MQTT make sure you read our introductory tutorial:&nbsp;<a rel=\"noreferrer noopener\" href=\"https:\/\/randomnerdtutorials.com\/what-is-mqtt-and-how-it-works\/\" target=\"_blank\">What is MQTT and How It Works<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">MQTT Libraries<\/h3>\n\n\n\n<p>To use MQTT with the ESP8266 we&#8217;ll use the <a aria-label=\" (opens in a new tab)\" href=\"https:\/\/github.com\/marvinroger\/async-mqtt-client\" target=\"_blank\" rel=\"noreferrer noopener\">Async MQTT Client Library<\/a>.<\/p>\n\n\n\n<p><strong>Installing the Async MQTT Client Library<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\"><li><a aria-label=\" (opens in a new tab)\" href=\"https:\/\/github.com\/marvinroger\/async-mqtt-client\/archive\/master.zip\" target=\"_blank\" rel=\"noreferrer noopener\">Click here to download the Async MQTT client library<\/a>. You should have a .zip folder in your <em>Downloads <\/em>folder<\/li><li>Unzip the .zip folder and you should get&nbsp;<strong>async-mqtt-client-master<\/strong>&nbsp;folder<\/li><li>Rename your folder from&nbsp;<del><strong>async-mqtt-client-master<\/strong><\/del>&nbsp;to&nbsp;<strong>async_mqtt_client<\/strong><\/li><li>Move the&nbsp;<strong>async_mqtt_client<\/strong>&nbsp;folder to your Arduino IDE installation libraries folder<\/li><li>Finally, re-open your Arduino IDE<\/li><\/ol>\n\n\n\n<p>Alternatively, you can go to <strong>Sketch <\/strong>&gt; <strong>Include Library<\/strong> &gt; <strong>Add . ZIP<\/strong> library and select the library you&#8217;ve just downloaded.<\/p>\n\n\n\n<p><strong>Installing the Async TCP Library<\/strong><\/p>\n\n\n\n<p>To use MQTT with the ESP, you also need the&nbsp;<a href=\"https:\/\/github.com\/me-no-dev\/ESPAsyncTCP\" target=\"_blank\" rel=\"noreferrer noopener\">ESPAsyncTCP library<\/a>.<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li><a href=\"https:\/\/github.com\/me-no-dev\/ESPAsyncTCP\/archive\/master.zip\" target=\"_blank\" rel=\"noreferrer noopener\">Click here to download the ESPAsyncTCP client library<\/a>. You should have a .zip folder in your <em>Downloads <\/em>folder<\/li><li>Unzip the .zip folder and you should get&nbsp;<strong>ESPAsyncTCP-master<\/strong>&nbsp;folder<\/li><li>Rename your folder from&nbsp;<del><strong>ESPAsyncTCP-master<\/strong><\/del>&nbsp;to&nbsp;<strong>ESPAsyncTCP<\/strong><\/li><li>Move the&nbsp;<strong>ESPAsyncTCP<\/strong> folder to your Arduino IDE installation libraries folder<\/li><li>Finally, re-open your Arduino IDE<\/li><\/ol>\n\n\n\n<p>Alternatively, you can go to <strong>Sketch <\/strong>&gt; <strong>Include Library<\/strong> &gt; <strong>Add . ZIP<\/strong> library and select the library you&#8217;ve just downloaded. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">BME680 Sensor Libraries<\/h3>\n\n\n\n<p>To get readings from the BME680 sensor module, we&#8217;ll use the&nbsp;<a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/adafruit\/Adafruit_BME680\" target=\"_blank\">Adafruit_BME680 library<\/a>. You also need to install the <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/adafruit\/Adafruit_Sensor\" target=\"_blank\">Adafruit_Sensor library<\/a>. Follow the next steps to install the libraries in your Arduino IDE:<\/p>\n\n\n\n<p>1. Open your Arduino IDE and go to&nbsp;<strong>Sketch&nbsp;<\/strong>&gt;&nbsp;<strong>Include Library<\/strong>&nbsp;&gt;&nbsp;<strong>Manage Libraries<\/strong>. The Library Manager should open.<\/p>\n\n\n\n<p>2. Search for \u201c<strong>adafruit bme680<\/strong>&nbsp;\u201d on the Search box and install the library.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"786\" height=\"443\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/07\/Install-BM6280-Adafruit-Library-Arduino-IDE.png?resize=786%2C443&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"Install BM6280 Adafruit Library Arduino IDE Library Manager\" class=\"wp-image-98108\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/07\/Install-BM6280-Adafruit-Library-Arduino-IDE.png?w=786&amp;quality=100&amp;strip=all&amp;ssl=1 786w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/07\/Install-BM6280-Adafruit-Library-Arduino-IDE.png?resize=300%2C169&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/07\/Install-BM6280-Adafruit-Library-Arduino-IDE.png?resize=768%2C433&amp;quality=100&amp;strip=all&amp;ssl=1 768w\" sizes=\"(max-width: 786px) 100vw, 786px\" \/><\/figure><\/div>\n\n\n\n<p>To use the BME680 library, you also need to install the Adafruit Unified Sensor. Follow the next steps to install the library in your Arduino IDE:<\/p>\n\n\n\n<p>3. Search for &#8220;<strong>Adafruit Unified Sensor<\/strong>&#8220;in the search box. Scroll all the way down to find the library and install it.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"750\" height=\"422\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2019\/04\/adafruit_unified_sensor_library.png?resize=750%2C422&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"Installing Adafruit Unified Sensor Driver library\" class=\"wp-image-84295\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2019\/04\/adafruit_unified_sensor_library.png?w=750&amp;quality=100&amp;strip=all&amp;ssl=1 750w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2019\/04\/adafruit_unified_sensor_library.png?resize=300%2C169&amp;quality=100&amp;strip=all&amp;ssl=1 300w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/figure><\/div>\n\n\n\n<p>After installing the libraries, restart your Arduino IDE.<\/p>\n\n\n\n<p class=\"rntbox rntclblue\">To learn more about the BME680 sensor, read our guide: <a href=\"https:\/\/randomnerdtutorials.com\/esp8266-nodemcu-bme680-sensor-arduino\/\">ESP8266 with BME680 Sensor using Arduino IDE (Pressure, Temperature, Humidity)<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Parts Required<\/h3>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"750\" height=\"422\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/07\/ESP32-Board-BME680-Gas-sensor-circuit-wiring-diagram-schematics.jpg?resize=750%2C422&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP32 Board BME680 Gas sensor circuit wiring diagram schematics\" class=\"wp-image-98142\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/07\/ESP32-Board-BME680-Gas-sensor-circuit-wiring-diagram-schematics.jpg?w=750&amp;quality=100&amp;strip=all&amp;ssl=1 750w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/07\/ESP32-Board-BME680-Gas-sensor-circuit-wiring-diagram-schematics.jpg?resize=300%2C169&amp;quality=100&amp;strip=all&amp;ssl=1 300w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/figure><\/div>\n\n\n\n<p>For this tutorial you need the following parts:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a style=\"font-size: inherit; background-color: initial;\" rel=\"noreferrer noopener\" href=\"https:\/\/makeradvisor.com\/tools\/esp8266-esp-12e-nodemcu-wi-fi-development-board\/\" target=\"_blank\">ESP8266<\/a><span style=\"font-size: inherit; background-color: initial;\">&nbsp;(read&nbsp;<\/span><a style=\"font-size: inherit; background-color: initial;\" rel=\"noreferrer noopener\" href=\"https:\/\/makeradvisor.com\/best-esp8266-wi-fi-development-board\/\" target=\"_blank\">Best ESP8266 development boards<\/a><span style=\"font-size: inherit; background-color: initial;\">)<\/span><\/li><li><a rel=\"noreferrer noopener\" href=\"https:\/\/makeradvisor.com\/tools\/bme680-gas-sensor-module\/\" target=\"_blank\">BME680<\/a> &#8211; <a href=\"https:\/\/randomnerdtutorials.com\/esp8266-nodemcu-bme680-sensor-arduino\/\">BME680 with ESP8266 Guide<\/a><\/li><li><a aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" href=\"https:\/\/makeradvisor.com\/raspberry-pi-board\/\" target=\"_blank\">Raspberry Pi board<\/a>&nbsp;(read&nbsp;<a aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" href=\"https:\/\/makeradvisor.com\/best-raspberry-pi-starter-kits\/\" target=\"_blank\">Best Raspberry Pi Starter Kits<\/a>)<\/li><li><a aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" href=\"https:\/\/makeradvisor.com\/tools\/microsd-card-raspberry-pi-16gb-class-10\/\" target=\"_blank\">MicroSD Card \u2013 16GB Class10<\/a><\/li><li><a aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" href=\"https:\/\/makeradvisor.com\/tools\/raspberry-pi-power-supply\/\" target=\"_blank\">Raspberry Pi Power Supply (5V 2.5A)<\/a> <\/li><li><a rel=\"noreferrer noopener\" href=\"https:\/\/makeradvisor.com\/tools\/jumper-wires-kit-120-pieces\/\" target=\"_blank\">Jumper wires<\/a><\/li><li><a rel=\"noreferrer noopener\" href=\"https:\/\/makeradvisor.com\/tools\/mb-102-solderless-breadboard-830-points\/\" target=\"_blank\">Breadboard<\/a> <\/li><\/ul>\n\n\n<p>You can use the preceding links or go directly to <a href=\"https:\/\/makeradvisor.com\/tools\/?utm_source=rnt&utm_medium=post&utm_campaign=post\" target=\"_blank\">MakerAdvisor.com\/tools<\/a> to find all the parts for your projects at the best price!<\/p><p style=\"text-align:center;\"><a href=\"https:\/\/makeradvisor.com\/tools\/?utm_source=rnt&utm_medium=post&utm_campaign=post\" target=\"_blank\"><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/10\/header-200.png?w=1200&#038;quality=100&#038;strip=all&#038;ssl=1\"><\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Schematic Diagram<\/h2>\n\n\n\n<p>Wire the BME680 to the ESP8266 as shown in the following schematic diagram with the SDA pin connected to <span class=\"rnthl rntcgray\">GPIO 4<\/span> and the SCL pin connected to <span class=\"rnthl rntcyellow\">GPIO 5<\/span>.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"831\" height=\"531\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/07\/ESP8266-BME680-Environmental-Sensor-Wiring-Diagram-I2C-1.png?resize=831%2C531&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP8266 NodeMCU BME680 Environmental Sensor Wiring Diagram I2C\" class=\"wp-image-98397\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/07\/ESP8266-BME680-Environmental-Sensor-Wiring-Diagram-I2C-1.png?w=831&amp;quality=100&amp;strip=all&amp;ssl=1 831w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/07\/ESP8266-BME680-Environmental-Sensor-Wiring-Diagram-I2C-1.png?resize=300%2C192&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/07\/ESP8266-BME680-Environmental-Sensor-Wiring-Diagram-I2C-1.png?resize=768%2C491&amp;quality=100&amp;strip=all&amp;ssl=1 768w\" sizes=\"(max-width: 831px) 100vw, 831px\" \/><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Code<\/h2>\n\n\n\n<p>Copy the following code to your Arduino IDE. To make it work for you, you need to insert your network credentials as well as the MQTT broker details.<\/p>\n\n\n<pre style=\"max-height: 40em; margin-bottom: 20px;\"><code class=\"language-c\">\/*\n  Rui Santos\n  Complete project details at https:\/\/RandomNerdTutorials.com\/esp8266-nodemcu-mqtt-publish-bme680-arduino\/\n  \n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files.\n  \n  The above copyright notice and this permission notice shall be included in all\n  copies or substantial portions of the Software.\n*\/\n\n#include &lt;ESP8266WiFi.h&gt;\n#include &lt;Ticker.h&gt;\n#include &lt;AsyncMqttClient.h&gt;\n#include &lt;Wire.h&gt;\n#include &lt;SPI.h&gt;\n#include &lt;Adafruit_Sensor.h&gt;\n#include &quot;Adafruit_BME680.h&quot;\n\n#define WIFI_SSID &quot;REPLACE_WITH_YOUR_SSID&quot;\n#define WIFI_PASSWORD &quot;REPLACE_WITH_YOUR_PASSWORD&quot;\n\n\/\/ Raspberry Pi Mosquitto MQTT Broker\n#define MQTT_HOST IPAddress(192, 168, 1, XXX)\n\/\/ For a cloud MQTT broker, type the domain name\n\/\/#define MQTT_HOST &quot;example.com&quot;\n#define MQTT_PORT 1883\n\n\/\/ Temperature MQTT Topics\n#define MQTT_PUB_TEMP &quot;esp\/bme680\/temperature&quot;\n#define MQTT_PUB_HUM  &quot;esp\/bme680\/humidity&quot;\n#define MQTT_PUB_PRES &quot;esp\/bme680\/pressure&quot;\n#define MQTT_PUB_GAS  &quot;esp\/bme680\/gas&quot;\n\n\/*#define BME_SCK 14\n#define BME_MISO 12\n#define BME_MOSI 13\n#define BME_CS 15*\/\n\nAdafruit_BME680 bme; \/\/ I2C\n\/\/Adafruit_BME680 bme(BME_CS); \/\/ hardware SPI\n\/\/Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);\n\n\/\/ Variables to hold sensor readings\nfloat temperature;\nfloat humidity;\nfloat pressure;\nfloat gasResistance;\n\nAsyncMqttClient mqttClient;\nTicker mqttReconnectTimer;\n\nWiFiEventHandler wifiConnectHandler;\nWiFiEventHandler wifiDisconnectHandler;\nTicker wifiReconnectTimer;\n\nunsigned long previousMillis = 0;   \/\/ Stores last time temperature was published\nconst long interval = 10000;        \/\/ Interval at which to publish sensor readings\n\nvoid getBME680Readings(){\n  \/\/ Tell BME680 to begin measurement.\n  unsigned long endTime = bme.beginReading();\n  if (endTime == 0) {\n    Serial.println(F(&quot;Failed to begin reading :(&quot;));\n    return;\n  }\n  if (!bme.endReading()) {\n    Serial.println(F(&quot;Failed to complete reading :(&quot;));\n    return;\n  }\n  temperature = bme.temperature;\n  pressure = bme.pressure \/ 100.0;\n  humidity = bme.humidity;\n  gasResistance = bme.gas_resistance \/ 1000.0;\n}\n\nvoid connectToWifi() {\n  Serial.println(&quot;Connecting to Wi-Fi...&quot;);\n  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);\n}\n\nvoid onWifiConnect(const WiFiEventStationModeGotIP&amp; event) {\n  Serial.println(&quot;Connected to Wi-Fi.&quot;);\n  connectToMqtt();\n}\n\nvoid onWifiDisconnect(const WiFiEventStationModeDisconnected&amp; event) {\n  Serial.println(&quot;Disconnected from Wi-Fi.&quot;);\n  mqttReconnectTimer.detach(); \/\/ ensure we don't reconnect to MQTT while reconnecting to Wi-Fi\n  wifiReconnectTimer.once(2, connectToWifi);\n}\n\nvoid connectToMqtt() {\n  Serial.println(&quot;Connecting to MQTT...&quot;);\n  mqttClient.connect();\n}\n\nvoid onMqttConnect(bool sessionPresent) {\n  Serial.println(&quot;Connected to MQTT.&quot;);\n  Serial.print(&quot;Session present: &quot;);\n  Serial.println(sessionPresent);\n}\n\nvoid onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {\n  Serial.println(&quot;Disconnected from MQTT.&quot;);\n\n  if (WiFi.isConnected()) {\n    mqttReconnectTimer.once(2, connectToMqtt);\n  }\n}\n\n\/*void onMqttSubscribe(uint16_t packetId, uint8_t qos) {\n  Serial.println(&quot;Subscribe acknowledged.&quot;);\n  Serial.print(&quot;  packetId: &quot;);\n  Serial.println(packetId);\n  Serial.print(&quot;  qos: &quot;);\n  Serial.println(qos);\n}\n\nvoid onMqttUnsubscribe(uint16_t packetId) {\n  Serial.println(&quot;Unsubscribe acknowledged.&quot;);\n  Serial.print(&quot;  packetId: &quot;);\n  Serial.println(packetId);\n}*\/\n\nvoid onMqttPublish(uint16_t packetId) {\n  Serial.print(&quot;Publish acknowledged.&quot;);\n  Serial.print(&quot;  packetId: &quot;);\n  Serial.println(packetId);\n}\n\nvoid setup() {\n  Serial.begin(115200);\n  Serial.println();\n\n  if (!bme.begin()) {\n    Serial.println(F(&quot;Could not find a valid BME680 sensor, check wiring!&quot;));\n    while (1);\n  }\n  \n  wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect);\n  wifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect);\n  \n  mqttClient.onConnect(onMqttConnect);\n  mqttClient.onDisconnect(onMqttDisconnect);\n  \/\/mqttClient.onSubscribe(onMqttSubscribe);\n  \/\/mqttClient.onUnsubscribe(onMqttUnsubscribe);\n  mqttClient.onPublish(onMqttPublish);\n  mqttClient.setServer(MQTT_HOST, MQTT_PORT);\n  \/\/ If your broker requires authentication (username and password), set them below\n  \/\/mqttClient.setCredentials(&quot;REPlACE_WITH_YOUR_USER&quot;, &quot;REPLACE_WITH_YOUR_PASSWORD&quot;);\n  connectToWifi();\n  \n  \/\/ Set up oversampling and filter initialization\n  bme.setTemperatureOversampling(BME680_OS_8X);\n  bme.setHumidityOversampling(BME680_OS_2X);\n  bme.setPressureOversampling(BME680_OS_4X);\n  bme.setIIRFilterSize(BME680_FILTER_SIZE_3);\n  bme.setGasHeater(320, 150); \/\/ 320*C for 150 ms\n}\n\nvoid loop() {\n  unsigned long currentMillis = millis();\n  \/\/ Every X number of seconds (interval = 10 seconds) \n  \/\/ it publishes a new MQTT message\n  if (currentMillis - previousMillis &gt;= interval) {\n    \/\/ Save the last time a new reading was published\n    previousMillis = currentMillis;\n    \n    getBME680Readings();\n    Serial.println();\n    Serial.printf(&quot;Temperature = %.2f \u00baC \\n&quot;, temperature);\n    Serial.printf(&quot;Humidity = %.2f % \\n&quot;, humidity);\n    Serial.printf(&quot;Pressure = %.2f hPa \\n&quot;, pressure);\n    Serial.printf(&quot;Gas Resistance = %.2f KOhm \\n&quot;, gasResistance);\n    \n    \/\/ Publish an MQTT message on topic esp\/bme680\/temperature\n    uint16_t packetIdPub1 = mqttClient.publish(MQTT_PUB_TEMP, 1, true, String(temperature).c_str());\n    Serial.printf(&quot;Publishing on topic %s at QoS 1, packetId: %i&quot;, MQTT_PUB_TEMP, packetIdPub1);\n    Serial.printf(&quot;Message: %.2f \\n&quot;, temperature);\n\n    \/\/ Publish an MQTT message on topic esp\/bme680\/humidity\n    uint16_t packetIdPub2 = mqttClient.publish(MQTT_PUB_HUM, 1, true, String(humidity).c_str());\n    Serial.printf(&quot;Publishing on topic %s at QoS 1, packetId %i: &quot;, MQTT_PUB_HUM, packetIdPub2);\n    Serial.printf(&quot;Message: %.2f \\n&quot;, humidity);\n\n    \/\/ Publish an MQTT message on topic esp\/bme680\/pressure\n    uint16_t packetIdPub3 = mqttClient.publish(MQTT_PUB_PRES, 1, true, String(pressure).c_str());\n    Serial.printf(&quot;Publishing on topic %s at QoS 1, packetId %i: &quot;, MQTT_PUB_PRES, packetIdPub3);\n    Serial.printf(&quot;Message: %.2f \\n&quot;, pressure);\n\n    \/\/ Publish an MQTT message on topic esp\/bme680\/gas\n    uint16_t packetIdPub4 = mqttClient.publish(MQTT_PUB_GAS, 1, true, String(gasResistance).c_str());\n    Serial.printf(&quot;Publishing on topic %s at QoS 1, packetId %i: &quot;, MQTT_PUB_GAS, packetIdPub4);\n    Serial.printf(&quot;Message: %.2f \\n&quot;, gasResistance);\n  }\n}\n<\/code><\/pre>\n\t<p style=\"text-align:center\"><a class=\"rntwhite\" href=\"https:\/\/github.com\/RuiSantosdotme\/Random-Nerd-Tutorials\/raw\/master\/Projects\/ESP8266\/ESP8266_MQTT\/ESP8266_BME680.ino\" target=\"_blank\">View raw code<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How the Code Works<\/h3>\n\n\n\n<p>The following section imports all the required libraries.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>#include &lt;ESP8266WiFi.h>\n#include &lt;Ticker.h>\n#include &lt;AsyncMqttClient.h>\n#include &lt;Wire.h>\n#include &lt;SPI.h>\n#include &lt;Adafruit_Sensor.h>\n#include \"Adafruit_BME680.h\"<\/code><\/pre>\n\n\n\n<p>Include your network credentials on the following lines.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>#define WIFI_SSID \"REPLACE_WITH_YOUR_SSID\"\n#define WIFI_PASSWORD \"REPLACE_WITH_YOUR_PASSWORD\"<\/code><\/pre>\n\n\n\n<p>Insert the Raspberry Pi IP address, so that the ESP8266 connects to your broker.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>#define MQTT_HOST IPAddress(192, 168, 1, 106)<\/code><\/pre>\n\n\n\n<p>If you&#8217;re using a cloud MQTT broker, insert the broker domain name, for example:<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>#define MQTT_HOST \"example.com\"<\/code><\/pre>\n\n\n\n<p>Define the MQTT port.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>#define MQTT_PORT 1883<\/code><\/pre>\n\n\n\n<p>The temperature, humidity and pressure will be published on the following topics:<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>#define MQTT_PUB_TEMP \"esp\/bme680\/temperature\"\n#define MQTT_PUB_HUM  \"esp\/bme680\/humidity\"\n#define MQTT_PUB_PRES \"esp\/bme680\/pressure\"\n#define MQTT_PUB_GAS  \"esp\/bme680\/gas\"<\/code><\/pre>\n\n\n\n<p>Initialize a <span class=\"rnthl rntliteral\">Adafruit_BME680<\/span> object called <span class=\"rnthl rntliteral\">bme<\/span>.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>Adafruit_BME680 bme;<\/code><\/pre>\n\n\n\n<p>The <span class=\"rnthl rntliteral\">temperature<\/span>, <span class=\"rnthl rntliteral\">humidity<\/span>, <span class=\"rnthl rntliteral\">pressure<\/span>, and <span class=\"rnthl rntliteral\">gasResistance<\/span> variables will hold all sensor readings from the BME680 sensor.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>float temperature;\nfloat humidity;\nfloat pressure;\nfloat gasResistance;<\/code><\/pre>\n\n\n\n<p>Create an <span class=\"rnthl rntliteral\">AsyncMqttClient<\/span> object called <span class=\"rnthl rntliteral\">mqttClient<\/span> to handle the MQTT client and timers to reconnect to your MQTT broker and router when it disconnects.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>AsyncMqttClient mqttClient;\nTicker mqttReconnectTimer;\n\nWiFiEventHandler wifiConnectHandler;\nWiFiEventHandler wifiDisconnectHandler;\nTicker wifiReconnectTimer;<\/code><\/pre>\n\n\n\n<p>Then, create some auxiliary timer variables to publish the readings every 10 seconds. You can change the delay time on the <span class=\"rnthl rntliteral\">interval<\/span> variable.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>unsigned long previousMillis = 0;\nconst long interval = 10000;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">MQTT functions: connect to Wi-Fi, connect to MQTT, and Wi-Fi events<\/h3>\n\n\n\n<p>We haven\u2019t added any comments to the functions defined in the next code section. Those functions come with the Async Mqtt Client library. The function\u2019s names are pretty self-explanatory.<\/p>\n\n\n\n<p>For example, the <span class=\"rnthl rntliteral\">connectToWifi()<\/span> connects your ESP8266 to your router:<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>void connectToWifi() {\n  Serial.println(\"Connecting to Wi-Fi...\");\n  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);\n}<\/code><\/pre>\n\n\n\n<p>The <span class=\"rnthl rntliteral\">connectToMqtt()<\/span> connects your ESP8266 to your MQTT broker:<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>void connectToMqtt() {\n  Serial.println(\"Connecting to MQTT\u2026\");\n  mqttClient.connect();\n}<\/code><\/pre>\n\n\n\n<p>The <span class=\"rnthl rntliteral\">onWifiConnect()<\/span> and <span class=\"rnthl rntliteral\">onWifiDisconnect()<\/span> functions are responsible for handling the Wi-Fi events. For example, after a successful connection with the router and MQTT broker, it prints the ESP8266 IP address. On the other hand, if the connection is lost, it starts a timer and tries to reconnect.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>void onWifiConnect(const WiFiEventStationModeGotIP&amp; event) {\n  Serial.println(\"Connected to Wi-Fi.\");\n  connectToMqtt();\n}\n\nvoid onWifiDisconnect(const WiFiEventStationModeDisconnected&amp; event) {\n  Serial.println(\"Disconnected from Wi-Fi.\");\n  mqttReconnectTimer.detach();\n  wifiReconnectTimer.once(2, connectToWifi);\n}<\/code><\/pre>\n\n\n\n<p>The <span class=\"rnthl rntliteral\">onMqttConnect()<\/span> function runs after starting a session with the broker.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>void onMqttConnect(bool sessionPresent) {\n  Serial.println(\"Connected to MQTT.\");\n  Serial.print(\"Session present: \");\n  Serial.println(sessionPresent);\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">MQTT functions: disconnect and publish<\/h3>\n\n\n\n<p>If the ESP8266 loses connection with the MQTT broker, it calls the <span class=\"rnthl rntliteral\">onMqttDisconnect<\/span> function that prints that message in the serial monitor.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>void onMqttDisconnect(AsyncMqttClientDisconnectReason reason) {\n  Serial.println(\"Disconnected from MQTT.\");\n\n  if (WiFi.isConnected()) {\n    mqttReconnectTimer.once(2, connectToMqtt);\n  }\n}<\/code><\/pre>\n\n\n\n<p>When you publish a message to an MQTT topic, the <span class=\"rnthl rntliteral\">onMqttPublish()<\/span> function is called. It prints the packet id in the Serial Monitor.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>void onMqttPublish(uint16_t packetId) {\n  Serial.println(\"Publish acknowledged.\");\n  Serial.print(\"  packetId: \");\n  Serial.println(packetId);\n}<\/code><\/pre>\n\n\n\n<p>Basically, all these functions that we\u2019ve just mentioned are callback functions. So, they are executed asynchronously.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">setup()<\/h3>\n\n\n\n<p>Now, let\u2019s proceed to the <span class=\"rnthl rntliteral\">setup()<\/span>. Initialize the BME680 sensor.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>if (!bme.begin()) {\n  Serial.println(F(\"Could not find a valid BME680 sensor, check wiring!\"));\n  while (1);\n}<\/code><\/pre>\n\n\n\n<p>The next two lines assign callbacks that will handle what happens when the ESP connects or disconnects to your Wi-Fi connection.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect);\nwifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect);\n<\/code><\/pre>\n\n\n\n<p>Finally, assign all the callbacks functions. This means that these functions will be executed automatically when needed. For example, when the ESP8266 connects to the broker, it automatically calls the <span class=\"rnthl rntliteral\">onMqttConnect()<\/span> function, and so on.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>mqttClient.onConnect(onMqttConnect);\nmqttClient.onDisconnect(onMqttDisconnect);\n\/\/mqttClient.onSubscribe(onMqttSubscribe);\n\/\/mqttClient.onUnsubscribe(onMqttUnsubscribe);\nmqttClient.onPublish(onMqttPublish);\nmqttClient.setServer(MQTT_HOST, MQTT_PORT);<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Broker Authentication<\/h4>\n\n\n\n<p>If your broker requires authentication, uncomment the following line and insert your credentials (username and password).<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>mqttClient.setCredentials(\"REPlACE_WITH_YOUR_USER\", \"REPLACE_WITH_YOUR_PASSWORD\");<\/code><\/pre>\n\n\n\n<p>Connect to Wi-Fi.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>connectToWifi();<\/code><\/pre>\n\n\n\n<p>Finally, set up the following parameters (oversampling, filter and gas heater) for the sensor.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>bme.setTemperatureOversampling(BME680_OS_8X);\nbme.setHumidityOversampling(BME680_OS_2X);\nbme.setPressureOversampling(BME680_OS_4X);\nbme.setIIRFilterSize(BME680_FILTER_SIZE_3);\nbme.setGasHeater(320, 150);<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">loop()<\/h2>\n\n\n\n<p>In the <span class=\"rnthl rntliteral\">loop()<\/span>, you create a timer that allows you to get new readings from the BME680 sensor and publishing them on the corresponding topic every 10 seconds.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>unsigned long currentMillis = millis();\n\/\/ Every X number of seconds (interval = 10 seconds) \n\/\/ it publishes a new MQTT message\nif (currentMillis - previousMillis >= interval) {\n  \/\/ Save the last time a new reading was published\n  previousMillis = currentMillis;\n   \n  getBME680Readings();\n  Serial.println();\n  Serial.printf(\"Temperature = %.2f \u00baC \\n\", temperature);\n  Serial.printf(\"Humidity = %.2f % \\n\", humidity);\n  Serial.printf(\"Pressure = %.2f hPa \\n\", pressure);\n  Serial.printf(\"Gas Resistance = %.2f KOhm \\n\", gasResistance);<\/code><\/pre>\n\n\n\n<p class=\"rntbox rntclblue\">Learn more about getting readings from the BME680 sensor: <a href=\"https:\/\/randomnerdtutorials.com\/esp8266-nodemcu-bme680-sensor-arduino\/\">ESP8266 with BME680 Temperature, Humidity and Pressure Sensor Guide<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Publishing to topics<\/h3>\n\n\n\n<p>To publish the readings on the corresponding MQTT topics, use the next lines:<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>uint16_t packetIdPub1 = mqttClient.publish(MQTT_PUB_TEMP, 1, true, String(temperature).c_str());\nuint16_t packetIdPub2 = mqttClient.publish(MQTT_PUB_HUM, 1, true, String(humidity).c_str());\nuint16_t packetIdPub3 = mqttClient.publish(MQTT_PUB_PRES, 1, true, String(pressure).c_str());\nuint16_t packetIdPub4 = mqttClient.publish(MQTT_PUB_GAS, 1, true, String(gasResistance).c_str());<\/code><\/pre>\n\n\n\n<p>Basically, use the <span class=\"rnthl rntliteral\">publish()<\/span> method on the <span class=\"rnthl rntliteral\">mqttClient<\/span> object to publish data on a topic. The <span class=\"rnthl rntliteral\">publish()<\/span> method accepts the following arguments, in order:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>MQTT topic (const char*)<\/li><li>QoS (uint8_t): quality of service &#8211; it can be 0, 1 or 2<\/li><li>retain flag (bool): retain flag<\/li><li>payload (const char*) &#8211; in this case, the payload corresponds to the sensor reading<\/li><\/ul>\n\n\n\n<p>The QoS (quality of service) is a way to guarantee that the message is delivered. It can be one of the following levels:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>0<\/strong>: the message will be delivered once or not at all. The message is not acknowledged. There is no possibility of duplicated messages;<\/li><li><strong>1<\/strong>: the message will be delivered at least once, but may be delivered more than once;<\/li><li><strong>2<\/strong>: the message is always delivered exactly once;<\/li><li><a href=\"https:\/\/www.ibm.com\/support\/knowledgecenter\/en\/SSFKSJ_8.0.0\/com.ibm.mq.dev.doc\/q029090_.htm\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\">Learn about MQTT QoS.<\/a><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Uploading the code<\/h2>\n\n\n\n<p>With your Raspberry Pi powered on and running the Mosquitto MQTT broker, upload the code to your ESP8266.<\/p>\n\n\n\n<p>Open the Serial Monitor at a baud rate of 115200 and you&#8217;ll see that the ESP8266 starts publishing messages on the topics we&#8217;ve defined previously.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1115\" height=\"592\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/ESP32-ESP8266-Arduino-IDE-Serial-Monitor-BME680-Temperature-Humidity-Pressure-Gas-Air-Quality.png?resize=1115%2C592&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP32 ESP8266 Arduino IDE Serial Monitor BME680 Temperature Humidity Pressure Gas Air Quality\" class=\"wp-image-99516\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/ESP32-ESP8266-Arduino-IDE-Serial-Monitor-BME680-Temperature-Humidity-Pressure-Gas-Air-Quality.png?w=1115&amp;quality=100&amp;strip=all&amp;ssl=1 1115w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/ESP32-ESP8266-Arduino-IDE-Serial-Monitor-BME680-Temperature-Humidity-Pressure-Gas-Air-Quality.png?resize=300%2C159&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/ESP32-ESP8266-Arduino-IDE-Serial-Monitor-BME680-Temperature-Humidity-Pressure-Gas-Air-Quality.png?resize=1024%2C544&amp;quality=100&amp;strip=all&amp;ssl=1 1024w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/ESP32-ESP8266-Arduino-IDE-Serial-Monitor-BME680-Temperature-Humidity-Pressure-Gas-Air-Quality.png?resize=768%2C408&amp;quality=100&amp;strip=all&amp;ssl=1 768w\" sizes=\"(max-width: 1115px) 100vw, 1115px\" \/><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Preparing Node-RED Dashboard<\/h2>\n\n\n\n<p>The ESP8266 is publishing sensor readings every 10 seconds on four MQTT topics. Now, you can use any dashboard that supports MQTT or any other device that supports MQTT to subscribe to those topics and receive the readings.<\/p>\n\n\n\n<p>As an example, we&#8217;ll create a simple flow using Node-RED to subscribe to those topics and display the readings on gauges.<\/p>\n\n\n\n<p>If you don&#8217;t have Node-RED installed, follow the next tutorials:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/randomnerdtutorials.com\/getting-started-with-node-red-on-raspberry-pi\/\">Getting Started with Node-RED on Raspberry Pi<\/a><\/li><li><a href=\"https:\/\/randomnerdtutorials.com\/getting-started-with-node-red-dashboard\/\">Installing and Getting Started with Node-RED Dashboard<\/a><\/li><\/ul>\n\n\n\n<p>Having Node-RED running on your Raspberry Pi, go to your Raspberry Pi IP address followed by :1880.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;raspberry-pi-ip-address:1880<\/code><\/pre>\n\n\n\n<p>The Node-RED interface should open. Drag four MQTT in nodes, two gauge nodes, and two text field nodes to the flow.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"246\" height=\"223\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/drag-nodes-esp32-esp8266-node-red-bme680.png?resize=246%2C223&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"Drag nodes ESP32 ESP8266 Node-RED BME680\" class=\"wp-image-99513\"\/><\/figure><\/div>\n\n\n\n<p>Click the MQTT node and edit its properties.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"498\" height=\"365\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/edit-mqtt-in-node-esp32-esp8266-node-red-bme680.png?resize=498%2C365&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"Edit mqtt in node ESP32 ESP8266 Node-RED BME680\" class=\"wp-image-99515\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/edit-mqtt-in-node-esp32-esp8266-node-red-bme680.png?w=498&amp;quality=100&amp;strip=all&amp;ssl=1 498w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/edit-mqtt-in-node-esp32-esp8266-node-red-bme680.png?resize=300%2C220&amp;quality=100&amp;strip=all&amp;ssl=1 300w\" sizes=\"(max-width: 498px) 100vw, 498px\" \/><\/figure><\/div>\n\n\n\n<p>The Server field refers to the MQTT broker. In our case, the MQTT broker is the Raspberry Pi, so it is set to localhost:1883. If you&#8217;re using a Cloud MQTT broker, you should change that field. <\/p>\n\n\n\n<p>Insert the topic you want to be subscribed to and the QoS. This previous MQTT node is subscribed to the <strong>esp\/bme680\/temperature<\/strong> topic. <\/p>\n\n\n\n<p>Click on the other MQTT in nodes and edit its properties with the same server, but for the other topics: <strong>esp\/bme680\/humidity<\/strong>, <strong>esp\/bme680\/pressure<\/strong>, and <strong>esp\/bme680\/gas<\/strong>. <\/p>\n\n\n\n<p>Click on the gauge nodes and edit its properties for each reading. The following node is set for the temperature readings. Edit the other chart nodes for the humidity readings.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"499\" height=\"567\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/edit-gauge-node-esp32-esp8266-node-red-bme680.png?resize=499%2C567&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"Edit gauge node ESP32 ESP8266 Node-RED BME680\" class=\"wp-image-99514\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/edit-gauge-node-esp32-esp8266-node-red-bme680.png?w=499&amp;quality=100&amp;strip=all&amp;ssl=1 499w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/edit-gauge-node-esp32-esp8266-node-red-bme680.png?resize=264%2C300&amp;quality=100&amp;strip=all&amp;ssl=1 264w\" sizes=\"(max-width: 499px) 100vw, 499px\" \/><\/figure><\/div>\n\n\n\n<p>Wire your nodes as shown below:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"408\" height=\"233\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/node-connected-esp32-esp8266-node-red-bme680.png?resize=408%2C233&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"Node connected ESP32 ESP8266 Node-RED BME680\" class=\"wp-image-99512\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/node-connected-esp32-esp8266-node-red-bme680.png?w=408&amp;quality=100&amp;strip=all&amp;ssl=1 408w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/node-connected-esp32-esp8266-node-red-bme680.png?resize=300%2C171&amp;quality=100&amp;strip=all&amp;ssl=1 300w\" sizes=\"(max-width: 408px) 100vw, 408px\" \/><\/figure><\/div>\n\n\n\n<p>Finally, deploy your flow (press the button on the upper right corner).<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"138\" height=\"40\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/06\/11_deploy_button.png?resize=138%2C40&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"Deploy Node-RED button\" class=\"wp-image-40013\"\/><\/figure><\/div>\n\n\n\n<p>Alternatively, you can go to <strong>Menu <\/strong>&gt; <strong>Import <\/strong>and copy the following to your <strong>Clipboard<\/strong> to create your Node-RED flow.<\/p>\n\n\n<pre style=\"max-height: 40em; margin-bottom: 20px;\"><code class=\"language-c\">[{&quot;id&quot;:&quot;3b7f947c.9759ec&quot;,&quot;type&quot;:&quot;mqtt in&quot;,&quot;z&quot;:&quot;254c9c97.f85b34&quot;,&quot;name&quot;:&quot;&quot;,&quot;topic&quot;:&quot;esp\/bme680\/temperature&quot;,&quot;qos&quot;:&quot;1&quot;,&quot;datatype&quot;:&quot;auto&quot;,&quot;broker&quot;:&quot;8db3fac0.99dd48&quot;,&quot;x&quot;:470,&quot;y&quot;:2640,&quot;wires&quot;:[[&quot;b87b21c3.96672&quot;]]},{&quot;id&quot;:&quot;b87b21c3.96672&quot;,&quot;type&quot;:&quot;ui_gauge&quot;,&quot;z&quot;:&quot;254c9c97.f85b34&quot;,&quot;name&quot;:&quot;&quot;,&quot;group&quot;:&quot;37de8fe8.46846&quot;,&quot;order&quot;:2,&quot;width&quot;:0,&quot;height&quot;:0,&quot;gtype&quot;:&quot;gage&quot;,&quot;title&quot;:&quot;Temperature&quot;,&quot;label&quot;:&quot;\u00baC&quot;,&quot;format&quot;:&quot;{{value}}&quot;,&quot;min&quot;:0,&quot;max&quot;:&quot;40&quot;,&quot;colors&quot;:[&quot;#00b500&quot;,&quot;#f7df09&quot;,&quot;#ca3838&quot;],&quot;seg1&quot;:&quot;&quot;,&quot;seg2&quot;:&quot;&quot;,&quot;x&quot;:690,&quot;y&quot;:2640,&quot;wires&quot;:[]},{&quot;id&quot;:&quot;f92248f4.545778&quot;,&quot;type&quot;:&quot;mqtt in&quot;,&quot;z&quot;:&quot;254c9c97.f85b34&quot;,&quot;name&quot;:&quot;&quot;,&quot;topic&quot;:&quot;esp\/bme680\/humidity&quot;,&quot;qos&quot;:&quot;1&quot;,&quot;datatype&quot;:&quot;auto&quot;,&quot;broker&quot;:&quot;8db3fac0.99dd48&quot;,&quot;x&quot;:460,&quot;y&quot;:2700,&quot;wires&quot;:[[&quot;4114a401.5ac69c&quot;]]},{&quot;id&quot;:&quot;4114a401.5ac69c&quot;,&quot;type&quot;:&quot;ui_gauge&quot;,&quot;z&quot;:&quot;254c9c97.f85b34&quot;,&quot;name&quot;:&quot;&quot;,&quot;group&quot;:&quot;37de8fe8.46846&quot;,&quot;order&quot;:2,&quot;width&quot;:0,&quot;height&quot;:0,&quot;gtype&quot;:&quot;gage&quot;,&quot;title&quot;:&quot;Humidity&quot;,&quot;label&quot;:&quot;%&quot;,&quot;format&quot;:&quot;{{value}}&quot;,&quot;min&quot;:&quot;30&quot;,&quot;max&quot;:&quot;100&quot;,&quot;colors&quot;:[&quot;#53a4e6&quot;,&quot;#1d78a9&quot;,&quot;#4e38c9&quot;],&quot;seg1&quot;:&quot;&quot;,&quot;seg2&quot;:&quot;&quot;,&quot;x&quot;:680,&quot;y&quot;:2700,&quot;wires&quot;:[]},{&quot;id&quot;:&quot;ad51f895.2c2848&quot;,&quot;type&quot;:&quot;mqtt in&quot;,&quot;z&quot;:&quot;254c9c97.f85b34&quot;,&quot;name&quot;:&quot;&quot;,&quot;topic&quot;:&quot;esp\/bme680\/pressure&quot;,&quot;qos&quot;:&quot;1&quot;,&quot;datatype&quot;:&quot;auto&quot;,&quot;broker&quot;:&quot;8db3fac0.99dd48&quot;,&quot;x&quot;:460,&quot;y&quot;:2760,&quot;wires&quot;:[[&quot;3a95123b.66405e&quot;]]},{&quot;id&quot;:&quot;c074e688.198b78&quot;,&quot;type&quot;:&quot;mqtt in&quot;,&quot;z&quot;:&quot;254c9c97.f85b34&quot;,&quot;name&quot;:&quot;&quot;,&quot;topic&quot;:&quot;esp\/bme680\/gas&quot;,&quot;qos&quot;:&quot;1&quot;,&quot;datatype&quot;:&quot;auto&quot;,&quot;broker&quot;:&quot;8db3fac0.99dd48&quot;,&quot;x&quot;:440,&quot;y&quot;:2820,&quot;wires&quot;:[[&quot;d3539c06.00a17&quot;]]},{&quot;id&quot;:&quot;3a95123b.66405e&quot;,&quot;type&quot;:&quot;ui_text&quot;,&quot;z&quot;:&quot;254c9c97.f85b34&quot;,&quot;group&quot;:&quot;37de8fe8.46846&quot;,&quot;order&quot;:2,&quot;width&quot;:0,&quot;height&quot;:0,&quot;name&quot;:&quot;&quot;,&quot;label&quot;:&quot;Pressure&quot;,&quot;format&quot;:&quot;{{msg.payload}} hPa&quot;,&quot;layout&quot;:&quot;row-spread&quot;,&quot;x&quot;:680,&quot;y&quot;:2760,&quot;wires&quot;:[]},{&quot;id&quot;:&quot;d3539c06.00a17&quot;,&quot;type&quot;:&quot;ui_text&quot;,&quot;z&quot;:&quot;254c9c97.f85b34&quot;,&quot;group&quot;:&quot;37de8fe8.46846&quot;,&quot;order&quot;:3,&quot;width&quot;:0,&quot;height&quot;:0,&quot;name&quot;:&quot;&quot;,&quot;label&quot;:&quot;Gas&quot;,&quot;format&quot;:&quot;{{msg.payload}} KOhm&quot;,&quot;layout&quot;:&quot;row-spread&quot;,&quot;x&quot;:670,&quot;y&quot;:2820,&quot;wires&quot;:[]},{&quot;id&quot;:&quot;8db3fac0.99dd48&quot;,&quot;type&quot;:&quot;mqtt-broker&quot;,&quot;z&quot;:&quot;&quot;,&quot;name&quot;:&quot;&quot;,&quot;broker&quot;:&quot;localhost&quot;,&quot;port&quot;:&quot;1883&quot;,&quot;clientid&quot;:&quot;&quot;,&quot;usetls&quot;:false,&quot;compatmode&quot;:false,&quot;keepalive&quot;:&quot;60&quot;,&quot;cleansession&quot;:true,&quot;birthTopic&quot;:&quot;&quot;,&quot;birthQos&quot;:&quot;0&quot;,&quot;birthPayload&quot;:&quot;&quot;,&quot;closeTopic&quot;:&quot;&quot;,&quot;closeQos&quot;:&quot;0&quot;,&quot;closePayload&quot;:&quot;&quot;,&quot;willTopic&quot;:&quot;&quot;,&quot;willQos&quot;:&quot;0&quot;,&quot;willPayload&quot;:&quot;&quot;},{&quot;id&quot;:&quot;37de8fe8.46846&quot;,&quot;type&quot;:&quot;ui_group&quot;,&quot;z&quot;:&quot;&quot;,&quot;name&quot;:&quot;BME680&quot;,&quot;tab&quot;:&quot;53b8c8f9.cfbe48&quot;,&quot;order&quot;:1,&quot;disp&quot;:true,&quot;width&quot;:&quot;6&quot;,&quot;collapse&quot;:false},{&quot;id&quot;:&quot;53b8c8f9.cfbe48&quot;,&quot;type&quot;:&quot;ui_tab&quot;,&quot;z&quot;:&quot;&quot;,&quot;name&quot;:&quot;Home&quot;,&quot;icon&quot;:&quot;dashboard&quot;,&quot;order&quot;:5,&quot;disabled&quot;:false,&quot;hidden&quot;:false}]\n<\/code><\/pre>\n\t<p style=\"text-align:center\"><a class=\"rntwhite\" href=\"https:\/\/github.com\/RuiSantosdotme\/Random-Nerd-Tutorials\/raw\/master\/Projects\/ESP32\/ESP32_MQTT\/ESP32_BME680_Flow.txt\" target=\"_blank\">View raw code<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Demonstration<\/h2>\n\n\n\n<p>Go to your Raspberry Pi IP address followed by <em>:1880\/ui<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;raspberry-pi-ip-address:1880\/ui<\/code><\/pre>\n\n\n\n<p>You should get access to the current BME680 sensor readings on the Dashboard. You can use other dashboard-type nodes to display the readings on different ways.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"646\" height=\"625\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/ESP32-ESP8266-Node-RED-BME680-Temperature-Humidity-Pressure-Gas-Air-Quality.png?resize=646%2C625&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP32 ESP8266 Node-RED BME680 Temperature Humidity Pressure Gas Air Quality\" class=\"wp-image-99518\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/ESP32-ESP8266-Node-RED-BME680-Temperature-Humidity-Pressure-Gas-Air-Quality.png?w=646&amp;quality=100&amp;strip=all&amp;ssl=1 646w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/ESP32-ESP8266-Node-RED-BME680-Temperature-Humidity-Pressure-Gas-Air-Quality.png?resize=300%2C290&amp;quality=100&amp;strip=all&amp;ssl=1 300w\" sizes=\"(max-width: 646px) 100vw, 646px\" \/><\/figure><\/div>\n\n\n\n<p>That&#8217;s it! You have your ESP board publishing BME680 temperature, humidity, pressure and gas resistance readings to Node-RED via MQTT.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wrapping Up<\/h2>\n\n\n\n<p>MQTT is a great communication protocol to exchange small amounts of data between devices. In this tutorial you&#8217;ve learned how to publish temperature, humidity, pressure and gas resistance readings from a BME680 environmental sensor with the ESP8266 to different MQTT topics. Then, you can use any device or home automation platform to subscribe to those topics and receive the readings. <\/p>\n\n\n\n<p>Instead of a BME680 sensor, you can use any other sensor like a <a href=\"https:\/\/makeradvisor.com\/tools\/ds18b20-digital-temperature-sensor\/\" target=\"_blank\" rel=\"noreferrer noopener\">DS18B20<\/a> temperature sensor, a <a href=\"https:\/\/makeradvisor.com\/tools\/dht22-temperature-humidity-sensor\/\" target=\"_blank\" rel=\"noreferrer noopener\">DHT22 <\/a>temperature and humidity sensor or a <a href=\"https:\/\/makeradvisor.com\/tools\/bme280-sensor-module\/\" target=\"_blank\" rel=\"noreferrer noopener\">BME280 <\/a>temperature, humidity and pressure sensor:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/randomnerdtutorials.com\/esp8266-nodemcu-mqtt-publish-ds18b20-arduino\/\">ESP8266 MQTT \u2013 Publish DS18B20 Temperature Readings <\/a><\/li><li><a href=\"https:\/\/randomnerdtutorials.com\/esp8266-nodemcu-mqtt-publish-dht11-dht22-arduino\/\">ESP8266 MQTT \u2013 Publish DHT22\/DHT11 Sensor Readings<\/a><\/li><li><a href=\"https:\/\/randomnerdtutorials.com\/esp8266-nodemcu-mqtt-publish-bme280-arduino\/\">ESP8266 MQTT \u2013 Publish BME280 Sensor Readings<\/a><\/li><\/ul>\n\n\n\n<p>We hope you&#8217;ve found this tutorial useful. If you want to learn more about the ESP8266, take a look at our resources:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/randomnerdtutorials.com\/home-automation-using-esp8266\/\">Home Automation Using ESP8266<\/a><\/li><li><a href=\"https:\/\/randomnerdtutorials.com\/micropython-programming-with-esp32-and-esp8266\/\">MicroPython Programming with ESP32 and ESP8266<\/a><\/li><li><a href=\"https:\/\/randomnerdtutorials.com\/projects-esp8266\/\">More ESP8266 NodeMCU Projects and Tutorials&#8230;<\/a><\/li><\/ul>\n\n\n\n<p>Thanks for reading.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Learn how to publish BME680 sensor readings (temperature, humidity, pressure and gas air quality) via MQTT with the ESP8266 NodeMCU to any platform that supports MQTT or any MQTT client. &#8230; <\/p>\n<p class=\"read-more-container\"><a title=\"ESP8266 NodeMCU MQTT \u2013 Publish BME680 Temperature, Humidity, Pressure, and Gas Readings (Arduino IDE)\" class=\"read-more button\" href=\"https:\/\/randomnerdtutorials.com\/esp8266-nodemcu-mqtt-publish-bme680-arduino\/#more-99497\" aria-label=\"Read more about ESP8266 NodeMCU MQTT \u2013 Publish BME680 Temperature, Humidity, Pressure, and Gas Readings (Arduino IDE)\">CONTINUE READING \u00bb<\/a><\/p>\n","protected":false},"author":1,"featured_media":99509,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[265,246,300,264],"tags":[],"class_list":["post-99497","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-esp8266-project","category-esp8266-arduino-ide","category-0-esp8266","category-project"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/10\/ESP8266-NodeMCU-MQTT-Publish-BME680-Temperature-Humidity-Pressure-Gas-Readings-Arduino-IDE.jpg?fit=1280%2C720&quality=100&strip=all&ssl=1","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/posts\/99497","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/comments?post=99497"}],"version-history":[{"count":0,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/posts\/99497\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/media\/99509"}],"wp:attachment":[{"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/media?parent=99497"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/categories?post=99497"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/tags?post=99497"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}