//simular em: https://wokwi.com/projects/316434364352168512 #include #include #include "PubSubClient.h" const int LED_PIN = 2; // Pino do LED controlado pelo MQTT // Wokwi-GUEST na simulação const char *WIFI_SSID = "helio"; // SSID da rede WiFi //sem senha na simulação const char *WIFI_PASSWORD = "123456789"; // Senha da rede WiFi const char *BROKER_MQTT = "test.mosquitto.org"; // Endereço do broker MQTT int PORTA = 1883; // Porta do servidor MQTT const char *topicoInscricao = "univap/eletronica/helio/led"; // Tópico MQTT para inscrição String idUsuario; // ID do Cliente MQTT, utilizando o endereço MAC WiFiClient wifi; // Cliente WiFi PubSubClient clienteMQTT(wifi); // Cliente MQTT // Declaração das funções utilizadas no programa bool conectarWifi(); void escutarCanalInscrito(char *topic, byte *message, unsigned int length); bool conectarBrokerMQTT(); void loop(); void setup(); void inscreverTopico(const char *topic); void setup() { Serial.begin(9600); // Inicializa a comunicação serial randomSeed(analogRead(0)); // Inicializa a semente para geração de números aleatórios Serial.println(); if (conectarWifi()) { Serial.println("Conectado ao WiFi com sucesso"); Serial.print("Endereço IP: "); Serial.println(WiFi.localIP()); clienteMQTT.setServer(BROKER_MQTT, PORTA); // Configura o servidor MQTT e porta clienteMQTT.setCallback(escutarCanalInscrito); // Configura a função de callback para receber mensagens if (conectarBrokerMQTT()) { inscreverTopico(topicoInscricao); // Inscreve-se no tópico MQTT desejado } pinMode(LED_PIN, OUTPUT); // Configura o pino do LED como saída } else { Serial.println("Falha ao conectar ao WiFi"); } } void loop() { if (!clienteMQTT.connected()) { conectarBrokerMQTT(); // Reconecta ao broker MQTT caso a conexão seja perdida } clienteMQTT.loop(); // Mantém a comunicação MQTT ativa } bool conectarWifi() { WiFi.mode(WIFI_STA); // Configura o modo WiFi como estação cliente WiFi.begin(WIFI_SSID, WIFI_PASSWORD); // Conecta-se à rede WiFi Serial.print("Conectando ao WiFi "); while (WiFi.status() != WL_CONNECTED) { // Aguarda até que a conexão seja estabelecida delay(500); Serial.print("."); } Serial.println(); return true; // Retorna verdadeiro quando conectado com sucesso ao WiFi } bool conectarBrokerMQTT() { while (!clienteMQTT.connected()) { Serial.println("Conectando ao Broker MQTT..."); String macAddress = WiFi.macAddress(); // Obtém o endereço MAC do dispositivo macAddress.replace(":", ""); // Remove os dois pontos do endereço MAC // Monta o ID do Cliente MQTT utilizando o endereço MAC idUsuario = "id do Cliente: " + macAddress; Serial.println(idUsuario); // Tenta conectar-se ao broker MQTT com o ID do Cliente configurado if (clienteMQTT.connect(idUsuario.c_str())) { Serial.println("Conectado ao Broker MQTT"); return true; // Retorna verdadeiro quando conectado com sucesso ao broker MQTT } else { Serial.print("Falha ao conectar, rc="); Serial.print(clienteMQTT.state()); // Imprime o estado da conexão MQTT Serial.println(". Nova tentativa em 5 segundos"); delay(5000); // Aguarda 5 segundos antes de tentar reconectar } } return false; // Retorna falso se não conseguir se conectar ao broker MQTT } void inscreverTopico(const char *topic) { if (clienteMQTT.subscribe(topic)) { Serial.print("Inscrito no tópico: "); Serial.println(topic); // Imprime o tópico MQTT no qual foi inscrito com sucesso } else { Serial.print("Falha ao inscrever no tópico: "); Serial.println(topic); // Imprime o tópico MQTT no qual falhou ao se inscrever } } void escutarCanalInscrito(char *topic, byte *payload, unsigned int length) { Serial.print("Mensagem recebida no tópico: "); Serial.println(topic); // Imprime o tópico MQTT no qual recebeu a mensagem String mensagem = ""; for (int i = 0; i < length; i++) { mensagem += (char)payload[i]; // Monta a mensagem recebida byte por byte } Serial.println("Conteúdo da mensagem: " + mensagem); // Imprime o conteúdo da mensagem recebida // Verifica se a mensagem recebida é para controlar o LED if (String(topic) == String(topicoInscricao)) { if (mensagem == "ligar") { digitalWrite(LED_PIN, HIGH); // Liga o LED Serial.println("LED ligado"); } else if (mensagem == "desligar") { digitalWrite(LED_PIN, LOW); // Desliga o LED Serial.println("LED desligado"); } else { Serial.println("Comando não reconhecido"); // Imprime se o comando não for reconhecido } } }