ESP8266 and Node-RED with MQTT (Publish and Subscribe)

In this post we’re going to show you how to control ESP8266 outputs and display sensor data from the ESP8266 on Node-RED. The Node-RED software is running on a Raspberry Pi, and the communication between the ESP8266 and the Node-RED software is achieved with the MQTT communication protocol.

The following figure shows an overview of what we’re going to do in this tutorial.

First, watch the video demonstration below

Node-RED and Node-RED Dashboard

You need to have Node-RED and Node-RED Dashboard installed in your Raspberry Pi. The following blog posts are useful for getting started with Node-RED and Node-RED dashboard:

MQTT Protocol

In this tutorial we’re going to establish a communication between a Raspberry Pi running the Node-RED software and an ESP8266 using MQTT.

MQTT stands for MQ Telemetry Transport and it is a nice lightweight publish and subscribe system where you can publish and receive messages as a client. It is a simple messaging protocol, designed for constrained devices and with low-bandwidth. So, it’s the perfect solution for Internet of Things applications.

If you want to learn more about MQTT, watch the video below.

For a written version of this video and additional resources, read this blog post What is MQTT and How It Works.

Installing Mosquitto Broker

In MQTT, the broker is primarily responsible for receiving all messages, filtering the messages, decide who is interested in it and then publishing the message to all subscribed clients.

There are several brokers you can use. In this tutorial we’re going to use the Mosquitto Broker which needs to be installed on Raspberry Pi.

To install the Mosquitto broker on Raspberry Pi follow this tutorial: How to Install Mosquitto Broker on Raspberry Pi.

Testing

To see if Mosquitto broker was successfully installed, run the next command:

[email protected]:~ $ mosquitto -v

This returns the Mosquitto version that is currently running in your Raspberry Pi. It should be 1.4 or above.

Note: the Mosquitto command returns the Mosquitto version that is currently installed, but it also tries to initialize Mosquitto again. Since Mosquitto is already running it prompts an error message. Don’t worry Mosquitto is properly installed and running if you see a similar message.

Establishing an MQTT communication with Node-RED

In this section we’re going to establish an MQTT communication using the Node-RED nodes.

Dashboard Layout

The first step is to create the dashboard layout. In this example, we’ll have a button to control an ESP8266 output; a chart and a gauge to display temperature and humidity readings from the DHT11 sensor.

On the top right corner of the Node-RED window, select the Layout tab under the dashboard tab. Create a tab called Room and inside the Room tab, create two groups: Lamp and Sensor as shown in figure below.

Creating the Flow

Drag the following nodes to the flow – see figure below:

  • switch – this will control the ESP8266 output
  • mqtt output node – this will publish a message to the ESP8266 accordingly to the switch state
  • 2x mqtt input nodes – this nodes will be subscribed to the temperature and humidity topics to receive sensor data from the ESP
  • chart – will display the temperature sensor readings
  • gauge – will display the humidity sensor readings

Node-RED and the MQTT broker need to be connected. To connect the MQTT broker to Node-REd, double-click the MQTT output node. A new window pops up – as shown in figure below.

  1. Click the Add new mqtt-broker option.
  2. Type localhost in the server field
  3. All the other settings are configured properly by default.
  4. Press Add and the MQTT output node automatically connects to your broker.

Edit all the other nodes properties as shown in the following figures:

  • switch – the switch sends an on  string message when it’s on; and sends an off string message when it’s off. This node will publish on the room/lamp topic. Your ESP will then be subscribed to this topic, to receive its messages.
  • mqtt output node. This node is connected to the mosquitto broker and it will publish in the room/lamp topic.
  • mqtt input node. This node is subscribed to the room/temperature topic to receive temperature sensor data from the ESP8266. The ESP8266 will be pusblishing the temperature readings on this topic.
  • chart. The chart will display the readings received on the room/temperature topic.
  • mqtt input node. This node is subscribed to the room/humidity topic to receive humidity sensor data from the ESP8266. The ESP8266 will be pusblishing the humidity readings on this same topic.
  • gauge. The gauge will display the readings received on the room/humidity topic.

Wire your nodes as shown in the figure below.

Your Node-RED application is ready. Click the Deploy button on the top right corner.

The Node-RED application is ready. To see how your dashboard looks go to  http://your-pi-ip-address/ui.

Now, follow the next sections to prepare your ESP8266.

Preparing your Arduino IDE

We’ll program the ESP8266 using the Arduino IDE. In order to upload code to your ESP8266 using the Arduino IDE, you need to install the ESP8266 add-on (How to Install the ESP8266 Board in Arduino IDE). You’ll also need to install two additional libraries to have everything ready for your ESP8266.

Installing the PubSubClient Library

The PubSubClient library provides a client for doing simple publish/subscribe messaging with a server that supports MQTT (basically allows your ESP8266 to talk with Node-RED).

1) Click here to download the PubSubClient library. You should have a .zip folder in your Downloads folder

2) Unzip the .zip folder and you should get pubsubclient-master folder

3) Rename your folder from pubsubclient-master to pubsubclient

4) Move the pubsubclient folder to your Arduino IDE installation libraries folder

5) Then, re-open your Arduino IDE

The library comes with a number of example sketches. See File >Examples > PubSubClient within the Arduino IDE software.

Installing the DHT Sensor Library

The DHT sensor library provides an easy way of using any DHT sensor to read temperature and humidity with your ESP8266 or Arduino boards.

1) Click here to download the DHT sensor library. You should have a .zip folder in your Downloads

2) Unzip the .zip folder and you should get DHT-sensor-library-master folder

3) Rename your folder from DHT-sensor-library-master to DHT

4) Move the DHT folder to your Arduino IDE installation libraries folder

5) Then re-open your Arduino IDE

For more information about the DHT11 sensor and the ESP8266, read ESP8266 DHT11/DHT22 Temperature and Humidity Web Server with Arduino IDE.

Selecting the right board on Arduino IDE

You also need to select the right board on Arduino IDE:

1) Go to Tools and select “NodeMCU 1.0 (ESP-12E Module)”.

2) Select your ESP port number under the Tools > Port > COM4 (in my case)

Uploading code

Now, you can upload the following code to your ESP8266. This code publishes messages of the temperature and humidity from the DHT11 sensor on the room/temperature and room/humidity topics trough MQTT protocol.

The ESP is subscribed to the room/lamp topic to receive the messages published on that topic by the Node-RED application, to turn the lamp on or off.

The code is well commented on where you need to make changes. You need to edit the code with your own SSID, password and RPi IP address.

This code is also compatible with other DHT sensors – you just need to uncomment and comment the right lines of code to chose your sensor.

/*****
 
 All the resources for this project:
 https://randomnerdtutorials.com/
 
*****/

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"

// Uncomment one of the lines bellow for whatever DHT sensor type you're using!
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321

// Change the credentials below, so your ESP8266 connects to your router
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

// Change the variable to your Raspberry Pi IP address, so it connects to your MQTT broker
const char* mqtt_server = "REPLACE_WITH_YOUR_RPI_IP_ADDRESS";

// Initializes the espClient. You should change the espClient name if you have multiple ESPs running in your home automation system
WiFiClient espClient;
PubSubClient client(espClient);

// DHT Sensor - GPIO 5 = D1 on ESP-12E NodeMCU board
const int DHTPin = 5;

// Lamp - LED - GPIO 4 = D2 on ESP-12E NodeMCU board
const int lamp = 4;

// Initialize DHT sensor.
DHT dht(DHTPin, DHTTYPE);

// Timers auxiliar variables
long now = millis();
long lastMeasure = 0;

// Don't change the function below. This functions connects your ESP8266 to your router
void setup_wifi() {
  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("WiFi connected - ESP IP address: ");
  Serial.println(WiFi.localIP());
}

// This functions is executed when some device publishes a message to a topic that your ESP8266 is subscribed to
// Change the function below to add logic to your program, so when a device publishes a message to a topic that 
// your ESP8266 is subscribed you can actually do something
void callback(String topic, byte* message, unsigned int length) {
  Serial.print("Message arrived on topic: ");
  Serial.print(topic);
  Serial.print(". Message: ");
  String messageTemp;
  
  for (int i = 0; i < length; i++) {
    Serial.print((char)message[i]);
    messageTemp += (char)message[i];
  }
  Serial.println();

  // Feel free to add more if statements to control more GPIOs with MQTT

  // If a message is received on the topic room/lamp, you check if the message is either on or off. Turns the lamp GPIO according to the message
  if(topic=="room/lamp"){
      Serial.print("Changing Room lamp to ");
      if(messageTemp == "on"){
        digitalWrite(lamp, HIGH);
        Serial.print("On");
      }
      else if(messageTemp == "off"){
        digitalWrite(lamp, LOW);
        Serial.print("Off");
      }
  }
  Serial.println();
}

// This functions reconnects your ESP8266 to your MQTT broker
// Change the function below if you want to subscribe to more topics with your ESP8266 
void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    /*
     YOU MIGHT NEED TO CHANGE THIS LINE, IF YOU'RE HAVING PROBLEMS WITH MQTT MULTIPLE CONNECTIONS
     To change the ESP device ID, you will have to give a new name to the ESP8266.
     Here's how it looks:
       if (client.connect("ESP8266Client")) {
     You can do it like this:
       if (client.connect("ESP1_Office")) {
     Then, for the other ESP:
       if (client.connect("ESP2_Garage")) {
      That should solve your MQTT multiple connections problem
    */
    if (client.connect("ESP8266Client")) {
      Serial.println("connected");  
      // Subscribe or resubscribe to a topic
      // You can subscribe to more topics (to control more LEDs in this example)
      client.subscribe("room/lamp");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

// The setup function sets your ESP GPIOs to Outputs, starts the serial communication at a baud rate of 115200
// Sets your mqtt broker and sets the callback function
// The callback function is what receives messages and actually controls the LEDs
void setup() {
  pinMode(lamp, OUTPUT);
  
  dht.begin();
  
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

}

// For this project, you don't need to change anything in the loop function. Basically it ensures that you ESP is connected to your broker
void loop() {

  if (!client.connected()) {
    reconnect();
  }
  if(!client.loop())
    client.connect("ESP8266Client");

  now = millis();
  // Publishes new temperature and humidity every 30 seconds
  if (now - lastMeasure > 30000) {
    lastMeasure = now;
    // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
    float h = dht.readHumidity();
    // Read temperature as Celsius (the default)
    float t = dht.readTemperature();
    // Read temperature as Fahrenheit (isFahrenheit = true)
    float f = dht.readTemperature(true);

    // Check if any reads failed and exit early (to try again).
    if (isnan(h) || isnan(t) || isnan(f)) {
      Serial.println("Failed to read from DHT sensor!");
      return;
    }

    // Computes temperature values in Celsius
    float hic = dht.computeHeatIndex(t, h, false);
    static char temperatureTemp[7];
    dtostrf(hic, 6, 2, temperatureTemp);
    
    // Uncomment to compute temperature values in Fahrenheit 
    // float hif = dht.computeHeatIndex(f, h);
    // static char temperatureTemp[7];
    // dtostrf(hic, 6, 2, temperatureTemp);
    
    static char humidityTemp[7];
    dtostrf(h, 6, 2, humidityTemp);

    // Publishes Temperature and Humidity values
    client.publish("room/temperature", temperatureTemp);
    client.publish("room/humidity", humidityTemp);
    
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t Temperature: ");
    Serial.print(t);
    Serial.print(" *C ");
    Serial.print(f);
    Serial.print(" *F\t Heat index: ");
    Serial.print(hic);
    Serial.println(" *C ");
    // Serial.print(hif);
    // Serial.println(" *F");
  }
} 

View raw code

After uploading the code, and with the Raspberry Pi running your Node-RED application and the Mosquitto broker, you can open the Arduino IDE serial monitor at a baud rate of 115200 and see what’s happening in real time.

This is helpful to check if the ESP has established a successful connection to your router and to the Mosquitto broker. You can also see the messages the ESP is receiving and publishing.

Building the Circuit

The following sections show you the needed parts and schematics to build the circuit for this project.

Parts required

These are the parts required to build the circuit (click the links below to find the best price at Maker Advisor):

You can use the preceding links or go directly to MakerAdvisor.com/tools to find all the parts for your projects at the best price!

Schematics

Here are the schematics for this project’s circuit.

Demonstration

Congratulations! You project is now completed.

Go to http://your-pi-ip-address/ui to control the ESP with the  Node-RED application. You can access your application in any browser on the same network that your Pi (watch the video demonstration below).

The application should look something the figure below.

Wrapping up

In this tutorial we’ve shown you the basic concepts that will allow you to turn on lights and monitor sensors on your ESP using Node-RED and the MQTT communication protocol. You can follow these basic steps to build more advanced projects.

We hope you’ve found this tutorial useful.

If you liked this project and Home Automation make sure you check our course: Build a Home Automation System for $100.



Learn how to program and build projects with the ESP32 and ESP8266 using MicroPython firmware DOWNLOAD »

Learn how to program and build projects with the ESP32 and ESP8266 using MicroPython firmware DOWNLOAD »


Enjoyed this project? Stay updated by subscribing our weekly newsletter!

75 thoughts on “ESP8266 and Node-RED with MQTT (Publish and Subscribe)”

  1. Great intro. I love it! You guys are awesome.
    One note of caution to new users though regarding using charts; I had a dashboard set up with about 6 charts and after a day or two the pi became VERY slow. I’m not sure why or if this problem was fixed in the recent node-red update but be aware that if you have a lot of charts and you pi gets very sluggish you need to remove the charts or reboot the pi.
    Bruster

    Reply
  2. Very nice Tutorial and very well commented Sketch. Thank You! (P.S.: some Mosquitto Servers, like mine, expect Username and Password to get connected to. In that case change line 108 of the sketch to:
    if (client.connect(“ESP8266Client”,[username],[password])) {

    Reply
  3. connected…yeey 🙂
    local ip
    172.20.1.78
    Attempting MQTT connection…failed, rc=-2 try again in 5 seconds
    Attempting MQTT connection…failed, rc=-2 try again in 5 seconds
    Attempting MQTT connection…failed, rc=-2 try again in 5 seconds
    Attempting MQTT connection…

    how to solve upword trouble ,itz didn’t connct to mqtt

    Reply
    • Hi.
      You either need to:
      – start the mosquitto broker, or
      – you have the wrong IP address for the mosquitto broker in your Arduino code, or
      – you have multiple ESPs in your network with the same name, causing a conflict with the mosquitto broker.

      Reply
    • Hi James.
      If you want to use the temperature sensor with the Rapsberry Pi, without Node-RED, you can use the DHT python library.
      Take a look at look at the library here: github.com/adafruit/Adafruit_Python_DHT
      I hope this helps.
      Regards,
      Sara 🙂

      Reply
  4. Great tutorial! Thanks very much, really helped get me started! Only issue i had was with the lamp turning on and off, after a bit of investigation it turned out that the NodeRed output default of the switch node is “true” and “false” not “on” and “off”, after minor code change everything worked!

    Reply
  5. Hi Rui,
    I have a general sort of question:
    – It looks to me like all projects, either using ESP8266 or Raspberry Pi rely on using a home LAN, Wifi, etc. However, what if you want to build a, say, robot to use away from Wifi out in the field what do you use then? or what if you build a project and you want to demo at your friend’s place who has a different LAN. How do you become independent of the local LAN? can you use an access point with some private IP to link all your devices to it? Thanks.

    Reply
    • Good question!

      When I ask this question to myself, a couple of months ago, I ended with 2 approaches:

      1) I defined an array of ssid/passwords of some wifi networks (home, office, and so on…). The ESP8266 will try to connect to first one available. PROBLEM: you can be on a different place and so… no knew wifi to connect to…!

      2) I programmed the ESP8266 as a DHCP server with it’s own sub-net (let’s say, for example: 192.168.5.x) and the other devices will be DHCP clients of the ESP8266. PROBLEM: wired devices; if you want to connect your home desktop computer to the ESP, you’ll need to do a lot of changes…

      Reply
  6. Hi maam,
    A very nice tutorial maam.
    Im having a problem with the temperature reading.
    Im not getting a reading for temperature but im getting a reading for humidity.
    Ive connected a messsage payload at the output and it returns an empty string.
    Awaiting Your reply ASAP.
    Thanking you.

    Reply
    • Hi.
      That is very weird.
      Maybe the sensor is failing to get temperature readings.
      Can you try the basic example and see if the sensor is working properly: github.com/adafruit/DHT-sensor-library/blob/master/examples/DHTtester/DHTtester.ino
      Regards,
      Sara

      Reply
  7. Hi.I have problem with this code when I upload this code to Node MCU .Like this .I don’t know what I need to do .
    Error: Exist status 1.Error compiling for board node MCU 1.0 🙂

    Reply
    • Hi.
      Please make sure that you’ve installed all the necessary libraries.
      You also need to install this library (not mentioned in the tutorial, we need to update it): github.com/adafruit/Adafruit_Sensor
      Regards,
      Sara

      Reply
  8. Hi,

    I created the dashboard on node-red step by step and burned the code into nodemcu as well. But NodeMCU and node-RED are not communicating with each other. I checked the arduino serial monitor and its giving this error.
    Attempting MQTT connection…failed, rc=5 try again in 5 seconds
    Kindly help me how to fix this bug. I really need your help mam.

    Reply
  9. Excellent tutorial!!!! Thanks a lot! I follow you from “starting with raspberry PI” until turn on the LED with the dashboard from node-red

    Reply
  10. really nice tutorial..it covers a lot of concepts, like mosquito broker, node-red and broker at the same device, esp as mqtt client..
    I have only one but important question..is it necessary to establish a wifi connection?
    i want to make a secured local mqtt network. Do i need the wifi and the router, because i think i can establish a connection from raspberry to esp or vice versa and bypass all the internet dangers..
    what do you think about it?

    Reply
  11. You people are great!!! Thank you so much for guiding us through the entire process. It’s unique and content is amazing,detailed. No confusion at any point.

    Reply
  12. Hey,
    I have been enjoying your tutorials very much, has helped me get up to speed wit IoT.
    It would be cool if you had time to do this with a nodeMCU running micropython rather than a Arduino IDE, to see the python approach.

    Reply
  13. Do you have any idea of how much you can speed up the data transfer rate? for instance, in this project the sensors data are refreshed in every 30 sec. Would it be possible to refresh in every 0,1sec?

    Reply
    • Hi Carlos.
      You can speed up the data transfer. But I never tried 0.1 seconds. You have to experiment and see if it works. Then, let me know your results.
      Regards,
      Sara

      Reply
  14. hallo, i have a problem with your code.
    my monitor give feedback
    Attampting mqtt connection…… failed, rc=2 try again in 5 seconds
    Attampting mqtt connection…… failed, rc=2 try again in 5 seconds
    Attampting mqtt connection…… failed, rc=2 try again in 5 seconds
    Attampting mqtt connection…… failed, rc=2 try again in 5 seconds
    and still so.
    I use all your code, just change the ssid and password, please help me

    Reply
    • In my case I changed my router’s channel from automatic to 11 (static), this solved my connection problems, another thing is that I use the mosquito on HomeAssistant, his IP being 172.30.32.1, but the connection was accepted only on IP HOST (ie HomeAssistant- 192.168.XXX.XXX)

      Reply
  15. Hi Sara & Rui
    I had always wanted to try Node Red but was apprehensive. This tutorial has worked wonders for me. Thanks for the great project. Keep it up.
    Vasant

    Reply
  16. Sara, Rui.
    Excelente trabajo. Segui este un par mas de los tutoriales y ya estoy enviando datos a la pi desde mis sensores en una ESP8266. Tambien estoy controlando varios actuadores conectados al esp8266.
    Solo me falta, ahora, ver como manejar la pi por nombre y como poder usarla de una red externa la wifi de mi casa.

    Reply
  17. Thank you very much for the contribution, I was already hitting my head against the wall for a solution to the constant drops of the MQTT connection of my ESP82266 arduino Mega onBoard (Wemos), in your Skecth you have the path of the stones, I changed the name of ESP to a shorter and the connection remained stable, your tutorial was the most complete that I found so far on this huge web. It was perfect in ESP communication with the mosquitto broker on HomeAssistant linked to NodeRed. I am Brazilian, so forgive any mistake in my English.

    Reply
  18. Hi there,
    many thanks for the tutorials, really helped to get me started. However, I have an issue that mu ESP doesn’t connect to Mosquitto Broker. Similar to SAM (comment on January 23, 2018) I get “Attempting MQTT connection…failed, rc=-2 try again in 5 seconds” on the monitor. Does the -2 help to narrow down the problem? SAM got 3 potential issues, but I’m sure the MQTT broker is running, I checked with your 2 terminal method and also from terminal to debug in Node-RED works. Also, I have only one ESP running in my network (I nonetheless changed the name here:

    YOU MIGHT NEED TO CHANGE THIS LINE, IF YOU’RE HAVING PROBLEMS WITH MQTT MULTIPLE CONNECTIONS
    To change the ESP device ID, you will have to give a new name to the ESP8266.
    Here’s how it looks:
    if (client.connect(“ESP8266Client”)) {
    to something else, but still no luck.

    So I was thinking the only option is the IP address. But I triple checked and the number match to those I use to log in to the Raspberry pi. Do I also need to specify the channel here? I don’t think so but I’m a bit lost what else to test/check. Also budiman (March 25 2020) had a similar issue, but I think the rc=2 (positive value) means something different? Or should I also try to specify the WLAN channel in the router, as recommended by somebody else in response there?

    Could it play a role that the ESP8266 is using 2.4GHz network but the Pi is in 5GHz?

    Any help will be greatly appreciated! 🙂

    Reply
  19. In node-red, when I double-click on my switch function, I don’t get what the tutorial shows. The node-red version (on a Pi-ZW) is 1.0.6, freshly installed. In particular, I don’t see any way to set On Payload or Off Payload under “Edit switch node”.

    Reply
  20. I keep getting “Failed to read from DHT sensor!” in my serial monitor in the Arduino IDE. Can anyone tell me what I’m doing wrong? Any help would be appreciated!
    Thanks in advance,
    Lucas

    Reply
      • Hi,
        Thank you very much for your reply. I already fixed the issue; I found that the wiring schematics were ‘wrong’ in a way that the sensor should not be connected with Vin and a resistor but directly with the 3v3 pin. Also the sequence that is shown in this tutorial didn’t work for me. I finally made it work following the schematic in this picture: circuits4you.com/wp-content/uploads/2019/01/NodeMCU-DHT11-DHT22.png
        Thanks anyways,
        Lucas

        Reply
        • Hi again.
          In your case, if you’re using a DHT sensor that is on a breakout board, it already has the resistor built-in. So, there’s no need to add another one.
          Regards,
          Sara

          Reply
  21. Hello Rui. Great project, i always get the most relevant and comprehensive guide from your website.
    i followed along and got everything work so far. It’s just that the gauge is not updating. i triple checked the connections and dashboard settings, but only humidity is showing. Any guesses what am i missing?
    Thank you

    Reply
    • Hi.
      In this particular example only the humidity is displayed on the gauge.
      The temperature is being displayed on the chart.
      Regards,
      Sara

      Reply
  22. Hi,

    what a great pleasure having found this website! I have tried quite some of your tutorials (including some privat changes to fit in my projects) NOT ONE DID FAIL! Big, big compliment.

    Just a small question to this tutorial. I have tried to publish the temperature of one room to let it show via oled display show in another room (example: temperature on the balcony, displayed on oled in the kitchen). So; – no problem to publish from ESP (here balcony) via MQTT (raspi, nodered, etc.). Even on my mobile perfectly running. Subscribe to ESP in kitchen: No problem with serial monitor (via the callback void function). But I cannot get the data into a variable stored outside the callback function to put it on the oled display (together with other data available in the void loop). Sorry for such a stupid question (could not find an answer in google).

    Again; – Thanks a lot!

    Konrad

    Reply
    • Hi.
      For example, the messageTemp variable is declared inside the
      void callback(String topic, byte* message, unsigned int length) function as follows:
      String messageTemp;
      So, it is declared as a local variable.
      You need to create a global variable that you can use anywhere in your code.
      For example, before the setup(), declare a variable, for example:
      String myTemp;
      Then, in the callback function, you just need to set the value of the myTemp variable(global):
      void callback(String topic, byte* message, unsigned int length) {
      Serial.print(“Message arrived on topic: “);
      Serial.print(topic);
      Serial.print(“. Message: “);
      String messageTemp;
      (…)
      myTemp = messageTemp;
      }
      I hope you understand my explanation.
      Regards,
      Sara

      Reply
    • Hi.
      Double-check that you’ve copied the code properly.
      That means that the reconnect() function was declared twice, which doesn’t happen in the code.
      Regards,
      Sara

      Reply
  23. Hi Sara and Rui,

    first of all: thanks for all your excellent work here, I’ve started some month ago with the ESPs and learned a lot from this source.
    RecentIy I struggled with an MQTT-project with random wired behavior, and I had no idea whats going on (I did some other projects before without any problems). The key was, that I used the same client-ID name like an existing project, and thanks of the remarks in this code I figured out what the problem was… perfect. I would never had thought in this direction…

    So please keep up this excellent work,

    Cheers, Giogio

    Reply

Leave a Comment

Download our Free eBooks and Resources

Get instant access to our FREE eBooks, Resources, and Exclusive Electronics Projects by entering your email address below.