#include <WiFi.h> // Inclui a biblioteca WiFi para conectar o ESP32 a uma rede WiFi
#include <PubSubClient.h> // Inclui a biblioteca PubSubClient para comunicação MQTT
#include <ESP32Servo.h> // Inclui a biblioteca ESP32Servo para controlar servomotores
Servo meuServo; // Objeto do tipo Servo para controlar o servomotor
// Definição das credenciais da rede WiFi
const char* ssid = "Wokwi-GUEST"; // Nome da rede WiFi
const char* senha = ""; // Senha da rede WiFi (vazia neste caso)
const char* servidor_mqtt = "test.mosquitto.org"; // Endereço do broker MQTT
WiFiClient espClient; // Cria um cliente WiFi
PubSubClient cliente(espClient); // Cria um cliente MQTT usando o cliente WiFi
long ultimaMensagem = 0; // Variável para armazenar o tempo da última mensagem
char mensagem[50]; // Array de caracteres para armazenar mensagens
int valor = 0; // Variável para armazenar um valor (não está sendo usada no código)
void setup() {
Serial.begin(115200); // Inicia a comunicação serial a 115200 bps (bits por segundo)
meuServo.attach(5); // Anexa o servomotor ao pino 5 do ESP32
configurar_wifi(); // Chama a função para configurar a conexão WiFi
cliente.setServer(servidor_mqtt, 1883); // Define o servidor MQTT e a porta de comunicação
cliente.setCallback(callback); // Define a função de callback para o cliente MQTT
}
void configurar_wifi() { // Função para configurar a conexão WiFi
delay(10);
Serial.println();
Serial.print("Conectando a ");
Serial.println(ssid); // Exibe o nome da rede WiFi
WiFi.begin(ssid, senha); // Conecta à rede WiFi com as credenciais fornecidas
while (WiFi.status() != WL_CONNECTED) { // Aguarda até que a conexão seja estabelecida
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi conectado");
Serial.println("Endereço IP: ");
Serial.println(WiFi.localIP()); // Exibe o endereço IP obtido
}
void callback(char* topico, byte* carga, unsigned int comprimento) { // Função de callback chamada quando uma mensagem MQTT é recebida
String mensagemRecebida; // String para armazenar a mensagem recebida
Serial.print("Mensagem recebida [");
Serial.print(topico);
Serial.print("] ");
for (int i = 0; i < comprimento; i++) {
mensagemRecebida += ((char)carga[i]); // Converte a carga recebida em uma string
}
Serial.print(mensagemRecebida);
if (topico == "/ThinkIOT/Servo-nodered") { // Verifica se o tópico da mensagem é o esperado
Serial.print(" ");
int status = mensagemRecebida.toInt(); // Converte a mensagem recebida em um número inteiro
int posicao = map(status, 1, 100, 0, 180); // Mapeia o valor de 1-100 para o intervalo de 0-180 graus
Serial.println(posicao);
meuServo.write(posicao); // Move o servomotor para a posição calculada
delay(15); // Pequeno atraso para garantir que o servo se mova suavemente
}
}
void reconectar() { // Função para reconectar ao broker MQTT caso a conexão seja perdida
while (!cliente.connected()) { // Continua tentando conectar enquanto não estiver conectado
Serial.print("Tentando conexão MQTT...");
if (cliente.connect("ESPClient")) { // Tenta conectar com o ID "ESPClient"
Serial.println("conectado");
cliente.subscribe("/ThinkIOT/Servo-nodered"); // Se conectado, inscreve-se no tópico esperado
} else {
Serial.print("falhou, rc=");
Serial.print(cliente.state()); // Exibe o código de erro da tentativa de conexão
Serial.println(" tentar novamente em 5 segundos");
delay(5000); // Aguardando 5 segundos antes de tentar novamente
}
}
}
void loop() { // Função principal que roda continuamente
if (!cliente.connected()) { // Verifica se o cliente MQTT está conectado
reconectar(); // Se não estiver, tenta reconectar
}
cliente.loop(); // Mantém a conexão MQTT ativa e processa as mensagens recebidas
delay(100); // Atraso de 100 ms entre cada iteração do loop
}