17 fevereiro 2019

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.

Comunicação módulo ESP32 com celular usando MQTT

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


O 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 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:

Tela das preferencias da IDE Arduino com a URL do ESP32

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:

Instalação Placa ESP32 IDE Arduino
 
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:

Instalação da biblioteca PubSubClient MQTT na IDE Arduino

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 o iot.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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//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!

7 comentários:

  1. Muito bom! Funcionou, perfeitamente. No momento que o ESP32 envia, o smartphone recebe quase instantaneamente.

    ResponderExcluir
    Respostas
    1. Oi Alfonso!

      Legal! Obrigado pelo retorno. :)

      Abraço!

      Adilson

      Excluir
  2. Materia legal. O unico problema é que a placa ESP8266 não está homologada na Anatel para uso comercial. Só da pra usar em casa, se for pra montar projeto na empresa (como eu queria), não posso usa-la.

    ResponderExcluir
    Respostas
    1. Oi Marco,

      A Cerebra possui alguns modulos ESP homologados pela Anatel, dá uma olhada lá: https://cerebrasc.com.br/iot

      Abraço!

      Adilson

      Excluir
    2. Lembrando que mesmo utilizando em seu projeto um módulo homologado ANATEL o produto final que contiver esse módulo terá que passar por uma homologação, mesmo que mais simplificada (onde serão analisados: emissão EMC + aspectos de segurança do produto) num OCD (Orgão Certificador Designado) que coordenará o processo de homologação, enviando o produto à um laboratório certificado ANATEL (como o Instituto Eldorado por exemplo) em que ambos serão de sua escolha.

      Excluir
  3. O programa compilou e tudo mais, mas no app em Subscribe diz não conectado quando tento por o nome do tópico.

    ResponderExcluir
    Respostas
    1. Oi Yan,

      Você colocou algum tipo de senha para acessar o tópico? Mas pela mensagem me parece algum erro de conexão (internet) ou configuração do app.

      Abraço!

      Adilson

      Excluir