{"id":96350,"date":"2020-04-23T15:31:19","date_gmt":"2020-04-23T15:31:19","guid":{"rendered":"https:\/\/randomnerdtutorials.com\/?p=96350"},"modified":"2020-05-08T09:55:36","modified_gmt":"2020-05-08T09:55:36","slug":"esp8266-nodemcu-mqtt-publish-bme280-arduino","status":"publish","type":"post","link":"https:\/\/randomnerdtutorials.com\/esp8266-nodemcu-mqtt-publish-bme280-arduino\/","title":{"rendered":"ESP8266 NodeMCU MQTT &#8211; Publish BME280 Sensor Readings (Arduino IDE)"},"content":{"rendered":"\n<p>Learn how to publish BME280 sensor readings (temperature, humidity and pressure) via MQTT with the ESP8266 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\/04\/ESP8266-NodeMCU-BME280-Temperature-Humidity-Pressure-Sensor-MQTT-Publish-Arduino-IDE-Node-RED.jpg?resize=1200%2C675&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP8266 NodeMCU MQTT Publish BME280 Sensor Readings Arduino IDE\" class=\"wp-image-96353\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/04\/ESP8266-NodeMCU-BME280-Temperature-Humidity-Pressure-Sensor-MQTT-Publish-Arduino-IDE-Node-RED.jpg?w=1280&amp;quality=100&amp;strip=all&amp;ssl=1 1280w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/04\/ESP8266-NodeMCU-BME280-Temperature-Humidity-Pressure-Sensor-MQTT-Publish-Arduino-IDE-Node-RED.jpg?resize=300%2C169&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/04\/ESP8266-NodeMCU-BME280-Temperature-Humidity-Pressure-Sensor-MQTT-Publish-Arduino-IDE-Node-RED.jpg?resize=1024%2C576&amp;quality=100&amp;strip=all&amp;ssl=1 1024w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/04\/ESP8266-NodeMCU-BME280-Temperature-Humidity-Pressure-Sensor-MQTT-Publish-Arduino-IDE-Node-RED.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-large\"><img data-recalc-dims=\"1\" decoding=\"async\" width=\"871\" height=\"675\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/04\/ESP8266-NodeMCU-Publish-BME280-Readings-Node-RED.png?resize=871%2C675&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP8266 NodeMCU BME280 Publish Readings Node-Red MQTT How it works and project overview\" class=\"wp-image-96354\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/04\/ESP8266-NodeMCU-Publish-BME280-Readings-Node-RED.png?w=871&amp;quality=100&amp;strip=all&amp;ssl=1 871w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/04\/ESP8266-NodeMCU-Publish-BME280-Readings-Node-RED.png?resize=300%2C232&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/04\/ESP8266-NodeMCU-Publish-BME280-Readings-Node-RED.png?resize=768%2C595&amp;quality=100&amp;strip=all&amp;ssl=1 768w\" sizes=\"(max-width: 871px) 100vw, 871px\" \/><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li>The ESP8266 requests temperature readings from the BME280 sensor;<\/li><li>The temperature readings are published in the&nbsp;<strong>esp\/bme280\/temperature<\/strong>&nbsp;topic;<\/li><li>Humidity readings are published in the&nbsp;<strong>esp\/bme280\/humidity<\/strong>topic;<\/li><li>Pressure readings are published in the&nbsp;<strong>esp\/bme280\/pressure<\/strong> topic;<\/li><li>Node-RED is subscribed those topics;<\/li><li>Node-RED receives the sensor readings and displays them on gauges;<\/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 ESP8266 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 rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\" href=\"https:\/\/github.com\/marvinroger\/async-mqtt-client\" target=\"_blank\">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 href=\"https:\/\/github.com\/marvinroger\/async-mqtt-client\/archive\/master.zip\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\">Click here to download the Async MQTT client library<\/a>. You should have a .zip folder in your Downloads 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 ESPAsync TCP Library<\/strong><\/p>\n\n\n\n<p>To use MQTT with the ESP8266, you also need the&nbsp;<a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/me-no-dev\/ESPAsyncTCP\" target=\"_blank\">ESPAsync TCP library<\/a>.<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li><a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/me-no-dev\/ESPAsyncTCP\/archive\/master.zip\" target=\"_blank\">Click here to download the ESPAsync TCP client library<\/a>. You should have a .zip folder in your Downloads 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&nbsp;<\/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\">BME280 Sensor Libraries<\/h3>\n\n\n\n<p>To get readings from the BME280 sensor module, we&#8217;ll use the&nbsp;<a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/adafruit\/Adafruit_BME280_Library\" target=\"_blank\">Adafruit_BME280 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 bme280<\/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\/2018\/08\/install-bme280.png?resize=786%2C443&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"Installing BME280 library in Arduino IDE\" class=\"wp-image-70233\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2018\/08\/install-bme280.png?w=786&amp;quality=100&amp;strip=all&amp;ssl=1 786w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2018\/08\/install-bme280.png?resize=300%2C169&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2018\/08\/install-bme280.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 BME280 library, you also need to install the <a href=\"https:\/\/github.com\/adafruit\/Adafruit_Sensor\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Adafruit Unified Sensor (opens in a new tab)\">Adafruit Unified Sensor<\/a>. 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 BME280 sensor, read: <a href=\"https:\/\/randomnerdtutorials.com\/esp8266-bme280-arduino-ide\/\">ESP8266 with BME280 using Arduino IDE (Pressure, Temperature, Humidity)<\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Parts Required<\/h3>\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 rel=\"noreferrer noopener\" href=\"https:\/\/makeradvisor.com\/tools\/esp32-dev-board-wi-fi-bluetooth\/\" target=\"_blank\"><\/a><a rel=\"noreferrer noopener\" href=\"https:\/\/makeradvisor.com\/tools\/esp8266-esp-12e-nodemcu-wi-fi-development-board\/\" target=\"_blank\">ESP8266&nbsp;<\/a>(read&nbsp;<a rel=\"noreferrer noopener\" href=\"https:\/\/makeradvisor.com\/best-esp8266-wi-fi-development-board\/\" target=\"_blank\">Best ESP8266 development boards comparison<\/a>)<\/li><li><a rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\" href=\"https:\/\/makeradvisor.com\/tools\/bme280-sensor-module\/\" target=\"_blank\">BME280<\/a> &#8211; <a href=\"https:\/\/randomnerdtutorials.com\/esp8266-bme280-arduino-ide\/\">BME280 with ESP8266 Guide<\/a><\/li><li><a rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\" href=\"https:\/\/makeradvisor.com\/raspberry-pi-board\/\" target=\"_blank\">Raspberry Pi board<\/a>&nbsp;(read&nbsp;<a rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\" href=\"https:\/\/makeradvisor.com\/best-raspberry-pi-starter-kits\/\" target=\"_blank\">Best Raspberry Pi Starter Kits<\/a>)<\/li><li><a rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\" href=\"https:\/\/makeradvisor.com\/tools\/microsd-card-raspberry-pi-16gb-class-10\/\" target=\"_blank\">MicroSD Card \u2013 16GB Class10<\/a><\/li><li><a rel=\"noreferrer noopener\" aria-label=\" (opens in a new tab)\" 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 BME280 to the ESP8266 as shown in the following schematic diagram with the SDA pin connected to <span class=\"rnthl rntcgreen\">GPIO 4<\/span> and the SCL pin connected to <span class=\"rnthl rntcblue\">GPIO 5<\/span>.<\/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=\"672\" height=\"539\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2019\/06\/ESP8266-bme280_schematic.jpg?resize=672%2C539&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP8266 NodeMCU BME280 Temperature humidity Pressure sensor connected I2C schematic circuit diagram\" class=\"wp-image-86440\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2019\/06\/ESP8266-bme280_schematic.jpg?w=672&amp;quality=100&amp;strip=all&amp;ssl=1 672w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2019\/06\/ESP8266-bme280_schematic.jpg?resize=300%2C241&amp;quality=100&amp;strip=all&amp;ssl=1 300w\" sizes=\"(max-width: 672px) 100vw, 672px\" \/><\/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-bme280-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;Wire.h&gt;\n#include &lt;Adafruit_Sensor.h&gt;\n#include &lt;Adafruit_BME280.h&gt;\n#include &lt;ESP8266WiFi.h&gt;\n#include &lt;Ticker.h&gt;\n#include &lt;AsyncMqttClient.h&gt;\n\n#define WIFI_SSID &quot;REPLACE_WITH_YOUR_SSID&quot;\n#define WIFI_PASSWORD &quot;REPLACE_WITH_YOUR_PASSWORD&quot;\n\n\/\/ Raspberri 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\/bme280\/temperature&quot;\n#define MQTT_PUB_HUM &quot;esp\/bme280\/humidity&quot;\n#define MQTT_PUB_PRES &quot;esp\/bme280\/pressure&quot;\n\n\/\/ BME280 I2C\nAdafruit_BME280 bme;\n\/\/ Variables to hold sensor readings\nfloat temp;\nfloat hum;\nfloat pres;\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 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  \/\/ Initialize BME280 sensor \n  if (!bme.begin(0x76)) {\n    Serial.println(&quot;Could not find a valid BME280 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  \n  connectToWifi();\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    \/\/ New BME280 sensor readings\n    temp = bme.readTemperature();\n    \/\/temp = 1.8*bme.readTemperature() + 32;\n    hum = bme.readHumidity();\n    pres = bme.readPressure()\/100.0F;\n    \n    \/\/ Publish an MQTT message on topic esp\/bme280\/temperature\n    uint16_t packetIdPub1 = mqttClient.publish(MQTT_PUB_TEMP, 1, true, String(temp).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;, temp);\n\n    \/\/ Publish an MQTT message on topic esp\/bme280\/humidity\n    uint16_t packetIdPub2 = mqttClient.publish(MQTT_PUB_HUM, 1, true, String(hum).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;, hum);\n\n    \/\/ Publish an MQTT message on topic esp\/bme280\/pressure\n    uint16_t packetIdPub3 = mqttClient.publish(MQTT_PUB_PRES, 1, true, String(pres).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: %.3f \\n&quot;, pres);\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_BME280.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;Wire.h>\n#include &lt;Adafruit_Sensor.h>\n#include &lt;Adafruit_BME280.h>\n#include &lt;ESP8266WiFi.h>\n#include &lt;Ticker.h>\n#include &lt;AsyncMqttClient.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\/bme280\/temperature\"\n#define MQTT_PUB_HUM \"esp\/bme280\/humidity\"\n#define MQTT_PUB_PRES \"esp\/bme280\/pressure\"<\/code><\/pre>\n\n\n\n<p>Initialize a <span class=\"rnthl rntliteral\">Adafruit_BME280<\/span> object called <span class=\"rnthl rntliteral\">bme<\/span>.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>Adafruit_BME280 bme;<\/code><\/pre>\n\n\n\n<p>The <span class=\"rnthl rntliteral\">temp<\/span>, <span class=\"rnthl rntliteral\">hum<\/span> and <span class=\"rnthl rntliteral\">pres<\/span> variables will hold the temperature, humidity and pressure values from the BME280 sensor.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>float temp;\nfloat hum;\nfloat pres;<\/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;  \/\/ Stores last time temperature was published\nconst long interval = 10000;       \/\/ Interval at which to publish sensor readings<\/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...\");\n  mqttClient.connect();\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  if (WiFi.isConnected()) { \n    xTimerStart(mqttReconnectTimer, 0);\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 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>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>In the <span class=\"rnthl rntliteral\">setup()<\/span>, initialize the BME280 sensor.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>if (!bme.begin(0x76)) {\n  Serial.println(\"Could not find a valid BME280 sensor, check wiring!\");\n  while (1);\n}<\/code><\/pre>\n\n\n\n<p>The next two lines create handlers that will allow both the MQTT broker and Wi-Fi connection to reconnect, in case the connection is lost.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect);\nwifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect);<\/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>Finally, connect to Wi-Fi.<\/p>\n\n\n\n<pre class=\"wp-block-code language-c\"><code>connectToWifi();<\/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 will allow you to get new readings from the BME280 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  \/\/ New BME280 sensor readings\n  temp = bme.readTemperature();\n  \/\/temp = 1.8*bme.readTemperature() + 32;\n  hum = bme.readHumidity();\n  pres = bme.readPressure()\/100.0F;<\/code><\/pre>\n\n\n\n<p class=\"rntbox rntclblue\">Learn more about getting readings from the BME280 sensor: <a href=\"https:\/\/randomnerdtutorials.com\/esp8266-bme280-arduino-ide\/\">ESP8266 with BME280 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(temp).c_str());\nuint16_t packetIdPub2 = mqttClient.publish(MQTT_PUB_HUM, 1, true, String(hum).c_str());\nuint16_t packetIdPub3 = mqttClient.publish(MQTT_PUB_PRES, 1, true, String(pres).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-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"828\" height=\"475\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/04\/publish-BME280-readings-MQTTT-ESP8266-NodeMCU.png?resize=828%2C475&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP8266 NodeMCU Publish BME280 Sensor Readings MQTT Serial Monitor\" class=\"wp-image-96355\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/04\/publish-BME280-readings-MQTTT-ESP8266-NodeMCU.png?w=828&amp;quality=100&amp;strip=all&amp;ssl=1 828w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/04\/publish-BME280-readings-MQTTT-ESP8266-NodeMCU.png?resize=300%2C172&amp;quality=100&amp;strip=all&amp;ssl=1 300w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/04\/publish-BME280-readings-MQTTT-ESP8266-NodeMCU.png?resize=768%2C441&amp;quality=100&amp;strip=all&amp;ssl=1 768w\" sizes=\"(max-width: 828px) 100vw, 828px\" \/><\/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 temperature readings every 10 seconds on the <strong>esp\/bme280\/temperature<\/strong>, <strong>esp\/bme280\/humidity<\/strong>, and <strong>esp\/bme280\/pressure<\/strong> 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 three MQTT in nodes, and three gauge 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=\"288\" height=\"169\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/03\/0-Node-RED-Drag-6-Nodes-MQTT-In-Chart-Gauge.png?resize=288%2C169&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"Node-RED Drag 6 Nodes MQTT In nodes and Gauges\" class=\"wp-image-95474\"\/><\/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-large is-resized\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/04\/MQTT-In-Node-ESP32-ESP8266-Publish-Temperature-Humidity-Pressure-Node-RED-Flow.png?resize=470%2C345&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"MQTT In Node ESP8266 Publish Temperature Node-RED Flow\" class=\"wp-image-95827\" width=\"470\" height=\"345\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/04\/MQTT-In-Node-ESP32-ESP8266-Publish-Temperature-Humidity-Pressure-Node-RED-Flow.png?w=627&amp;quality=100&amp;strip=all&amp;ssl=1 627w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/04\/MQTT-In-Node-ESP32-ESP8266-Publish-Temperature-Humidity-Pressure-Node-RED-Flow.png?resize=300%2C220&amp;quality=100&amp;strip=all&amp;ssl=1 300w\" sizes=\"(max-width: 470px) 100vw, 470px\" \/><\/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\/bme280\/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\/bme280\/humidity<\/strong> and <strong>esp\/bme280\/pressure<\/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 other readings.<\/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=\"498\" height=\"600\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/03\/1-ESP32-Gauge-Temperature-Node-RED-Flow.png?resize=498%2C600&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP8266 NodeMCU Gauge Temperature Node-RED Flow\" class=\"wp-image-95475\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/03\/1-ESP32-Gauge-Temperature-Node-RED-Flow.png?w=498&amp;quality=100&amp;strip=all&amp;ssl=1 498w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/03\/1-ESP32-Gauge-Temperature-Node-RED-Flow.png?resize=249%2C300&amp;quality=100&amp;strip=all&amp;ssl=1 249w\" sizes=\"(max-width: 498px) 100vw, 498px\" \/><\/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=\"582\" height=\"267\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/04\/ESP32-MQTT-Publish-BME280-Temperature-Humidity-Pressure-Node-RED-Flow.png?resize=582%2C267&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP8266 NodeMCU MQTT Publish Temperature Humidity Pressure Node-RED Flow\" class=\"wp-image-95825\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/04\/ESP32-MQTT-Publish-BME280-Temperature-Humidity-Pressure-Node-RED-Flow.png?w=582&amp;quality=100&amp;strip=all&amp;ssl=1 582w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/04\/ESP32-MQTT-Publish-BME280-Temperature-Humidity-Pressure-Node-RED-Flow.png?resize=300%2C138&amp;quality=100&amp;strip=all&amp;ssl=1 300w\" sizes=\"(max-width: 582px) 100vw, 582px\" \/><\/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;5a45b8da.52b0d8&quot;,&quot;type&quot;:&quot;mqtt in&quot;,&quot;z&quot;:&quot;b01416d3.f69f38&quot;,&quot;name&quot;:&quot;&quot;,&quot;topic&quot;:&quot;esp\/bme280\/temperature&quot;,&quot;qos&quot;:&quot;1&quot;,&quot;datatype&quot;:&quot;auto&quot;,&quot;broker&quot;:&quot;8db3fac0.99dd48&quot;,&quot;x&quot;:310,&quot;y&quot;:60,&quot;wires&quot;:[[&quot;3042e15e.80a4ee&quot;]]},{&quot;id&quot;:&quot;3042e15e.80a4ee&quot;,&quot;type&quot;:&quot;ui_gauge&quot;,&quot;z&quot;:&quot;b01416d3.f69f38&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;:590,&quot;y&quot;:60,&quot;wires&quot;:[]},{&quot;id&quot;:&quot;8ff168f0.0c74a8&quot;,&quot;type&quot;:&quot;mqtt in&quot;,&quot;z&quot;:&quot;b01416d3.f69f38&quot;,&quot;name&quot;:&quot;&quot;,&quot;topic&quot;:&quot;esp\/bme280\/humidity&quot;,&quot;qos&quot;:&quot;1&quot;,&quot;datatype&quot;:&quot;auto&quot;,&quot;broker&quot;:&quot;8db3fac0.99dd48&quot;,&quot;x&quot;:300,&quot;y&quot;:140,&quot;wires&quot;:[[&quot;29251f29.6687c&quot;]]},{&quot;id&quot;:&quot;29251f29.6687c&quot;,&quot;type&quot;:&quot;ui_gauge&quot;,&quot;z&quot;:&quot;b01416d3.f69f38&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;:580,&quot;y&quot;:140,&quot;wires&quot;:[]},{&quot;id&quot;:&quot;294f7eea.999d72&quot;,&quot;type&quot;:&quot;mqtt in&quot;,&quot;z&quot;:&quot;b01416d3.f69f38&quot;,&quot;name&quot;:&quot;&quot;,&quot;topic&quot;:&quot;esp\/bme280\/pressure&quot;,&quot;qos&quot;:&quot;1&quot;,&quot;datatype&quot;:&quot;auto&quot;,&quot;broker&quot;:&quot;8db3fac0.99dd48&quot;,&quot;x&quot;:300,&quot;y&quot;:220,&quot;wires&quot;:[[&quot;58610d70.bb9764&quot;]]},{&quot;id&quot;:&quot;58610d70.bb9764&quot;,&quot;type&quot;:&quot;ui_gauge&quot;,&quot;z&quot;:&quot;b01416d3.f69f38&quot;,&quot;name&quot;:&quot;&quot;,&quot;group&quot;:&quot;37de8fe8.46846&quot;,&quot;order&quot;:4,&quot;width&quot;:0,&quot;height&quot;:0,&quot;gtype&quot;:&quot;gage&quot;,&quot;title&quot;:&quot;Pressure&quot;,&quot;label&quot;:&quot;hPa&quot;,&quot;format&quot;:&quot;{{value}}&quot;,&quot;min&quot;:0,&quot;max&quot;:&quot;1200&quot;,&quot;colors&quot;:[&quot;#b366ff&quot;,&quot;#8000ff&quot;,&quot;#440088&quot;],&quot;seg1&quot;:&quot;&quot;,&quot;seg2&quot;:&quot;&quot;,&quot;x&quot;:580,&quot;y&quot;:220,&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;BME280&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;:2,&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\/ESP-MicroPython\/MQTT\/esp_bme280_mqtt_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 BME280 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-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"822\" height=\"842\" src=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/03\/5-ESP32-MQTT-Publish-Temperature-Humidity-Pressure-Node-RED-Dashboard.png?resize=822%2C842&#038;quality=100&#038;strip=all&#038;ssl=1\" alt=\"ESP8266 NodeMCU MQTT Publish Temperature Humidity Pressure Node-RED Dashboard\" class=\"wp-image-95478\" srcset=\"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/03\/5-ESP32-MQTT-Publish-Temperature-Humidity-Pressure-Node-RED-Dashboard.png?w=822&amp;quality=100&amp;strip=all&amp;ssl=1 822w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/03\/5-ESP32-MQTT-Publish-Temperature-Humidity-Pressure-Node-RED-Dashboard.png?resize=293%2C300&amp;quality=100&amp;strip=all&amp;ssl=1 293w, https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/03\/5-ESP32-MQTT-Publish-Temperature-Humidity-Pressure-Node-RED-Dashboard.png?resize=768%2C787&amp;quality=100&amp;strip=all&amp;ssl=1 768w\" sizes=\"(max-width: 822px) 100vw, 822px\" \/><\/figure><\/div>\n\n\n\n<p>That&#8217;s it! You have your ESP8266 board publishing BME280 temperature, humidity and pressure 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 and pressure readings from a BME280 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 BME280, you can use any a different 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 <strong>DS18B20<\/strong> Temperature Readings<\/a><\/li><li><a href=\"https:\/\/randomnerdtutorials.com\/esp8266-nodemcu-mqtt-publish-dht11-dht22-arduino\/\">ESP8266 MQTT \u2013 Publish <strong>DHT11\/DHT22<\/strong> Temperature and Humidity 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\/learn-esp32-with-arduino-ide\/\"><\/a><a href=\"https:\/\/randomnerdtutorials.com\/home-automation-using-esp8266\/\">Home Automation using ESP8266<\/a><\/li><li><a href=\"https:\/\/randomnerdtutorials.com\/learn-esp32-with-arduino-ide\/\"><\/a><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\/learn-esp32-with-arduino-ide\/\"><\/a><a href=\"https:\/\/randomnerdtutorials.com\/projects-esp8266\/\">More ESP8266 NodeMCU Projects\u2026<\/a><\/li><\/ul>\n\n\n\n<p>Thanks for reading.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Learn how to publish BME280 sensor readings (temperature, humidity and pressure) via MQTT with the ESP8266 to any platform that supports MQTT or any MQTT client. As an example, we&#8217;ll &#8230; <\/p>\n<p class=\"read-more-container\"><a title=\"ESP8266 NodeMCU MQTT &#8211; Publish BME280 Sensor Readings (Arduino IDE)\" class=\"read-more button\" href=\"https:\/\/randomnerdtutorials.com\/esp8266-nodemcu-mqtt-publish-bme280-arduino\/#more-96350\" aria-label=\"Read more about ESP8266 NodeMCU MQTT &#8211; Publish BME280 Sensor Readings (Arduino IDE)\">CONTINUE READING \u00bb<\/a><\/p>\n","protected":false},"author":5,"featured_media":96353,"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,214,246,300,240,264],"tags":[],"class_list":["post-96350","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-esp8266-project","category-esp8266","category-esp8266-arduino-ide","category-0-esp8266","category-esp8266-projects","category-project"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2020\/04\/ESP8266-NodeMCU-BME280-Temperature-Humidity-Pressure-Sensor-MQTT-Publish-Arduino-IDE-Node-RED.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\/96350","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\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/comments?post=96350"}],"version-history":[{"count":0,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/posts\/96350\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/media\/96353"}],"wp:attachment":[{"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/media?parent=96350"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/categories?post=96350"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/randomnerdtutorials.com\/wp-json\/wp\/v2\/tags?post=96350"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}