Monitoramento Remoto de Sensores com ESP32 e MQTT
Marcelo V. Souza
882ms 716us
O ESP32 é uma poderosa ferramenta para projetos de Internet das Coisas (IoT). Com seu suporte integrado a Wi-Fi e Bluetooth, ele permite a conexão de dispositivos ao redor do mundo. Neste artigo, vamos explorar como implementar o monitoramento remoto de sensores usando o ESP32 e o protocolo MQTT, permitindo a coleta e análise de dados em tempo real.
Por Que Usar o ESP32 e MQTT para Monitoramento Remoto?🔗
O monitoramento remoto de sensores é essencial em diversas aplicações, desde a automação residencial até a indústria 4.0. O ESP32, com seu baixo custo e alto desempenho, é ideal para essas tarefas. Já o MQTT é um protocolo de comunicação leve, perfeito para dispositivos com recursos limitados e com necessidade de comunicação eficiente e em tempo real.
Componentes Necessários🔗
Para seguir este projeto, você vai precisar dos seguintes componentes:
- ESP32
- Sensor de Temperatura e Umidade DHT11 ou DHT22
- Protoboard e Jumpers
- Cabo USB para programação do ESP32
- Computador com Arduino IDE instalado
Conectando o Sensor ao ESP32🔗
Esquema de Ligação
O sensor DHT11/DHT22 é fácil de usar e fornece leituras de temperatura e umidade. Vamos conectar o sensor ao ESP32 conforme o esquema abaixo:
- Pino VCC do DHT: Conecte ao pino 3.3V do ESP32.
- Pino GND do DHT: Conecte ao GND do ESP32.
- Pino Data do DHT: Conecte ao pino GPIO 4 do ESP32.
Nota: Alguns sensores DHT possuem quatro pinos. Neste caso, geralmente o quarto pino não é utilizado ou é outro GND.
Configurando o Ambiente de Desenvolvimento🔗
Antes de começarmos a programar, certifique-se de que o Arduino IDE está configurado para o ESP32. Se não estiver, siga os passos abaixo:
1. Abra o Arduino IDE.
2. Vá em Arquivo > Preferências.
3. No campo URLs Adicionais para Gerenciadores de Placas, adicione:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
4. Clique em OK.
5. Vá em Ferramentas > Placa > Gerenciador de Placas.
6. Pesquise por ESP32 e instale o pacote ESP32 by Espressif Systems.
Instalando Bibliotecas Necessárias
Vamos precisar das seguintes bibliotecas:
- DHT sensor library: para comunicação com o sensor DHT.
- PubSubClient: para comunicação MQTT.
Para instalar:
1. Vá em Sketch > Incluir Biblioteca > Gerenciar Bibliotecas.
2. Pesquise por DHT sensor library e instale a biblioteca de Adafruit.
3. Pesquise por Adafruit Unified Sensor e instale.
4. Pesquise por PubSubClient e instale.
Escrevendo o Código para o ESP32🔗
Vamos escrever um código que lê os dados do sensor e publica esses dados em um broker MQTT.
Configurando Credenciais Wi-Fi e MQTT
Primeiro, vamos definir as credenciais da rede Wi-Fi e do broker MQTT:
#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
#define DHTPIN 4 // Pino onde o DHT está conectado
#define DHTTYPE DHT22 // Defina DHT11 ou DHT22
const char* ssid = "SEU_SSID";
const char* password = "SUA_SENHA";
const char* mqtt_server = "ENDERECO_DO_MQTT_BROKER";
WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHTPIN, DHTTYPE);
Configurando a Conexão Wi-Fi
No setup(), vamos conectar o ESP32 à rede Wi-Fi:
void setup()
{
Serial.begin(115200);
delay(10);
dht.begin();
WiFi.begin(ssid, password);
Serial.println();
Serial.print("Conectando-se a ");
Serial.println(ssid);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi conectado");
Serial.println("Endereço IP: ");
Serial.println(WiFi.localIP());
client.setServer(mqtt_server, 1883);
}
Função para Reconectar ao MQTT
Caso a conexão com o broker seja perdida, precisamos reconectar:
void reconnect()
{
while (!client.connected())
{
Serial.print("Tentando conexão MQTT...");
// Cria um ID de cliente aleatório
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str()))
{
Serial.println("Conectado");
}
else
{
Serial.print("Falha, rc=");
Serial.print(client.state());
Serial.println(" Tentando novamente em 5 segundos");
delay(5000);
}
}
}
Loop Principal
No loop(), vamos ler os dados do sensor e publicar via MQTT:
void loop()
{
if (!client.connected())
{
reconnect();
}
client.loop();
float temperatura = dht.readTemperature();
float umidade = dht.readHumidity();
// Verifica se houve falha na leitura do sensor
if (isnan(temperatura) || isnan(umidade))
{
Serial.println("Falha na leitura do sensor DHT!");
return;
}
// Converte os valores para string
char tempString[8];
dtostrf(temperatura, 1, 2, tempString);
char umidString[8];
dtostrf(umidade, 1, 2, umidString);
// Publica os dados no broker MQTT
client.publish("casa/sala/temperatura", tempString);
client.publish("casa/sala/umidade", umidString);
Serial.print("Temperatura: ");
Serial.print(temperatura);
Serial.println(" *C");
Serial.print("Umidade: ");
Serial.print(umidade);
Serial.println(" %");
// Aguarda 10 segundos antes da próxima leitura
delay(10000);
}
Código Completo
Segue o código completo para copiar e colar no Arduino IDE:
#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
#define DHTPIN 4 // Pino onde o DHT está conectado
#define DHTTYPE DHT22 // Defina DHT11 ou DHT22
const char* ssid = "SEU_SSID";
const char* password = "SUA_SENHA";
const char* mqtt_server = "ENDERECO_DO_MQTT_BROKER";
WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHTPIN, DHTTYPE);
void setup()
{
Serial.begin(115200);
delay(10);
dht.begin();
WiFi.begin(ssid, password);
Serial.println();
Serial.print("Conectando-se a ");
Serial.println(ssid);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi conectado");
Serial.println("Endereço IP: ");
Serial.println(WiFi.localIP());
client.setServer(mqtt_server, 1883);
}
void reconnect()
{
while (!client.connected())
{
Serial.print("Tentando conexão MQTT...");
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str()))
{
Serial.println("Conectado");
}
else
{
Serial.print("Falha, rc=");
Serial.print(client.state());
Serial.println(" Tentando novamente em 5 segundos");
delay(5000);
}
}
}
void loop()
{
if (!client.connected())
{
reconnect();
}
client.loop();
float temperatura = dht.readTemperature();
float umidade = dht.readHumidity();
if (isnan(temperatura) || isnan(umidade))
{
Serial.println("Falha na leitura do sensor DHT!");
return;
}
char tempString[8];
dtostrf(temperatura, 1, 2, tempString);
char umidString[8];
dtostrf(umidade, 1, 2, umidString);
client.publish("casa/sala/temperatura", tempString);
client.publish("casa/sala/umidade", umidString);
Serial.print("Temperatura: ");
Serial.print(temperatura);
Serial.println(" *C");
Serial.print("Umidade: ");
Serial.print(umidade);
Serial.println(" %");
delay(10000);
}
Explicação do Código🔗
Vamos analisar as partes-chave do código para entender seu funcionamento.
Incluindo Bibliotecas
Utilizamos as bibliotecas WiFi.h para conexão Wi-Fi, PubSubClient.h para MQTT e DHT.h para o sensor:
#include <WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
Definindo Constantes e Variáveis
Definimos o pino do sensor, o tipo do DHT, as credenciais Wi-Fi e o endereço do broker MQTT:
#define DHTPIN 4
#define DHTTYPE DHT22
const char* ssid = "SEU_SSID";
const char* password = "SUA_SENHA";
const char* mqtt_server = "ENDERECO_DO_MQTT_BROKER";
Configurando o Setup
No setup(), inicializamos a comunicação serial, o sensor DHT e conectamos ao Wi-Fi:
void setup()
{
Serial.begin(115200);
dht.begin();
WiFi.begin(ssid, password);
// Código de conexão Wi-Fi...
}
Configuramos também o servidor MQTT:
client.setServer(mqtt_server, 1883);
Loop Principal
No loop(), verificamos se estamos conectados ao broker MQTT e, caso não estejamos, chamamos reconnect(). Em seguida, lemos os dados do sensor e publicamos:
void loop()
{
if (!client.connected())
{
reconnect();
}
client.loop();
float temperatura = dht.readTemperature();
float umidade = dht.readHumidity();
// Verificação e publicação dos dados...
}
Função de Reconexão
A função reconnect() tenta conectar ao broker MQTT. Se não conseguir, aguarda 5 segundos e tenta novamente:
void reconnect()
{
while (!client.connected())
{
// Tenta conectar...
}
}
Configurando o Broker MQTT🔗
Para receber os dados publicados pelo ESP32, precisamos de um broker MQTT. Existem várias opções:
- Broker Local: Usando um computador com o Mosquitto instalado.
- Broker em Nuvem: Serviços como o HiveMQ, CloudMQTT ou Adafruit IO.
Usando o Mosquitto Localmente
Se optar por um broker local, siga os passos:
1. Instale o Mosquitto no seu computador.
2. Inicie o serviço do Mosquitto.
3. Use o endereço IP do computador como mqtt_server
no código.
Testando a Publicação de Dados
Para verificar se os dados estão sendo publicados, podemos usar um cliente MQTT:
- MQTT.fx: Aplicativo desktop para assinatura de tópicos MQTT.
- MQTTLens: Extensão para navegadores como o Chrome.
Assine os tópicos:
casa/sala/temperatura
casa/sala/umidade
Você deverá ver as leituras do sensor sendo atualizadas a cada 10 segundos.
Aplicações Práticas🔗
Com o monitoramento remoto configurado, as possibilidades são inúmeras:
- Automação Residencial: Monitorar temperatura e umidade em diferentes cômodos.
- Agricultura Inteligente: Coletar dados ambientais para otimizar a irrigação.
- Monitoramento Industrial: Acompanhar condições em equipamentos e ambientes de trabalho.
Expandindo o Projeto🔗
Este projeto pode ser expandido de várias formas:
- Adicionando Mais Sensores: Como sensores de luminosidade, gases ou presença.
- Controlando Dispositivos: Receber comandos via MQTT para acionar relés ou atuadores.
- Integração com Bancos de Dados: Armazenar os dados coletados para análises futuras.
- Visualização em Dashboards: Usar plataformas como o Grafana ou ThingsBoard para criar painéis em tempo real.
Considerações Finais🔗
O uso do ESP32 combinado com o MQTT oferece uma solução robusta para monitoramento remoto de sensores. Com este conhecimento, você pode criar sistemas eficientes de coleta de dados, acessíveis de qualquer lugar. Lembre-se de sempre considerar aspectos de segurança, como autenticação e criptografia, ao implementar soluções em ambientes reais.
Dicas e Resolução de Problemas🔗
- Falha na Leitura do Sensor: Verifique as conexões e certifique-se de que o pino definido no código corresponde ao pino físico usado.
- Não Consegue Conectar ao Wi-Fi: Confirme as credenciais da rede e a proximidade do ESP32 ao roteador.
- Problemas com o Broker MQTT: Certifique-se de que o broker está ativo e acessível a partir da rede onde o ESP32 está conectado.
- Mensagens Não Recebidas: Verifique se os tópicos assinados correspondem exatamente aos publicados. O MQTT diferencia maiúsculas de minúsculas e espaços.
Segurança no Monitoramento Remoto🔗
Embora não tenhamos aprofundado neste artigo, é vital considerar a segurança ao enviar dados pela rede. O MQTT suporta autenticação com usuário e senha, além de criptografia TLS. Em projetos comerciais ou que lidem com informações sensíveis, implemente essas camadas adicionais de segurança para proteger seus dados e dispositivos.
Este artigo faz parte do grupo Monitoramento Remoto com ESP32 e MQTT
Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.
Tags