Arduino - MQTT

Neste tutorial, vamos aprender a usar o Arduino para enviar/receber dados de um broker MQTT usando o protocolo MQTT. Em detalhes, vamos aprender:

Arduino MQTT

Vamos explorar dois casos de uso diferentes:

Sobre Arduino e MQTT

Vamos supor que você já esteja familiarizado com o protocolo MQTT. Se não estiver, pesquise na Internet. Este tutorial foca em programar o Arduino para enviar e receber dados usando o protocolo MQTT.

Abaixo estão casos de uso do Arduino com MQTT:

  • O Arduino se conecta a um broker MQTT online, por exemplo: broker Mosquitto online, AWS IoT...
  • O Arduino se conecta a um broker MQTT instalado no seu PC, por exemplo: broker Mosquitto, broker HiveMQ
  • O Arduino se conecta a um broker MQTT instalado no seu Raspberry Pi, por exemplo: broker Mosquitto
  • O Arduino se conecta a um broker MQTT instalado na nuvem, por exemplo: broker Mosquitto ou HiveMQ na AWS EC2

Neste tutorial, vamos começar verificando rapidamente se o Arduino consegue se conectar a um broker Mosquitto online. O Arduino vai publicar e se inscrever nesse broker pela internet.

Em seguida, vamos instalar o broker Mosquitto no nosso PC. Depois, vamos conectar o Arduino ao broker MQTT instalado no nosso PC, continuando a publicar e receber dados por meio desse broker local.

Depois de concluir este tutorial, você pode ir além aprendendo sobre Arduino com MQTT nos seguintes tutoriais:

Conectar o Arduino a um broker MQTT online

Nesta parte, vamos aprender a conectar o Arduino ao test.mosquitto.org, um broker MQTT online criado pelo Mosquitto. Observe que esse broker deve ser usado apenas para fins de teste.

Código Arduino

O código Arduino abaixo faz o seguinte:

  • Conecta-se ao broker MQTT
  • Inscreve-se em um tópico
  • Publica mensagens periodicamente no mesmo tópico em que está inscrito
/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-mqtt */ #include <WiFiS3.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-arduino-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 Arduino should publish/subscribe const char PUBLISH_TOPIC[] = "YOUR-NAME-arduino-001/loopback"; // CHANGE IT AS YOU DESIRE const char SUBSCRIBE_TOPIC[] = "YOUR-NAME-arduino-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); int status = WL_IDLE_STATUS; while (status != WL_CONNECTED) { Serial.print("Arduino - Attempting to connect to SSID: "); Serial.println(WIFI_SSID); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // wait 10 seconds for connection: delay(10000); } // print your board's IP address: Serial.print("IP Address: "); Serial.println(WiFi.localIP()); 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 - 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 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("Arduino - Subscribed to the topic: "); else Serial.print("Arduino - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("Arduino - 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 - 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 - received from MQTT:"); Serial.println("- topic: " + topic); Serial.println("- payload:"); Serial.println(payload); }

Passos Rápidos

  • Se esta é a primeira vez que você usa o Arduino Uno R4, veja como configurar o ambiente para o Arduino Uno R4 na Arduino IDE.
  • Abra a Arduino IDE no seu PC
  • Abra o Library Manager clicando no ícone Library Manager na barra de navegação à esquerda da Arduino IDE
  • Digite MQTT na caixa de pesquisa e procure a biblioteca MQTT de Joel Gaehwiler.
  • Clique no botão Install para instalar a biblioteca MQTT.
Biblioteca MQTT para Arduino
  • Digite ArduinoJson na caixa de pesquisa e procure a biblioteca ArduinoJson de Benoit Blanchon.
  • Clique no botão Install para instalar a biblioteca ArduinoJson.
Biblioteca ArduinoJson para Arduino
  • Copie o código acima e abra-o na Arduino IDE
  • Substitua as informações de WiFi (SSID e senha) no código pelas suas.
  • No código, você verá a palavra 'YOUR-NAME' três vezes. Substitua essa palavra pelo seu nome ou por caracteres aleatórios (apenas letras, sem espaços). Isso é necessário porque, se você não fizer a alteração, pode haver várias pessoas executando este código ao mesmo tempo, o que pode causar conflitos, já que os IDs de cliente MQTT e os tópicos seriam os mesmos para todos.
  • Clique no botão Upload na Arduino IDE para carregar o código no Arduino
  • Abra o Serial Monitor
  • Veja o resultado no Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
IP Address: 192.168.0.2 Arduino - Connecting to MQTT broker Arduino - Subscribed to the topic: YOUR-NAME-arduino-001/loopback Arduino - MQTT broker Connected! Arduino - sent to MQTT: - topic: YOUR-NAME-arduino-001/loopback - payload:{"timestamp":11757,"data":255} Arduino - received from MQTT: - topic: YOUR-NAME-arduino-001/loopback - payload: {"timestamp":11757,"data":255} Arduino - sent to MQTT: - topic: YOUR-NAME-arduino-001/loopback - payload:{"timestamp":16896,"data":259} Arduino - received from MQTT: - topic: YOUR-NAME-arduino-001/loopback - payload: {"timestamp":16896,"data":259}
Ln 11, Col 1
Arduino Uno on COM15
2

Como você pode ver, o Arduino publica mensagens no broker MQTT e depois recebe de volta a mesma mensagem. Isso acontece porque o código acima se inscreve no mesmo tópico em que publica os dados. Se você não quiser que o Arduino receba a mensagem que ele mesmo publica, basta fazer o tópico de SUBSCRIBE ser diferente do tópico de PUBLISH.

Conectar o Arduino ao broker MQTT instalado no seu PC

Instalando o Broker MQTT Mosquitto

  • Instale-o na unidade D: em vez da unidade C:. Evite instalar o broker Mosquitto na unidade C: para prevenir possíveis problemas.

Executar o broker MQTT Mosquitto

Agora, vamos verificar se o broker MQTT está funcionando corretamente seguindo estes passos:

  • Vá até o diretório onde o Mosquitto foi instalado. Por exemplo: D:\Draft\mosquitto>
  • Crie um novo arquivo chamado test.conf, copie o conteúdo abaixo e salve-o nesse diretório:
listener 1883 allow_anonymous true
  • Execute um Prompt de Comando como Administrador no seu PC. Vamos chamá-lo de Broker Window. Não feche esta janela até o final do tutorial.
Prompt de comando do Windows como administrador
  • Execute os comandos abaixo um por um:
cd /d D:\Draft\mosquitto mosquitto -v -c test.conf
  • Você verá:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\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
  • Abra outro Prompt de Comando como Administrador no seu PC.
  • Descubra o endereço IP do seu PC executando o comando abaixo:
ipconfig
Command Prompt
C:\WINDOWS\system32>ipconfig Windows IP Configuration Ethernet adapter: Subnet Mask . . . . . . . . . . . : 255.0.0.0 IPv4 Address. . . . . . . . . . . : 192.168.0.26 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . :
  • Anote o endereço IP para usar depois. No exemplo acima: 192.168.0.26

Testar se o Broker Mosquitto funciona

  • Abra outro Prompt de Comando como Administrador no seu PC. Vamos chamá-lo de Subscriber Window
  • Inscreva-se em um tópico executando os comandos abaixo um por um (substitua pelo seu endereço IP):
cd /d D:\Draft\mosquitto mosquitto_sub -h 192.168.0.26 -p 1883 -t arduino-001/send
  • Abra outro Prompt de Comando como Administrador no seu PC. Vamos chamá-lo de Publisher Window
  • Publique uma mensagem no mesmo tópico executando os comandos abaixo um por um (substitua pelo seu endereço IP):
cd /d D:\Draft\mosquitto mosquitto_pub -h 192.168.0.26 -p 1883 -t arduino-001/send -m "Hello, MQTT!"
  • Você verá:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto_pub -h 192.168.0.26 -p 1883 -t arduino-001/send -m "Hello, MQTT!" D:\Draft\mosquitto>

Você verá que a mensagem é encaminhada para a Subscriber Window da seguinte forma:

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

Pronto, você instalou com sucesso o broker MQTT Mosquitto no seu PC. NÃO feche as três janelas: Broker Window, Subscriber Window e Publisher Window. Vamos usá-las a seguir.

Código Arduino

O código Arduino abaixo faz o seguinte:

  • Conecta-se ao broker MQTT
  • Inscreve-se em um tópico
  • Publica mensagens periodicamente em outro tópico
/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-mqtt */ #include <WiFiS3.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 char MQTT_BROKER_ADRRESS[] = "192.168.0.26"; // CHANGE TO MQTT BROKER'S IP ADDRESS const int MQTT_PORT = 1883; const char MQTT_CLIENT_ID[] = "arduino-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 Arduino should publish/subscribe const char PUBLISH_TOPIC[] = "arduino-001/send"; // CHANGE IT AS YOU DESIRE const char SUBSCRIBE_TOPIC[] = "arduino-001/receive"; // 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); int status = WL_IDLE_STATUS; while (status != WL_CONNECTED) { Serial.print("Arduino - Attempting to connect to SSID: "); Serial.println(WIFI_SSID); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // wait 10 seconds for connection: delay(10000); } // print your board's IP address: Serial.print("IP Address: "); Serial.println(WiFi.localIP()); 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 - 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 - MQTT broker Timeout!"); return; } // Subscribe to a topic, the incoming messages are processed by messageHandler() function if (mqtt.subscribe(SUBSCRIBE_TOPIC)) Serial.print("Arduino - Subscribed to the topic: "); else Serial.print("Arduino - Failed to subscribe to the topic: "); Serial.println(SUBSCRIBE_TOPIC); Serial.println("Arduino - 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 - 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 - 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"]; */ }

Passos Rápidos

  • Copie o código acima e abra-o na Arduino IDE
  • Substitua as informações de WiFi (SSID e senha) no código pelas suas.
  • Substitua o endereço do broker MQTT no código (nome de domínio ou endereço IP).
  • Clique no botão Upload na Arduino IDE para carregar o código no Arduino

Enviar mensagem do Arduino para o PC via MQTT

O código do Arduino publica dados no tópico MQTT arduino-001/send, e a Subscriber Window no PC se inscreve nesse tópico para receber os dados.

  • Abra o Serial Monitor e você verá o Arduino publicar periodicamente uma mensagem em um tópico.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
IP Address: 192.168.0.2 Arduino - Connecting to MQTT broker Arduino - Subscribed to the topic: arduino-001/receive Arduino - MQTT broker Connected! Arduino - sent to MQTT: - topic: arduino-001/send - payload:{"timestamp":10708,"data":311} Arduino - sent to MQTT: - topic: arduino-001/send - payload:{"timestamp":15837,"data":298} Arduino - sent to MQTT: - topic: arduino-001/send - payload:{"timestamp":20965,"data":291} Arduino - sent to MQTT: - topic: arduino-001/send - payload:{"timestamp":26094,"data":286}
Ln 11, Col 1
Arduino Uno on COM15
2
  • Verifique a Subscriber Window, você verá que ela recebe a mensagem publicada pelo Arduino, como abaixo:
Command Prompt
Microsoft Windows [Version 10.0.19045.3930] (c) Microsoft Corporation. All rights reserved. C:\WINDOWS\system32>cd /d D:\Draft\mosquitto D:\Draft\mosquitto>mosquitto_sub -h 192.168.0.26 -p 1883 -t arduino-001/send Hello, MQTT! {"timestamp":10708,"data":311} {"timestamp":15837,"data":298} {"timestamp":20965,"data":291} {"timestamp":26094,"data":286}

Enviar mensagem do PC para o Arduino via MQTT

O Arduino se inscreve no tópico arduino-001/receive, e a Publisher Window no PC publica uma mensagem nesse tópico para enviá-la ao Arduino.

  • Publique uma mensagem no tópico em que o Arduino está inscrito executando o seguinte comando na Publisher Window:
mosquitto_pub -h 192.168.0.26 -p 1883 -t arduino-001/receive -m "Hello, Arduino!"
  • Você verá essa mensagem ser recebida pelo Arduino no Serial Monitor, como abaixo:
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
Arduino - received from MQTT: - topic: arduino-001/receive - payload: Hello, Arduino!
Ln 11, Col 1
Arduino Uno on COM15
2

Vídeo

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!