Tutorial ESP32 46/55 - Monitoramento Remoto de Temperatura usando HiveMQ MQTT | Kit ESP32 da SunFounder
Neste tutorial, criaremos um sistema de monitoramento de temperatura remoto usando o ESP32 e o protocolo MQTT. Este projeto nos permite publicar dados de temperatura em um broker MQTT e controlar um LED remotamente usando uma interface web. Ao pressionar um botão, podemos enviar leituras de temperatura para a nuvem, e também podemos receber comandos para ligar ou desligar o LED.
O ESP32 é um microcontrolador poderoso que possui Wi-Fi e Bluetooth integrados, tornando-o ideal para aplicações de Internet das Coisas (IoT). Nesta configuração, usaremos um termômetro NTC para medir a temperatura, um botão pressionado para acionar as leituras e um LED para indicar o status. Os dados serão enviados para o HiveMQ, um popular broker MQTT, onde podem ser acessados remotamente (no vídeo em 00:45).
Hardware Explicado
Para este projeto, utilizaremos os seguintes componentes:
- Microcontrolador ESP32:Esta placa serve como a unidade central de processamento, gerenciando conexões Wi-Fi e comunicações MQTT.
- Termistor NTC:Este sensor de temperatura varia sua resistência com base na temperatura. Ele fornece um sinal analógico que o ESP32 pode ler para determinar a temperatura atual.
- LED:Este diodo emissor de luz será usado para indicar o status com base em comandos recebidos via MQTT.
- Botão de Pressionar:Este botão fará com que o ESP32 leia a temperatura e a publique no broker MQTT.
Detalhes da Ficha Técnica
| Fabricante | SunFounder |
|---|---|
| Número da peça | ESP32 |
| Tensão de lógica/IO | 3,3 V |
| Tensão de alimentação | 5 V (via USB) |
| Corrente de saída (por canal) | 12 mA máximo |
| Orientação sobre frequência PWM | Até 40 kHz |
| Limiar de lógica de entrada | 0,3 V (baixo), 2,4 V (alto) |
| Limites térmicos | -40 a 85 °C |
| Pacote | ESP32-WROOM-32 |
- Garanta níveis de tensão adequados para evitar danos.
- Use resistores de pull-up para o botão de pressão para garantir leituras estáveis.
- Capacitores de desacoplamento podem ajudar a estabilizar a fonte de alimentação.
- Tenha cuidado com a fiação do termistor para evitar leituras incorretas.
- Verifique os detalhes do seu broker MQTT para uma conexão bem-sucedida.
Instruções de fiação

Para conectar os componentes, comece ligando o termistor NTC. Conecte um pino do termistor ao supply de 3,3 V no ESP32. O outro pino conecta-se ao pino 36 no ESP32 e deve também ser conectado a um resistor de 10 kΩ, que por sua vez está ligado ao terra. Isso cria um divisor de tensão que permite que o ESP32 leia a resistência do termistor.
Em seguida, conecte o LED. O pino mais longo (ânodo) do LED se conecta ao pino 4 no ESP32 através de um resistor de 220 Ω, enquanto o pino mais curto (cátodo) se conecta ao terra. Para o botão, conecte um lado a 3.3 V e o outro lado ao pino 14 no ESP32. Além disso, conecte um resistor de 10 kΩ do pino do botão ao terra para garantir um estado LOW estável quando o botão não estiver pressionado.
Instale a biblioteca necessária
OPubSubClienta biblioteca é usada aqui, você pode instalá-la a partir doGerente de Biblioteca.
Exemplos de Código e Tutorial
Na configuração, inicializamos a comunicação serial, estabelecemos a conexão Wi-Fi e configuramos o servidor MQTT. Aqui está um trecho do código de configuração:
void setup() {
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
}Esta parte do código estabelece a conexão com a rede Wi-Fi e configura o servidor MQTT. Os modos dos pinos para o botão e o LED também são configurados aqui.
A função loop verifica continuamente o estado do botão e publica dados de temperatura quando pressionado. Aqui está um trecho focado do loop:
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
if (digitalRead(buttonPin)) {
long now = millis();
if (now - lastMsg > 5000) {
lastMsg = now;
char tempString[8];
dtostrf(thermistor(), 1, 2, tempString);
client.publish("SF/TEMP", tempString);
}
}
}Nesse loop, verificamos se o ESP32 está conectado ao broker MQTT. Se o botão for pressionado, ele lê a temperatura do termistor e a publica no tópico "SF/TEMP" a cada 5 segundos.
Demonstração / O que Esperar
Quando o projeto estiver configurado e em funcionamento, pressionar o botão publicará a temperatura atual no broker MQTT. Você pode monitorar esses dados de qualquer cliente MQTT. Além disso, você pode enviar mensagens para controlar o LED; enviar "on" o acenderá, enquanto "off" o desligará. Fique atento ao comportamento esperado no vídeo às 15:30, onde as leituras de temperatura são exibidas após cada pressionar do botão.
Marcas de Tempo do Vídeo
- 00:00 Início
- 2:05 Introdução ao projeto
- 7:06 Serviço HiveMQ gratuito
- 7:56 Fiação explicada
- 11:11 Código Arduino explicado
- 18:46 Selecionando placa ESP32 e porta COM no Arduino IDE
- 20:30 Demonstração do broker HiveMQ Free
/*
* :ref: https://randomnerdtutorials.com/esp32-mqtt-publish-subscribe-arduino-ide/
* https://docs.sunfounder.com/projects/kepler-kit/en/latest/iotproject/5.mqtt_pub.html
*/
#include <WiFi.h>
#include <PubSubClient.h>
// #include <Wire.h>
// Substitua as próximas variáveis pela sua combinação de SSID/Senha.
const char* ssid = "SSID";
const char* password = "PASSWORD";
// Adicione o endereço do seu Broker MQTT, exemplo:
const char* mqtt_server = "broker.hivemq.com";
const char* unique_identifier = "sunfounder-client-sdgvsda";
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
int value = 0;
// Pino LED
const int ledPin = 4;
const int buttonPin = 14;
// Quando você se conecta ao WIFI, apenas os pinos 36, 39, 34, 35, 32 e 33 podem ser usados para leitura analógica.
// Defina constantes
const int thermistorPin = 36; // Pino conectado ao termistor
const float referenceVoltage = 3.3;
const float referenceResistor = 10000; // Valor de resistência (10k)
const float beta = 3950; // Valor Beta (Valor Típico)
const float nominalTemperature = 25; // Temperatura nominal para o cálculo do coeficiente de temperatura
const float nominalResistance = 10000; // Valor de resistência à temperatura nominal
void setup() {
Serial.begin(115200);
// configurações padrão
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
}
void setup_wifi() {
delay(10);
// Começamos conectando a uma rede WiFi.
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
String messageTemp;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
messageTemp += (char)message[i];
}
Serial.println();
// Se uma mensagem for recebida sobre o tópico "SF/LED", você verifica se a mensagem é "on" ou "off".
// Altera o estado de saída de acordo com a mensagem.
if (String(topic) == "SF/LED") {
Serial.print("Changing state to ");
if (messageTemp == "on") {
Serial.println("on");
digitalWrite(ledPin, HIGH);
} else if (messageTemp == "off") {
Serial.println("off");
digitalWrite(ledPin, LOW);
}
}
}
void reconnect() {
// Loop até estarmos reconectados.
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Tentar conectar
if (client.connect(unique_identifier)) {
Serial.println("connected");
// Inscrever-se
client.subscribe("SF/LED");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Aguarde 5 segundos antes de tentar novamente.
delay(5000);
}
}
}
float thermistor() {
int adcValue = analogRead(thermistorPin); // Ler valor do ADC
float voltage = (adcValue * referenceVoltage) / 4095.0; // Calcule a voltagem
float resistance = (voltage * referenceResistor) / (referenceVoltage - voltage); // Calcule a resistência do termistor com a configuração atualizada.
// Calcule a temperatura usando a equação do parâmetro Beta.
float tempK = 1 / (((log(resistance / nominalResistance)) / beta) + (1 / (nominalTemperature + 273.15)));
float tempC = tempK - 273.15; // Obtenha a temperatura em graus Celsius.
float tempF = 1.8 * tempC + 32.0; // Obter temperatura em Fahrenheit
// Imprimir temperatura
Serial.print("Temp: ");
Serial.println(tempC);
delay(200); // espere 200 milissegundos
return tempC;
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// se o botão for pressionado, publique a temperatura no tópico "SF/TEMP"
if (digitalRead(buttonPin)) {
long now = millis();
if (now - lastMsg > 5000) {
lastMsg = now;
char tempString[8];
dtostrf(thermistor(), 1, 2, tempString);
client.publish("SF/TEMP", tempString);
}
}
}
Common Course Links
Common Course Files
Recursos e referências
-
Documentação
Arquivos📁
Nenhum arquivo disponível.