Arduino Nano ESP32 - MQTT

In this guide, we'll delve into utilizing Arduino Nano ESP32 for sending and receiving data to/from an MQTT broker through the MQTT protocol. Specifically, we'll cover:

Arduino Nano ESP32 MQTT

We'll examine two distinct scenarios:

Hardware Preparation

1×Arduino Nano ESP32
1×USB Cable Type-C
1×Breadboard
1×Jumper Wires
1×(Recommended) Screw Terminal Expansion Board for Arduino Nano
1×(Recommended) Breakout Expansion Board for Arduino Nano
1×(Recommended) Power Splitter For Arduino Nano ESP32

Or you can buy the following sensor kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Disclosure: Some of the links provided in this section are Amazon affiliate links. We may receive a commission for any purchases made through these links at no additional cost to you.
Additionally, some of these links are for products from our own brand, DIYables.

Overview of Arduino Nano ESP32 and MQTT

If you're already familiar with the MQTT protocol, that's great! If not, you can search for it online. This tutorial is focused on using Arduino Nano ESP32 for sending and receiving data using MQTT.

Here are different ways Arduino Nano ESP32 can be used with MQTT:

  • You can connect Arduino Nano ESP32 to an online MQTT broker like Mosquitto or AWS IoT.
  • You can connect Arduino Nano ESP32 to an MQTT broker installed on your computer, such as Mosquitto or HiveMQ.
  • You can connect Arduino Nano ESP32 to an MQTT broker running on your Raspberry Pi, for example, Mosquitto.
  • You can also connect Arduino Nano ESP32 to a cloud-based MQTT broker, like Mosquitto or HiveMQ on AWS EC2.

In this tutorial, we'll begin by checking if Arduino Nano ESP32 can connect to an online Mosquitto broker. We'll have Arduino Nano ESP32 exchange data through this broker over the internet.

After that, we'll set up the Mosquitto broker on our computer. Then, we'll connect Arduino Nano ESP32 to this local broker and continue sending and receiving data.

Once you've completed this tutorial, you can explore further by looking into these additional tutorials:

These tutorials will provide more insights into related topics.

Connect Arduino Nano ESP32 to an online MQTT broker

In this part, we will learn how to connect Arduino Nano ESP32 to test.mosquitto.org, an online MQTT broker created by Mosquitto. Please note that this broker should be used for the testing purpose only.

Arduino Nano ESP32 Code

The below Arduino Nano ESP32 code does:

  • Connect to the MQTT broker
  • Subscribe to a topic
  • Periodically publish messages to the same topic that it subscribes
/* * This Arduino Nano ESP32 code was developed by newbiely.com * * This Arduino Nano ESP32 code is made available for public use without any restriction * * For comprehensive instructions and wiring diagrams, please visit: * https://newbiely.com/tutorials/arduino-nano-esp32/arduino-nano-esp32-mqtt */ #include <WiFi.h> #include <MQTTClient.h> #include <ArduinoJson.h> const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD const char MQTT_BROKER_ADRRESS[] = "test.mosquitto.org"; // CHANGE TO MQTT BROKER'S ADDRESS const int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "YOUR-NAME-esp32-001"; // CHANGE IT AS YOU DESIRE const char MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED, empty if not required const char MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED, empty if not required // The MQTT topics that ESP32 should publish/subscribe const char PUBLISH_TOPIC[] = "YOUR-NAME-esp32-001/loopback"; // CHANGE IT AS YOU DESIRE const char SUBSCRIBE_TOPIC[] = "YOUR-NAME-esp32-001/loopback"; // CHANGE IT AS YOU DESIRE const int PUBLISH_INTERVAL = 5000; // 5 seconds WiFiClient network; MQTTClient mqtt = MQTTClient(256); unsigned long lastPublishTime = 0; void setup() { Serial.begin(9600); // set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("Arduino Nano ESP32 - Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); connectToMQTT(); } void loop() { mqtt.loop(); if (millis() - lastPublishTime > PUBLISH_INTERVAL) { sendToMQTT(); lastPublishTime = millis(); } } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // Create a handler for incoming messages mqtt.onMessage(messageHandler); Serial.print("Arduino Nano ESP32 - Connecting to MQTT broker"); while (!mqtt.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.print("."); delay(100); } Serial.println(); if (!mqtt.connected()) { Serial.println("Arduino Nano ESP32 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("Arduino Nano ESP32 - Subscribed to the topic: "); else Serial.print("Arduino Nano ESP32 - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("Arduino Nano ESP32 - MQTT broker Connected!"); } void sendToMQTT() { StaticJsonDocument<200> message; message["timestamp"] = millis(); message["data"] = analogRead(0); // Or you can read data from other sensors char messageBuffer[512]; serializeJson(message, messageBuffer); mqtt.publish(PUBLISH_TOPIC, messageBuffer); Serial.println("Arduino Nano ESP32 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("Arduino Nano ESP32 - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); }

Detailed Instructions

To get started with Arduino Nano ESP32, follow these steps:

  • If you are new to Arduino Nano ESP32, refer to the tutorial on how to set up the environment for Arduino Nano ESP32 in the Arduino IDE.
  • Wire the components according to the provided diagram.
  • Connect the Arduino Nano ESP32 board to your computer using a USB cable.
  • Launch the Arduino IDE on your computer.
  • Select the Arduino Nano ESP32 board and its corresponding COM port.
  • Open Arduino IDE on your PC
  • Open the Library Manager by clicking on the Library Manager icon on the left navigation bar of Arduino IDE
  • Type MQTT on the search box, then look for the MQTT library by Joel Gaehwiler.
  • Click Install button to install MQTT library.
Arduino Nano ESP32 MQTT library
  • Type Arduino Nano ESP32Json on the search box, then look for the Arduino Nano ESP32Json library by Benoit Blanchon.
  • Click Install button to install Arduino Nano ESP32Json library.
Arduino Nano ESP32 Json library
  • Copy the above code and open with Arduino IDE
  • Replace the WiFi information (SSID and password) in the code with your own.
  • In the code, you will see the word 'YOUR-NAME' three times. Replace this word with your name or random characters (alphabet characters only, no spaces). This is necessary because if you do not make the change, there may be multiple people running this code at the same time, which could lead to conflicts because the MQTT client IDs and topics are the same for everyone.
  • Click Upload button on Arduino IDE to upload code to Arduino Nano ESP32
  • Open the Serial Monitor
  • See the result on Serial Monitor.
COM6
Send
Arduino Nano ESP32 - Connecting to MQTT broker Arduino Nano ESP32 - Subscribed to the topic: YOUR-NAME-esp32-001/loopback Arduino Nano ESP32 - MQTT broker Connected! Arduino Nano ESP32 - sent to MQTT: - topic: YOUR-NAME-esp32-001/loopback - payload:{"timestamp":11757,"data":255} Arduino Nano ESP32 - received from MQTT: - topic: YOUR-NAME-esp32-001/loopback - payload: {"timestamp":11757,"data":255} Arduino Nano ESP32 - sent to MQTT: - topic: YOUR-NAME-esp32-001/loopback - payload:{"timestamp":16896,"data":259} Arduino Nano ESP32 - received from MQTT: - topic: YOUR-NAME-esp32-001/loopback - payload: {"timestamp":16896,"data":259}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

As you can see, Arduino Nano ESP32 publishes messages to the MQTT broker, then receives back the same message. That is because the above code subscribes to the same topic that it publishes data to. If you do not want Arduino Nano ESP32 to receive the message that it publishes, simply make the SUBSCRIBE topic different from the PUBLISH topic.

Connect Arduino Nano ESP32 to the MQTT broker installed on your PC

Installing Mosquitto MQTT Broker

  • Install it on the D: drive instead of the C: drive. Avoid installing the Mosquitto broker on the C: drive to prevent potential issues.

Run Mosquitto MQTT broker

Now, let's check if the MQTT broker is functioning properly by following these steps:

  • Go to the directory where Mosquitto was installed. For instance: D:\mosquitto>
  • Make a new file named test.conf, copy the content below, and save it in that directory:
listener 1883 allow_anonymous true
  • Run a Command Prompt as Administrator on your PC. Let's call it Broker Window. Do not close it until the end of the tutorial.
Windows command prompt administrator
  • Run the below commands one by one:
cd /d D:\mosquitto mosquitto -v -c test.conf
  • You will see:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\mosquitto D:\mosquitto>mosquitto -v -c test.conf 1710918939: mosquitto version 2.0.18 starting 1710918939: Config loaded from test.conf. 1710918939: Opening ipv6 listen socket on port 1883. 1710918939: Opening ipv4 listen socket on port 1883. 1710918939: mosquitto version 2.0.18 running
  • Open another Command Prompt as Administrator on your PC.
  • Find the IP address of your PC by running the below command:
ipconfig
Command Prompt
C:\WINDOWS\system32>ipconfig Windows IP Configuration Ethernet adapter: Subnet Mask . . . . . . . . . . . : 255.0.0.0 IPv4 Address. . . . . . . . . . . : 192.168.0.5 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . :
  • Write down the IP address for later use. In the above example: 192.168.0.5

Test if the Mosquitto Broker works

  • Open another Command Prompt as Administrator on your PC. Let's call it Subscriber Window
  • Subscribe to a topic by running the below commands one by one (replace by your IP address):
cd /d D:\mosquitto mosquitto_sub -h 192.168.0.5 -p 1883 -t esp32-001/send
  • Open another Command Prompt as Administrator on your PC. Let's call it Publisher Window
  • Publish a message to the same topic by running the below commands one by one (replace by your IP address):
cd /d D:\mosquitto mosquitto_pub -h 192.168.0.5 -p 1883 -t esp32-001/send -m "Hello, MQTT!"
  • You will see:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\mosquitto D:\mosquitto>mosquitto_pub -h 192.168.0.5 -p 1883 -t esp32-001/send -m "Hello, MQTT!" D:\mosquitto>

You will see that message is forwarded to the Subscriber Window as follows:

Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\mosquitto D:\mosquitto>mosquitto_sub -h 192.168.0.5 -p 1883 -t esp32-001/send Hello, MQTT!

Now, you installed successfully the Mosquitto MQTT broker on your PC. Please do NOT close three windows: Broker Window, Subscriber Window, and Publisher Window. We will use them next.

Arduino Nano ESP32 Code

The below Arduino Nano ESP32 code does:

  • Connect to the MQTT broker
  • Subscribe to a topic
  • Periodically publish messages to another topic
/* * This Arduino Nano ESP32 code was developed by newbiely.com * * This Arduino Nano ESP32 code is made available for public use without any restriction * * For comprehensive instructions and wiring diagrams, please visit: * https://newbiely.com/tutorials/arduino-nano-esp32/arduino-nano-esp32-mqtt */ #include <WiFi.h> #include <MQTTClient.h> #include <ArduinoJson.h> #define CLIENT_ID "ESP32-001" // CHANGE IT AS YOU DESIRE const char WIFI_SSID[] = "YOUR_WIFI_SSID"; // CHANGE TO YOUR WIFI SSID const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // CHANGE TO YOUR WIFI PASSWORD const char MQTT_BROKER_ADRRESS[] = "192.168.0.5"; // CHANGE TO MQTT BROKER'S IP ADDRESS const int MQTT_PORT = 1883; const char MQTT_USERNAME[] = ""; // CHANGE IT IF REQUIRED const char MQTT_PASSWORD[] = ""; // CHANGE IT IF REQUIRED // The MQTT topics that this device should publish/subscribe #define PUBLISH_TOPIC "esp32-001/send" #define SUBSCRIBE_TOPIC "esp32-001/receive" #define PUBLISH_INTERVAL 5000 // 4 seconds WiFiClient network; MQTTClient mqtt = MQTTClient(256); unsigned long lastPublishTime = 0; void setup() { Serial.begin(9600); // set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); WiFi.mode(WIFI_STA); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("Arduino Nano ESP32 - Connecting to Wi-Fi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); connectToMQTT(); } void loop() { mqtt.loop(); if (millis() - lastPublishTime > PUBLISH_INTERVAL) { sendToMQTT(); lastPublishTime = millis(); } } void connectToMQTT() { // Connect to the MQTT broker mqtt.begin(MQTT_BROKER_ADRRESS, MQTT_PORT, network); // Create a handler for incoming messages mqtt.onMessage(messageHandler); Serial.print("Arduino Nano ESP32 - Connecting to MQTT broker"); while (!mqtt.connect(CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.print("."); delay(100); } Serial.println(); if (!mqtt.connected()) { Serial.println("Arduino Nano ESP32 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("Arduino Nano ESP32 - Subscribed to the topic: "); else Serial.print("Arduino Nano ESP32 - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("Arduino Nano ESP32 - MQTT broker Connected!"); } void sendToMQTT() { StaticJsonDocument<200> message; message["timestamp"] = millis(); message["data"] = analogRead(0); // Or you can read data from other sensors char messageBuffer[512]; serializeJson(message, messageBuffer); mqtt.publish(PUBLISH_TOPIC, messageBuffer); Serial.println("Arduino Nano ESP32 - sent to MQTT:"); Serial.print("- topic: "); Serial.println(PUBLISH_TOPIC); Serial.print("- payload:"); Serial.println(messageBuffer); } void messageHandler(String &topic, String &payload) { Serial.println("Arduino Nano ESP32 - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); // You can process the incoming data as json object, then control something /* StaticJsonDocument<200> doc; deserializeJson(doc, payload); const char* message = doc["message"]; */ }

Detailed Instructions

To get started with Arduino Nano ESP32, follow these steps:

  • If you are new to Arduino Nano ESP32, refer to the tutorial on how to set up the environment for Arduino Nano ESP32 in the Arduino IDE.
  • Wire the components according to the provided diagram.
  • Connect the Arduino Nano ESP32 board to your computer using a USB cable.
  • Launch the Arduino IDE on your computer.
  • Select the Arduino Nano ESP32 board and its corresponding COM port.
  • Copy the above code and open with Arduino IDE
  • Replace the WiFi information (SSID and password) in the code with your own.
  • Replace the MQTT broker address in the code (domain name or IP address).
  • Click Upload button on Arduino IDE to upload code to Arduino Nano ESP32

Send message from Arduino Nano ESP32 to PC via MQTT

Arduino Nano ESP32 codes publishes data to the MQTT topic esp32-001/send, Subscriber Window on PC subscribe that topic to receive the data.

  • Open the Serial Monitor, you will see Arduino Nano ESP32 periodically publish a message to a topic.
COM6
Send
Arduino Nano ESP32 - Connecting to MQTT broker Arduino Nano ESP32 - Subscribed to the topic: esp32-001/receive Arduino Nano ESP32 - MQTT broker Connected! Arduino Nano ESP32 - sent to MQTT: - topic: esp32-001/send - payload:{"timestamp":10708,"data":311} Arduino Nano ESP32 - sent to MQTT: - topic: esp32-001/send - payload:{"timestamp":15837,"data":298} Arduino Nano ESP32 - sent to MQTT: - topic: esp32-001/send - payload:{"timestamp":20965,"data":291} Arduino Nano ESP32 - sent to MQTT: - topic: esp32-001/send - payload:{"timestamp":26094,"data":286}
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Check the Subscriber Window, you will see that it receives the message published by Arduino Nano ESP32 as below:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\mosquitto D:\mosquitto>mosquitto_sub -h 192.168.0.5 -p 1883 -t esp32-001/send Hello, MQTT! {"timestamp":10708,"data":311} {"timestamp":15837,"data":298} {"timestamp":20965,"data":291} {"timestamp":26094,"data":286}

Send message from PC to Arduino Nano ESP32 via MQTT

Arduino Nano ESP32 subscribes to the topic esp32-001/receive, Publisher Window on PC publish a message to that topic to send it to the Arduino Nano ESP32.

  • Publish a message to the topic that Arduino Nano ESP32 subscribed by running the following command on Publisher Window:
mosquitto_pub -h 192.168.0.5 -p 1883 -t esp32-001/receive -m "Hello, Arduino Nano ESP32!"
  • You will see this message is received by Arduino Nano ESP32 on Serial Monitor as below:
COM6
Send
Arduino Nano ESP32 - received from MQTT: - topic: esp32-001/receive - payload: Hello, Arduino Nano ESP32!
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Video Tutorial

※ OUR MESSAGES

  • As freelancers, We are AVAILABLE for HIRE. See how to outsource your project to us
  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!