Enviando mensagens MQTT com módulo ESP32

Hoje vamos ver uma interessante aplicação voltada ao mundo IoT, que é o envio de mensagens MQTT com módulo ESP32. Usando um Módulo ESP32 Wifi Bluetooth, vamos enviar mensagens para um smartphone Android.

Os conceitos deste post também podem ser utilizados na utilização de outros dispositivos como por exemplo placas Arduino, módulos ESP8266, Linkit, Beaglebone e outras.

Como funciona o MQTT

MQTT (Message Queue Telemetry Transport) é um protocolo de comunicação muito utilizado em IoT (Internet of Things ou Internet das Coisas) pois é um método relativamente simples de usar e que não exige muito poder de processamento ou grandes recursos de banda de rede. 

Basicamente você tem de um lado um Publisher, que é o dispositivo que vai enviar as mensagens; no meio do caminho um Broker, que é um servidor MQTT responsável por gerenciar a troca de mensagens, e o Subscriber, que é o dispositivo na outra ponta que vai ler as mensagens enviadas pelo Publisher.

O broker MQTT que vamos usar é o iot.eclipse.org, que é gratuito e se saiu melhor nos testes. Na internet existem também servidores MQTT pagos e você pode até mesmo criar um servidor MQTT na sua rede interna usando uma placa Raspberry Pi, por exemplo.

As mensagens enviadas são compostas por um Tópico, que seria mais ou menos como um “assunto” para as mensagens. O tópico do nosso exemplo será ArduinoeCia. O Subscriber se conecta no broker, “assina” este tópico e passa a receber suas mensagens.

O outro pedaço da mensagem é o Payload, que é a informação propriamente dita. Pode ser uma string, o valor de um sensor, um alerta, etc.

MQTT com módulo ESP32 utilizando IDE Arduino

Vamos começar instalando a placa ESP32 na IDE do Arduino. Abra a IDE e no menu Arquivo -> Preferências coloque o endereço abaixo no campo URLs Adicionais para Gerenciadores de Placas:

https://dl.espressif.com/dl/package_esp32_index.json

Sua tela ficará assim:

Para que o nosso módulo ESP32 apareça na lista de placas disponíveis, acesse o menu Ferramentas -> Placa -> Gerenciador de Placas e faça a instalação conforme imagem abaixo:

Vamos agora instalar a biblioteca PubSubClient, que vai permitir a comunicação MQTT. Na documentação dela consta que pode ser utilizada para ESP8266, mas utilizamos no ESP32 sem problemas.

Instale a biblioteca na IDE selecionando Sketch -> Incluir Biblioteca -> Gerenciar bibliotecas. Na janela do gerenciador, procure por PubSubClient e clique em Instalar, conforme a imagem abaixo:

Com a biblioteca instalada, vamos agora carregar o programa abaixo, que faz a conexão com a rede wifi, se conecta ao servidor MQTT (no caso, estamos usando oiot.eclipse.org) e envia mensagens em intervalos de 30 segundos. Para facilitar, coloquei um contador para que seja mais fácil acompanhar o recebimento no smartphone e verificar se está tudo ok. Antes de transferir o programa, selecione a placa ESP32 Dev Module no menu Ferramentas.

Altere as linhas 7 e 8 do programa com o nome e senha da sua rede wifi. É por meio dela que o ESP32 fará a comunicação com o broker MQTT para enviar os dados. Também é muito importante que você altere o nome do tópico na linha 43 (estou usando ArduinoeCia) para que ele seja único e você não receba mensagens de outras pessoas que estejam testando o programa.

//Programa: Modulo ESP32 Wifi com MQTT
//Autor: Arduino e Cia

#include <WiFi.h>
#include <PubSubClient.h>

const char* ssid = "NOME-DA-REDE-WIFI";
const char* password =  "SENHA-DA-REDE-WIFI";
const char* mqttServer = "iot.eclipse.org";
const int mqttPort = 1883;
const char* mqttUser = "abcdefg";
const char* mqttPassword = "123456";

WiFiClient espClient;
PubSubClient client(espClient);

int contador = 1;
char mensagem[30];

void setup()
{
  Serial.begin(115200);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.println("Iniciando conexao com a rede WiFi..");
  }

  Serial.println("Conectado na rede WiFi!");
}

void loop()
{
  //Faz a conexao com o broker MQTT
  reconectabroker();
  sprintf(mensagem, "MQTT ESP32 - Mensagem no. %d", contador);
  Serial.print("Mensagem enviada: ");
  Serial.println(mensagem);

  //Envia a mensagem ao broker
  client.publish("ArduinoeCia", mensagem);
  Serial.println("Mensagem enviada com sucesso...");
  
  //Incrementa o contador
  contador++;
  
  //Aguarda 30 segundos para enviar uma nova mensagem
  delay(30000);
}

void reconectabroker()
{
  //Conexao ao broker MQTT
  client.setServer(mqttServer, mqttPort);
  while (!client.connected())
  {
    Serial.println("Conectando ao broker MQTT...");
    if (client.connect("ESP32Client", mqttUser, mqttPassword ))
    {
      Serial.println("Conectado ao broker!");
    }
    else
    {
      Serial.print("Falha na conexao ao broker - Estado: ");
      Serial.print(client.state());
      delay(2000);
    }
  }
}

Em alguns módulos é necessário manter pressionado o botão BOOT para que o programa seja carregado. Faça isso caso o programa não seja carregado automaticamente.

Recebendo os dados do MQTT no smartphone

Para receber os dados enviados pelo módulo ESP32 via MQTT, vamos usar o app MyMQTT, disponível no Google Play do seu smartphone ou neste endereço. A configuração é bem simples, como veremos agora.

Abra o programa e selecione  o icone do app para acessar o menu. Selecione Settings(Configurações) e coloque o endereço iot.eclipse.org, selecionando em seguida o botão Save. Não é necessário alterar os outros parâmetros:

Voltando ao menu, selecione Subscribe e coloque o tópico que você deseja assinar. No nosso caso, o nome do tópico é ArduinoeCia. Clique em Add para gravar as informações:

Feito isso, basta voltar à tela principal (Dashboard) e acompanhar o recebimento das mensagens MQTT enviadas pelo ESP32.

Importante observar que um dispositivo pode ser Subscriber e Publisher ao mesmo tempo, ou seja, é possível também enviar comandos do smartphone para o ESP32, por exemplo, e acionar dispositivos remotamente.

Confira outros posts sobre ESP32 aqui mesmo no Arduino e Cia!

5/5 - (1 voto)

Related posts

Comunicação Serial Arduino e Wio Terminal

by Arduino e Cia
3 anos ago

Como usar o mini transmissor RF 433MHz com Arduino

by Arduino e Cia
3 anos ago

Data logger com Ethernet Shield W5500

by Arduino e Cia
7 anos ago
Sair da versão mobile