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
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 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!
Muito bom! Funcionou, perfeitamente. No momento que o ESP32 envia, o smartphone recebe quase instantaneamente.
Oi Alfonso!
Legal! Obrigado pelo retorno. 🙂
Abraço!
Adilson
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.
Oi Marco,
A Cerebra possui alguns modulos ESP homologados pela Anatel, dá uma olhada lá: https://cerebrasc.com.br/iot
Abraço!
Adilson
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.
O programa compilou e tudo mais, mas no app em Subscribe diz não conectado quando tento por o nome do tópico.
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
exit status 1
invalid conversion from 'const char*' to 'char*' [-fpermissive]
O que eu devo fazer no iot.eclipse.com? como faço para criar um MQTT lá? não consigo entender essa parte, fica muito no ar todos esses tutórias que eu vejo, nunca explica oq deve ser feito no eclipse iot, só explica a parte do código e o que deve ser feito no app do celular
Oi Rodrigo,
Realmente é bem isso que vc falou, até pq no eclipse apenas “jogamos” a mensagem MQTT e o eclipse se encarrega de mandar. A ideia é ser transparente para o usuário mesmo.
Resumindo: não fazemos nada no eclipse (eu pelo menos não fiz). Simplesmente uso ele como o broker MQTT para o projeto. E você não precisa criar um MQTT no eclipse, você cria os tópicos, as mensagens, e manda pra lá. O cliente MQTT (do celular) vai lá, procura por esses tópicos e as mensagens, e faz a comunicação. Basicamente é isso.
Abraço!
Adilson
Olá boa tarde eu gostaria de saber se existe alguma maneira de ligarmos mais de um sensor dht11 na mesma esp8266?
Oi Lucas,
Existe sim. Você pode usar os pinos digitais para essa função. Por favor dê uma olhada nesse post sobre DHT11 com ESP8266: https://www.arduinoecia.com.br/termometro-iot-com-esp8266-dht11-oled/
Abraço!
Adilson