Marcio Cunha

Como usar MQTT para monitorar sensores com ESP32 via Wi-Fi

Aprenda a implementar telemetria eficiente com MQTT e ESP32, conectando sensores via Wi-Fi para automação. Este guia prático explora o ciclo de vida da conexão, otimização de tópicos e estratégias para um envio de dados robusto em cenários residenciais e industriais.

Marcio Cunha•7 min
Também disponível em:EnglishEspañol
Resumo
  • MQTT no ESP32 permite telemetria de sensores, otimizando o consumo de energia e a banda da rede Wi-Fi.
  • A estrutura de tópicos no MQTT é crucial para organizar e escalar o fluxo de dados em sistemas de automação.
  • O ciclo de vida da conexão, incluindo `keep-alive` e mensagens `Last Will and Testament` (LWT), garante a resiliência do sistema.
  • Otimizar a comunicação significa escolher o QoS correto e compactar payloads para reduzir o tráfego de rede.
  • A implementação prática no ESP32 envolve gerenciar a conexão Wi-Fi, configurar o cliente MQTT e publicar dados de forma segura.

Por que usar MQTT com ESP32 para monitorar sensores?

Monitorar sensores em tempo real, seja em uma casa inteligente ou numa linha de produção industrial, exige uma forma eficiente e confiável de transmitir dados. É aqui que o protocolo MQTT (Message Queuing Telemetry Transport) e o microcontrolador ESP32 se destacam. O MQTT é um protocolo leve de mensagens publicado/assinado (publish/subscribe), ideal para dispositivos com recursos limitados, como microcontroladores, pois minimiza o consumo de energia e a banda de rede. O ESP32, por sua vez, é uma plataforma robusta e acessível, com Wi-Fi e Bluetooth integrados, perfeita para coletar e enviar dados de sensores.

Neste artigo, vamos desvendar como combinar o poder do ESP32 com a inteligência do MQTT para criar sistemas de telemetria eficazes. Abordaremos desde o ciclo de vida da conexão até as melhores práticas para organizar seus tópicos e otimizar o envio de dados via Wi-Fi, garantindo que suas leituras cheguem ao destino de forma segura e eficiente, mesmo em ambientes desafiadores como o chão de fábrica ou residências com muitos dispositivos.

MQTT: O Coração da Telemetria IoT

O MQTT funciona com uma arquitetura centralizada, onde um servidor, chamado broker, atua como um ponto de distribuição de mensagens. Os dispositivos, conhecidos como clientes, se conectam a este broker e podem publicar mensagens (enviar dados) ou assinar (receber dados) tópicos específicos. Um tópico é como uma "caixa de correio" hierárquica (ex: casa/sala/temperatura), para a qual os dados são enviados ou de onde são retirados.

A beleza do MQTT está na sua simplicidade e nos seus recursos avançados para garantir a entrega. O Quality of Service (QoS), por exemplo, define o nível de garantia de entrega de uma mensagem, variando de "no máximo uma vez" (QoS 0) a "exatamente uma vez" (QoS 2). Além disso, as mensagens `Last Will and Testament` (LWT) são essenciais: o cliente configura uma mensagem que o broker envia automaticamente para um tópico específico caso a conexão do cliente caia de forma inesperada. Isso é vital para saber quando um sensor deixou de funcionar, indicando problemas na rede ou no dispositivo.

ESP32: Escolha Ideal para Conectividade e Automação

O ESP32, da Espressif Systems, tornou-se o queridinho dos desenvolvedores IoT. Seus dois núcleos de processamento (ou um, dependendo do modelo), a capacidade de operar em baixíssimo consumo de energia e o módulo Wi-Fi integrado o tornam perfeito para aplicações de telemetria. Ele pode coletar dados de uma vasta gama de sensores, como temperatura, umidade, presença ou níveis de líquidos, e enviá-los para o broker MQTT utilizando a rede Wi-Fi existente, eliminando a necessidade de cabeamento complexo ou módulos de comunicação adicionais.

Sua versatilidade e o amplo suporte da comunidade, com bibliotecas robustas para MQTT, Wi-Fi e diversos sensores, aceleram muito o desenvolvimento. A facilidade de programação, seja via Arduino IDE ou ESP-IDF, permite que tanto hobbistas quanto engenheiros criem soluções complexas com relativa rapidez. Para cenários de automação residencial, ele pode integrar sistemas de iluminação e climatização; na indústria, pode monitorar máquinas e processos, otimizando a manutenção preditiva e a eficiência operacional.

Ciclo de Vida da Conexão e Eficiência no Wi-Fi

A gestão da conexão Wi-Fi é um ponto crítico para dispositivos IoT alimentados por bateria. O ESP32 permite estratégias de economia de energia, como o `light sleep` e `deep sleep`, onde ele "dorme" por longos períodos e "acorda" apenas para ler sensores e enviar dados. No MQTT, o parâmetro `keep-alive` é fundamental: ele define o intervalo máximo de inatividade entre o cliente e o broker. Se nenhum pacote for trocado nesse período, o cliente envia um `PINGREQ` para manter a conexão viva. Um `keep-alive` bem ajustado evita reconexões desnecessárias e preserva a bateria.

Além disso, a forma como os dados são enviados também impacta a eficiência. Enviar pequenos pacotes de dados em intervalos regulares é geralmente mais eficiente do que enviar grandes blocos raramente. Utilizar payloads no formato JSON, mas de forma compacta (evitando nomes de chaves muito longos), reduz o volume de tráfego. Entender o ciclo completo – conectar ao Wi-Fi, conectar ao MQTT, publicar, e potencialmente desconectar para dormir – é a chave para uma telemetria robusta e energeticamente eficiente.

Implementação Prática: Monitorando um Sensor

Vamos colocar a mão na massa e implementar um monitor de temperatura e umidade usando um sensor DHT11/DHT22 e um ESP32, publicando os dados via MQTT. Para isso, você precisará do ESP32, um sensor DHT e um broker MQTT (pode ser local, como Mosquitto, ou um serviço em nuvem).

  1. Configurar o Ambiente de Desenvolvimento

    Primeiro, certifique-se de ter a IDE do Arduino instalada com o suporte à placa ESP32. Instale as bibliotecas necessárias via Gerenciador de Bibliotecas: "PubSubClient" para MQTT e "DHT sensor library" para o sensor.

  2. Conectar o Sensor ao ESP32

    Conecte o pino de dados do seu sensor DHT a um pino digital do ESP32 (ex: GPIO4). O pino VCC vai para 3.3V e o GND para o GND do ESP32. Adicione um resistor de 10k Ohm entre o pino de dados e VCC, se o seu sensor não tiver um interno.

  3. Estruturar o Código Principal

    O código abaixo exemplifica a conexão Wi-Fi, MQTT e a leitura do sensor. Adapte o SSID, senha, IP do broker e os tópicos conforme sua necessidade.

    #include <WiFi.h> #include <PubSubClient.h> #include <DHT.h> const char* ssid = "SeuSSID"; const char* password = "SuaSenha"; const char* mqtt_server = "192.168.1.100"; const int mqtt_port = 1883; const char* mqtt_client_id = "ESP32Sensor"; const char* mqtt_user = ""; // Opcional const char* mqtt_pass = ""; // Opcional const char* mqtt_topic_temp = "casa/sala/temperatura"; const char* mqtt_topic_hum = "casa/sala/umidade"; #define DHTPIN 4 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); WiFiClient espClient; PubSubClient client(espClient); void setup_wifi() { delay(10); Serial.println("Conectando ao WiFi..."); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi conectado"); Serial.print("Endereço IP: "); Serial.println(WiFi.localIP()); } void reconnect_mqtt() { while (!client.connected()) { Serial.print("Tentando conexão MQTT..."); if (client.connect(mqtt_client_id, mqtt_user, mqtt_pass)) { Serial.println("conectado"); // Se houver tópicos para assinatura, faça aqui. // client.subscribe("topico/controle"); } else { Serial.print("falhou, rc="); Serial.print(client.state()); Serial.println(" tentando novamente em 5 segundos"); delay(5000); } } } void setup() { Serial.begin(115200); dht.begin(); setup_wifi(); client.setServer(mqtt_server, mqtt_port); } void loop() { if (!client.connected()) { reconnect_mqtt(); } client.loop(); // Lida com reconexões e mensagens recebidas // Leitura do sensor float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(h) || isnan(t)) { Serial.println("Falha ao ler o sensor DHT!"); } else { // Publica temperatura String tempPayload = String(t, 2); Serial.print("Publicando temperatura: "); Serial.print(tempPayload); Serial.print(" no tópico "); Serial.println(mqtt_topic_temp); client.publish(mqtt_topic_temp, tempPayload.c_str()); // Publica umidade String humPayload = String(h, 2); Serial.print("Publicando umidade: "); Serial.print(humPayload); Serial.print(" no tópico "); Serial.println(mqtt_topic_hum); client.publish(mqtt_topic_hum, humPayload.c_str()); } delay(30000); // Publica a cada 30 segundos } 
  4. Monitorar no Broker MQTT

    Após carregar o código no ESP32, utilize um cliente MQTT como `mqtt-explorer` ou `mosquitto_sub` para assinar os tópicos casa/sala/temperatura e casa/sala/umidade. Você verá os dados do seu sensor sendo publicados em tempo real.

    mosquitto_sub -h 192.168.1.100 -t "casa/sala/#" -v 

Gerenciando Tópicos e Mensagens: Boas Práticas

A forma como você estrutura seus tópicos MQTT é vital para a escalabilidade e organização do sistema. Evite tópicos genéricos e prefira uma hierarquia lógica. Por exemplo, em vez de `temperatura`, use `predio/andar/sala/temperatura`. Isso permite que você assine tópicos mais amplos (ex: `predio/#`) para receber dados de todo o edifício ou de um andar específico (`predio/andar/+`). Considere também usar o QoS 1 (`At least once`) para mensagens críticas que precisam de garantia de entrega, como alertas de segurança, e QoS 0 (`At most once`) para dados de telemetria que não exigem retransmissão rigorosa, como leituras de temperatura rotineiras, visando a eficiência.

Para a carga útil (payload) das mensagens, o JSON é o formato mais flexível. Ele permite encapsular múltiplos valores (ex: temperatura, umidade, pressão) em uma única mensagem, reduzindo o número de publicações. Por exemplo, em vez de dois tópicos para temperatura e umidade, um único tópico casa/sala/dados pode publicar {"temperatura":24.5, "umidade":60.2}. Mensagens retained (`retained messages`) também são úteis: o broker armazena a última mensagem publicada em um tópico e a envia imediatamente para qualquer novo assinante, garantindo que novos clientes recebam o estado atual de um sensor assim que se conectam. Para complementar essa implementação em produção, vale conferir também nossas análises técnicas sobre Como medir ripple em fontes de bancada com osciloscópio e Servidor lento? Como achar gargalos de disco com iostat.

Conclusão

A combinação do ESP32 com o protocolo MQTT oferece uma solução robusta e flexível para monitorar sensores e implementar telemetria em diversos ambientes, desde a automação residencial até a industrial. Ao compreender e aplicar as melhores práticas de ciclo de vida da conexão, gerenciamento de tópicos e otimização de dados via Wi-Fi, é possível construir sistemas eficientes, escaláveis e resilientes.

Dominar esses conceitos não só permite criar projetos IoT mais eficazes, mas também prepara o terreno para sistemas de automação mais complexos, onde a comunicação confiável e o baixo consumo de energia são diferenciais. Continue explorando e adaptando estas técnicas para atender às demandas específicas de seus projetos, garantindo que seus dados cheguem onde precisam, quando precisam.