Controle e Monitoramento IoT com NodeMCU e MQTT 221

O módulo Wifi ESP8266 NodeMCU é uma das mais interessantes placas / plataformas existentes. A razão disso é simples: em uma pequena placa estão disponíveis I/Os, circuitaria de regulação de tensão, conectividade USB para programação (em Lua ou pela Arduino IDE) e conectividade WI-FI (ESP8266 12-E), caracterizando uma placa auto-suficiente para projetos envolvendo IoT, como faremos neste post envolvendo o NodeMCU e MQTT.

Será mostrada uma das mais interessantes aplicações desta placa: a conectividade com a nuvem através de MQTT para monitoramento e controle de um output, com um diferencial, que é a interface com o usuário usando uma página web.

Funcionamento do MQTT

O MQTT (Message Queue Telemetry Transport) consiste em um protocolo de mensagens leve, criado para comunicação M2M (Machine to Machine). Por exigir muito pouco “poder de fogo” em termos de processamento e banda / consumo de Internet, este é um dos protocolos ideais para dispositivos embarcados. Por esta razão, o MQTT é famoso no conceito IoT (Internet of Things).

Uma comunicação MQTT é composta das seguintes partes: há publishers (quem irá disponibilizar informações), subscribers (quem irá receber as informações) e Broker (servidor MQTT, na nuvem / acessível de qualquer lugar do planeta que contenha conexão com a Internet). Teoricamente, não há limite especificado de subscribers e publishers em uma mesma comunicação MQTT, pois o limite nesse aspecto  é do servidor em lidar com as conexões.

Em suma: publishers enviam informação para o Broker, subscribers recebem informação do Broker e o Broker gerencia a troca de mensagens. Ou seja, o trabalho pesado fica a cargo do Broker, deixando os sistemas embarcados livre para gerenciar outras coisas.

NodeMCU e MQTT

Sem entrar no mérito da especificação do protocolo MQTT (ou seja, byte a byte do protocolo), grosso modo uma mensagem MQTT publicada / enviada possui duas partes importantes:

  • Tópico – “chave” / identificação da informação publicada. É usado para direcionar a informação publicada / enviada a quem assina (quem “dá subscribe”) no tópico. O tópico consiste de uma string (por exemplo: MQTTTesteTopico)
  • Payload – informação que deseja enviar (propriamente dita).

Um publisher, conectado ao Broker (servidor MQTT) , envia/publica as informações em um dado momento. Os subscribers, assim como os publishers, também estão conectados aos brokers e “escutando” mensagens trafegadas com o tópico-alvo. Quando uma mensagem com o tópico alvo é publicada, automaticamente são direcionadas aos subscribers.

Em outras palavras: uma solução em IoT que usa MQTT possui somente um servidor (Broker), sendo todo o restante composto de clients MQTT.

Outra informação importante é que um mesmo client MQTT pode ser subscriber e publisher de diversos tópicos.

Como utilizar o NodeMCU e MQTT

O NodeMCU pode ser programado para interagir com um broker MQTT, ou seja, ele pode ser programado para ser um client MQTT. Antes de ser programado para isso, é necessário:

1 – Preparar a IDE Arduino para programar o NodeMCU. Veja como fazer isso no post Como programar o NodeMCU com IDE Arduino

2 – Baixar e instalar a biblioteca pubsubclient. Para baixar, visite o GitHub do projeto.

Feito isso, devemos escolher um broker MQTT para utilizar. Há inúmeros brokers disponíveis para uso (tanto públicos / sem custo quanto privados / pagos). Dos públicos, eu recomendo fortemente o iot.eclipse.org (broker oficial da equipe que mantém o MQTT), que irá funcionar perfeitamente com o nosso projeto de NodeMCU e MQTT.

Enfim, agora é possível usarmos o NodeMCU como um client MQTT! Para isso, será feito um projeto que permite controlar e monitorar um output do NodeMCU via MQTT. O output em questão é o próprio LED da placa (que, neste caso, está ligado diretamente ao output D0).

Importante:
1)
O LED possui acionamento em lógica invertida, ou seja, para acendê-lo é preciso enviar o estado LOW para D0 e para apagá-lo é necessário enviar estado High. Isto ocorre pois o output está ligado ao catodo do LED na placa.

2) O ID MQTT no código serve como identificador para o broker, o permitindo gerenciar as conexões. Se você escolher um ID MQTT que já está sendo utilizado, a conexão do mesmo será interrompida para a sua ser estabelecida. Isto pode gerar grandes transtornos para ambos os dispositivos com mesmo ID MQTT. Desta forma, recomendo que o ID MQTT seja escolhido como algo aleatório (assim garante-se unicidade do mesmo).

3) Como não foi utilizado nenhum componente além da própria NodeMCU, não há circuito esquemático envolvido (ou seja, em termos de hardware é preciso somente do NodeMCU!)

Programa NodeMCU e MQTT

Vamos à programação!

//Programa: NodeMCU e MQTT - Controle e Monitoramento IoT
//Autor: Pedro Bertoleti

#include <ESP8266WiFi.h> // Importa a Biblioteca ESP8266WiFi
#include <PubSubClient.h> // Importa a Biblioteca PubSubClient

//defines:
//defines de id mqtt e tópicos para publicação e subscribe
#define TOPICO_SUBSCRIBE "MQTTMakerHeroEnvia"     //tópico MQTT de escuta
#define TOPICO_PUBLISH   "MQTTMakerHeroRecebe"    //tópico MQTT de envio de informações para Broker
                                                   //IMPORTANTE: recomendamos fortemente alterar os nomes
                                                   //            desses tópicos. Caso contrário, há grandes
                                                   //            chances de você controlar e monitorar o NodeMCU
                                                   //            de outra pessoa.
#define ID_MQTT  "HomeAut"     //id mqtt (para identificação de sessão)
                               //IMPORTANTE: este deve ser único no broker (ou seja, 
                               //            se um client MQTT tentar entrar com o mesmo 
                               //            id de outro já conectado ao broker, o broker 
                               //            irá fechar a conexão de um deles).
                               

//defines - mapeamento de pinos do NodeMCU
#define D0    16
#define D1    5
#define D2    4
#define D3    0
#define D4    2
#define D5    14
#define D6    12
#define D7    13
#define D8    15
#define D9    3
#define D10   1


// WIFI
const char* SSID = "SSID"; // SSID / nome da rede WI-FI que deseja se conectar
const char* PASSWORD = "SENHA"; // Senha da rede WI-FI que deseja se conectar
 
// MQTT
const char* BROKER_MQTT = "iot.eclipse.org"; //URL do broker MQTT que se deseja utilizar
int BROKER_PORT = 1883; // Porta do Broker MQTT


//Variáveis e objetos globais
WiFiClient espClient; // Cria o objeto espClient
PubSubClient MQTT(espClient); // Instancia o Cliente MQTT passando o objeto espClient
char EstadoSaida = '0';  //variável que armazena o estado atual da saída
 
//Prototypes
void initSerial();
void initWiFi();
void initMQTT();
void reconectWiFi(); 
void mqtt_callback(char* topic, byte* payload, unsigned int length);
void VerificaConexoesWiFIEMQTT(void);
void InitOutput(void);

/* 
 *  Implementações das funções
 */
void setup() 
{
    //inicializações:
    InitOutput();
    initSerial();
    initWiFi();
    initMQTT();
}
 
//Função: inicializa comunicação serial com baudrate 115200 (para fins de monitorar no terminal serial 
//        o que está acontecendo.
//Parâmetros: nenhum
//Retorno: nenhum
void initSerial() 
{
    Serial.begin(115200);
}

//Função: inicializa e conecta-se na rede WI-FI desejada
//Parâmetros: nenhum
//Retorno: nenhum
void initWiFi() 
{
    delay(10);
    Serial.println("------Conexao WI-FI------");
    Serial.print("Conectando-se na rede: ");
    Serial.println(SSID);
    Serial.println("Aguarde");
    
    reconectWiFi();
}
 
//Função: inicializa parâmetros de conexão MQTT(endereço do 
//        broker, porta e seta função de callback)
//Parâmetros: nenhum
//Retorno: nenhum
void initMQTT() 
{
    MQTT.setServer(BROKER_MQTT, BROKER_PORT);   //informa qual broker e porta deve ser conectado
    MQTT.setCallback(mqtt_callback);            //atribui função de callback (função chamada quando qualquer informação de um dos tópicos subescritos chega)
}
 
//Função: função de callback 
//        esta função é chamada toda vez que uma informação de 
//        um dos tópicos subescritos chega)
//Parâmetros: nenhum
//Retorno: nenhum
void mqtt_callback(char* topic, byte* payload, unsigned int length) 
{
    String msg;

    //obtem a string do payload recebido
    for(int i = 0; i < length; i++) 
    {
       char c = (char)payload[i];
       msg += c;
    }
  
    //toma ação dependendo da string recebida:
    //verifica se deve colocar nivel alto de tensão na saída D0:
    //IMPORTANTE: o Led já contido na placa é acionado com lógica invertida (ou seja,
    //enviar HIGH para o output faz o Led apagar / enviar LOW faz o Led acender)
    if (msg.equals("L"))
    {
        digitalWrite(D0, LOW);
        EstadoSaida = '1';
    }

    //verifica se deve colocar nivel alto de tensão na saída D0:
    if (msg.equals("D"))
    {
        digitalWrite(D0, HIGH);
        EstadoSaida = '0';
    }
    
}
 
//Função: reconecta-se ao broker MQTT (caso ainda não esteja conectado ou em caso de a conexão cair)
//        em caso de sucesso na conexão ou reconexão, o subscribe dos tópicos é refeito.
//Parâmetros: nenhum
//Retorno: nenhum
void reconnectMQTT() 
{
    while (!MQTT.connected()) 
    {
        Serial.print("* Tentando se conectar ao Broker MQTT: ");
        Serial.println(BROKER_MQTT);
        if (MQTT.connect(ID_MQTT)) 
        {
            Serial.println("Conectado com sucesso ao broker MQTT!");
            MQTT.subscribe(TOPICO_SUBSCRIBE); 
        } 
        else 
        {
            Serial.println("Falha ao reconectar no broker.");
            Serial.println("Havera nova tentatica de conexao em 2s");
            delay(2000);
        }
    }
}
 
//Função: reconecta-se ao WiFi
//Parâmetros: nenhum
//Retorno: nenhum
void reconectWiFi() 
{
    //se já está conectado a rede WI-FI, nada é feito. 
    //Caso contrário, são efetuadas tentativas de conexão
    if (WiFi.status() == WL_CONNECTED)
        return;
        
    WiFi.begin(SSID, PASSWORD); // Conecta na rede WI-FI
    
    while (WiFi.status() != WL_CONNECTED) 
    {
        delay(100);
        Serial.print(".");
    }
  
    Serial.println();
    Serial.print("Conectado com sucesso na rede ");
    Serial.print(SSID);
    Serial.println("IP obtido: ");
    Serial.println(WiFi.localIP());
}

//Função: verifica o estado das conexões WiFI e ao broker MQTT. 
//        Em caso de desconexão (qualquer uma das duas), a conexão
//        é refeita.
//Parâmetros: nenhum
//Retorno: nenhum
void VerificaConexoesWiFIEMQTT(void)
{
    if (!MQTT.connected()) 
        reconnectMQTT(); //se não há conexão com o Broker, a conexão é refeita
    
     reconectWiFi(); //se não há conexão com o WiFI, a conexão é refeita
}

//Função: envia ao Broker o estado atual do output 
//Parâmetros: nenhum
//Retorno: nenhum
void EnviaEstadoOutputMQTT(void)
{
    if (EstadoSaida == '0')
      MQTT.publish(TOPICO_PUBLISH, "D");

    if (EstadoSaida == '1')
      MQTT.publish(TOPICO_PUBLISH, "L");

    Serial.println("- Estado da saida D0 enviado ao broker!");
    delay(1000);
}

//Função: inicializa o output em nível lógico baixo
//Parâmetros: nenhum
//Retorno: nenhum
void InitOutput(void)
{
    //IMPORTANTE: o Led já contido na placa é acionado com lógica invertida (ou seja,
    //enviar HIGH para o output faz o Led apagar / enviar LOW faz o Led acender)
    pinMode(D0, OUTPUT);
    digitalWrite(D0, HIGH);          
}


//programa principal
void loop() 
{   
    //garante funcionamento das conexões WiFi e ao broker MQTT
    VerificaConexoesWiFIEMQTT();

    //envia o status de todos os outputs para o Broker no protocolo esperado
    EnviaEstadoOutputMQTT();

    //keep-alive da comunicação com broker MQTT
    MQTT.loop();
}

Desta forma, seu NodeMCU vira um client MQTT acessível de qualquer lugar do planeta!

Interação com o NodeMCU

Vimos até agora que é possível transformar a incrível placa NodeMCU em um client MQTT acessível por todo o planeta. Mas e para interagir com ele (ligar e desligar o output), como faremos?

Para isso, desenvolvi uma interface web que pode ser baixada clicando AQUI. Você pode hospedar essa interface em QUALQUER servidor web ou mesmo rodar no seu próprio computador / rodar localmente (desde que o computador possua conexão com Internet, claro)!

Esta interface web é basicamente um websocket que se comunica diretamente com o broker, por isso pode estar rodando em qualquer lugar com disponibilidade de Internet que funciona.

Observe a figura abaixo:

Figura 1 – screenshot da página de controle do NodeMCU
Figura 1 – screenshot da página de controle do NodeMCU

Para funcionar:

1 – Definir as strings dos tópicos de publish e subscribe e clicar em “Conectar”. Aguardar a mensagem Conectado ao Broker! aparecer na sessão “Debug / respostas do servidor”.

2 – Clicar em Ligar e Desligar para comandar o LED da placa NodeMCU. Observe que na sessão “Status do output” irá constar o estado atual do LED. Este estado é recebido do próprio NodeMCU, via MQTT (o que torna este controle um controle em tempo real).

3 – Se divertir com o NodeMCU e MQTT!

 Gostou? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

221 Comentários

  1. É possível receber mensagens de tópicos diferentes ao mesmo tempo?

    1. Olá Caio!

      No mesmo Broker é possível sim, aqui você pode conferir mais alguns detalhes: https://www.makerhero.com/blog/esp32-e-mqtt-dashboard-android/

      Abraços!
      Vinícius – Equipe MakerHero

  2. Olá Pedro,

    Se fosse para escolher entre MQTT ou MySQL_connection (conexão direta com o mysql), qual você usaria e porque?

  3. Oi Pedro tudo bem? Gostaria de agradecer por disponibilizar esse seu projeto, fiz um projeto baseado nele em uma disciplina da faculdade. Recentemente, houve uma atualização no Mosquitto, e a interface parou de conectar no broker. Você poderia me ajudar a implementar a alteração?
    O respositório da minha interface é esse: https://github.com/4ngelica/INTERFACE-RemoteCarAccess

    1. Angélica, tudo bem?

      Infelizmente, estou na correria. Eu até fiz um fork do seu projeto e tentei corrigir, mas com o tempo que tinha disponível não consegui corrigir.

      Eu creio que o seguinte site poderá te dar uma luz maior no assunto: http://www.steves-internet-guide.com/using-javascript-mqtt-client-websockets/

      Atenciosamente,
      Pedro Bertoleti

  4. Parabéns pela aula, o meu projeto se conecta no wifi, porem fica tentando se conectar ao BROKER, e não funciona… sabe oq pode ser ?

    1. Moises, obrigado pelo elogio.

      No caso, experimente trocar o broker MQTT (em todos os códigos-fonte). Sugiro usar o broker Hive MQ: broker.hivemq.com

      Atenciosamente,
      Pedro Bertoleti

  5. Boa tarde!

    Muito bacana, só fiquei com uma dúvida: Qual é a vantagem de usar um servidor mqtt no meio do caminho e não habilitar um servidor web no esp8266 e hospedar a página direto nele ? Seria pq o MQTT entrega para o cliente e no caso da página sendo acessada no meu servidor eu teria que reler a página lá no cliente a cada atualização de valores ?
    Abraços!

    1. A vantagem é a centralização na nuvem. Uma vez o servidor MQTT (broker) estando na nuvem, qualquer dispositivo em qualquer rede com acesso a internet pode acessa-lo, incluindo um client na forma de pagina web (como foi utilizado aqui neste artigo).

      Se embarcar uma página / servidor web no ESP, você fica restrito a rede local ou, se quiser liberar acesso para o mundo externo, tem que fazer redirecionamento de portas e tudo mais, abrindo brechas de segurança na sua rede.

  6. Se eu fosse utilizar o servidor Helix Sandbox, como ficaria a configuração?

  7. tenho que colocar a senha e o nome da rede no arquivo? Eu conectei ao broker, só que não aparece o botão de status (ligado/desligado)

    1. Coloquei a senha e rede, funcionou.

  8. Oi

    desde já obrigado Filipe pelos seus artigos que são sempre muito bons!

    Gostaria de saber qual a função e sua estrutura para fazer o acesso ao servidor de MQTT mas quando o servidor requer user e password

    penso ser entre as duas linhas de SetServer e Callback

    me pode dar essa dica? ja procurei e nunca encontro com isto que estou a pedir

    Muito obrigado
    Pedro Monteiro

  9. Projeto excepcional e simples, gostaria de saber se posso usar apenas o módulo ESP 12F? E já que só eu vou enviar/receber informações; se posso instalar a interface web no mesmo celular, pois este sempre terá de ter acesso a internete para fazer alguma coisa.

  10. Estou tentando implementar o MQTT e uma conexão HTTP juntos.. uma desconecta o outro… no caso seria a mesma biblioteca?

    1. Bom dia!

      Estou com o mesmo problema, você conseguiu uma solução?

  11. Tenho tentado colocar o projeto para funcionar, mas na parte da página Web sempre recebo a mesma mensagem: Está página diz undefined.
    O código que estou usando é basicamente o mesmo do post, mudando apenas SSID, PASSWORD e ID_MQTT. Gravo o código sem erros, o ESP8266 conecta na rede mas não consegue se conectar ao Broker MQTT: iot.eclipse.org.
    Algum sugestão do que poderia ser?
    Desde já, obrigado.

  12. Pedro, gostaria de saber se usando o broker mosquitto localmente no esp32 eu consigo fazer pub e sub remotamente de outra rede ou até mesmo no 4G através do App Mqtt Dash?

    Ou somente rodando em uma VPS em nuvem? Teria alguma forma sem ter o custo de uma VPS na aws por exemplo?

    Hoje uso o cloudmqtt e funcionou, mas atualmente ele não deixa mais criar contas cut Cat free.

  13. Ótimo post.
    Estou com um problema e acho que pode me ajudar.
    Quando eu tento publicar no meu tópico uma mensagem longa (lengh:267) eu começo a receber falha no envio. Ja aumentei o tamanho do buffer mas não adianta.
    Tem alguma dica?

  14. Olá. Estou com dificudade para inscrever um cliente MQTT em vários topicos, de modo que ele possa receber mensagens de varios publishers. Com a biblioteca PubSubClient.h isso é possivel?

    1. Sim, é possível. basta fazer subscribe nos topicos que deseja e tratar as mensagens recebidas conferindo os tópcios (na função mqtt_callbacl).

      1. Boa tarde Pedro Bertoleti, poderia dar um exemplo com dois tópicos diferentes, pois estou com dificuldades em receber mensagens de 2 tópicos diferentes.

  15. Não consegui fazer funcionar. Parou pq não conseguiu conexão com o Broker eclipse.com. Como posso verificar o problema. Usei as mesmas partes do código aqui do seu site. Mudei o ID HomeAut pra AntonioGagno e continuou sem funcionar. Pode me dizer o q fazer? Desde já o agradeço

    1. Parece que o Broker Eclipse mudou de endereço. De qualquer forma, ando usando outro Broker MQTT público recentemente: broker.hivemq.com

      Para usar este Broker, no NodeMCU e nos arquivos da página de monitoramento substitua as referências de “iot.eclipse.org” por “broker.hivemq.com”. Deverá funcionar.

  16. Excelente tutorial !!

    Algum projeto semelhante que exiba a leitura de um valor analógico?
    Consigo comunicar um Nodemcu e um ESP usando o mqtt como no projeto, porém ao invés de ligar o led preciso exibir na página web o valor lido do potenciômetro.

    1. Filipe, obrigado pelos elogios!

      Temos aqui no blog um projeto que creio que vá de encontro ao que deseja: https://www.makerhero.com/blog/expansao-de-portas-analogicas-nodemcu-arduino/

  17. Só pra deixar registrado caso alguém tenha o mesmo problema. Dei um monte de voltas até descobrir uma configuração do Websockets no Mosquitto que fez tudo funcionar certinho:

    # Websockets Listener
    port 1883
    listener 1884
    protocol websockets

    Aqui estou usando 1884 em vez de 9001 pra porta Websocket, e o connect usa esta URL:
    var url = “ws://192.168.1.152:1884”;

  18. Olá como vai tudo bem? Gostaria de
    saber o quenho de mudar para conectar dessa forma no ESP32 de 38 pinos

  19. A Pagina web esta dando erro, abre uma janela com “undefined” quando se tenta conectar, ja fiz de tudo e não consegui resolver o problema

    1. Michel, boa tarde.

      O broker iot.eclipse.org devia estar offline quando você testou. Sugiro você trocar o broker MQTT tanto no código do NodeMCU quanto na página (fica no arquivo tmo.js).
      Uma sugestão de broker MQTT gratuito para se usar é: broker.hivemq.com

      1. Estou com o mesmo problema, alterei o broker pois a url mudou para mqtt.eclipse.org porém sem sucesso… Se puder ajudar…

        1. Tive o mesmo problema e depois de muitas horas consegui resolver.

          O broker não conectava e dava erro na página.

          Na sketch do esp8266, altere o BROKER_MQTT para “mqtt.eclipse.org”. Já no arquivo Java tmo, modifique o item var url = “ws://iot.eclipse.org/ws” para var url = “ws://mqtt.eclipse.org/mqtt”.

          Aqui deu certo!

  20. Muito bom o artigo, mas eu to com uma dúvida, eu posso usar MQTT para conectar o nodeMCU em um supervisório como o elipse SCADA?

    1. Kleber, boa tarde.
      Obrigado pelo elogio!

      Infelizmente, não sei responder sua pergunta. Eu nunca trabalhei com SCADA.

  21. A PAGINA WEB NÃO FUNCIONA!!! A PARTE DA CONEXÃO DO NODE COM O BROKER FUNCIONA PERFEITAMENTE, MAS A PARTE DA PAGINA WEB CONECTAR COM O BROKER NÃO, APRESENTA A SEGUINTE MENSAGEM DE ERRO” WebSocket connection to ‘ws://iot.eclipse.org/ws’ failed: Error during WebSocket handshake: Unexpected response code: 404
    connect @ mosquitto.js:90
    Main.Page.Page.connect @ tmo.js:67
    (anonymous) @ tmo.js:10
    dispatch @ jquery-1.7.2.min.js:3
    i @ jquery-1.7.2.min.js:3 “

    1. Italo, boa tarde.

      Pela mensagem de erro, o broker iot.eclipse.org estava fora do ar quando você testou.
      Troque o broker MQTT (tanto na página quanto no NodeMCU) por outro que esteja operante e funcionará.

      Lista de brokers MQTT públicos: https://github.com/mqtt/mqtt.github.io/wiki/public_brokers
      Sugestão de broker MQTT público: broker.hivemq.com

      Atenciosamente,
      Pedro Bertoleti

  22. Pedro, primeiramente parabéns pelo post. Muito útil e didático.
    Gostaria de saber se você pode me ajudar com o seguinte problema:
    Atualmente estou desenvolvendo um projeto com Arduino Mega e Node MCU. O NodeMCU funciona como a interface wifi do Arduino e a comunicação entre os dois é via serial (comandos AT). O envio da telemetria é feita via MQTT com a biblioteca PubSubClient no Arduino. Atualmente consigo publicar as mensagens para o broker mas não consigo receber nenhuma mensagem mesmo tendo assinado o tópico corretamente. O mesmo código é adaptado para uma aplicação com SIM800L (GPRS) no lugar do NodeMCU e funciona bem tanto a publicação quando o recebimento de mensagens.

    Gostaria de saber se existe alguma limitação da porta serial do Arduino em receber as mensagens do NodeMCU e se existe alguma forma de contornar esse problema.

    Já pesquisei em vários fóruns e não achei uma solução definitiva.

    Desde já, obrigado.

    Abraço.

  23. Ola amigo boa tarde! estou fazendo uma automação com NODEMCU8266 já tenho uns reles funcionado conectado ao brocker do cloud mqtt conta free, estou tentando conectar outro só que fica só tentando e não consegue conectar na mesma conta , por tanto publicando em outros tópicos, como faço , para publicar outro esp, é possível?

  24. Boa tarde, tenho uma duvida, tenho um ESP8266 conectado a uma protoboard e um regulador de tensão e toda vez que ligo a protoboard na tomada através conector Jack DC , preciso pressionar o botão reset do esp para ele ligar, isso não acontece quando alimento o esp direto pela USB, sei que ele possui um pino reset também, como eu poderia utilizar esse pino para que eu não tenha que pressionar o botão físico toda vez que conectar a tomada. Obrigada

    1. Flavia, eu aconselho primeiro você a descobrir o porque o ESP8266 precisa deste Reset. Isso não é normal.
      O consumo de corrente do ESP8266 está muito perto to limite de corrente que o regulador suporta? O regulador está esquentando?

  25. Parece que o servidor voltou ao normal. Obrigado pela atenção de todos!

  26. bom dia Pedro! Pode me ajudar? não estou mais conseguindo conexao com o broker nem mesmo pelo seu aplicativo via web. Pode me dizer se eles sairam do ar ou coisa parecida? isso começou n quinta feira agora ….abraços

  27. Primeiramente parabéns pelo tutorial, me ajudou em vários sentidos.

    Eu to com uma dúvida, eu gostaria de colocar dois status de output na página (cada um vindo de um sensor diferente).

    Como eu poderia fazer isso?

  28. tem algum tutorial de como conectar imagens de uma câmera vga com o nodemcu e enviar essas imagens para uma aplicação mobile atravez de um broker mqtt?

    1. Rodrigo, o MQTT não é um protocolo feito para transmitir imagens (e arquivos em geral). Ele é feito para transmitir mensagens textuais. Esta aplicação que você deseja não se aplica ao MQTT.

  29. Que post bacana Pedro!

    Sou um novato em lidar com o Arduino e gostei muito do seu post. Gostaria de saber como obter o ID para broker tem que fazer algum cadastro etc..no link indicado por você e #define TOPICO_SUBSCRIBE “MQTTMakerHeroEnvia”
    #define TOPICO_PUBLISH “MQTTMakerHeroRecebe” são tópicos nomeados por vc como variável no seu código?

    Parabéns !!!!!

    Se for possível poderia tirar minhas duvidas obrigado.

    1. Jackson, primeiramente, muito obrigado pelos elogios!

      Tanto para o ID quanto para os tópcios, não há cadastro ou procedimento junto ao broker. Você que os define diretamente no código.
      Para casos onde há necessidade de dispositivos únicos/autenticados, há o recurso de se utilizar usuário e senha, porém os brokers abertos/publicos normalmente não aceitam este recurso.

      Atenciosamente,
      Pedro Bertoleti

  30. Ola, primeiramente muito obrigado por compartilhar este excelente trabalho, segundo eu tenho uma duvida, pra mim não ficou claro como vc conectou a interface ao código da IDE do arduino, clonei seu repositório porem não ficou claro, se você puder me explicar desde ja agradeço!

  31. No caso eu preciso que as informações provenientes do Broker sejam enviadas e recebidas no estilo html ou de alguma forma que outro programa de PC se encarregue de fazer os gráficos. Tem como me ajudar?

  32. Olá.

    No caso eu preciso que as informações provenientes do Broker sejam enviadas e recebidas no estilo html ou de alguma forma que outro programa de PC se encarregue de fazer os gráficos.

  33. Muito bom!
    Sou iniciante e estou pesquisando um projeto que envolva NodeMCU, MQTT e Camera.
    Se vc puder me ajudar com alguma dica ficarei agradecido.

  34. Pedro… Parabéns pelo projeto.
    Gostaria de tirar uma dúvida. Vi o servidor web que você criou em java para interface com a placa, e para funcionar apenas colocamos os IDs escolhido e conectamos com nosso servidor. Não sei programar JAVA mas gostaria de criar um app no AppInventor para fazer essa comunicação. Gostaria de saber como acesso o ESP8266 direto pelo navegador? Sem precisar do servidor que você criou? websocket

    1. Rafael, boa tarde.

      Só esclarecendo

      – Não foi construído um servidor, e sim clients MQTT (NodeMCU e a página web/interface web). O servidor é o broker MQTT iot.eclipse.org, sendo este totalmente fora do controle deste projeto.
      – A página web/interface web não foi feita em Java, e sim em HTML e JavaScript

      No caso, não sei como fazer comunicação MQTT no AppInventor (eu não trabalho com Appinventor), porém por se tratar de uma comunicação bem comum e largamente utilizada, você deve encontrar exemplos na Internet para se basear.

      Atenciosamente,
      Pedro Bertoleti

  35. Bom dia, Pedro. Obrigado pelo artigo. Muito interessante. Os comandos para esta placa vão somente via broker? Se eu tiver uma aplicação em uma rede que não está conectada à internet, como faço para enviar o mesmo comando de ligar/desligar o led?
    Obrigado.

    1. Danilo, boa tarde.
      Obrigado pela leitura e elogios.

      Se você estiver em uma rede que não está conectada à internet, você pode fazer sua aplicação enviar mensagens à placa via MQTT desde que haja um broker no sua rede. Além disso, os endereços do broker no programa do NodeMCU e na sua aplicação devem se referir ao endereço do broker na sua rede.

      Atenciosamente,
      Pedro Bertoleti

  36. muito bom o post.. parabens!

    tenho uma duvida. segui tudo certo o tutorial, testei e funcionou normalmente. editei o código da pagina web para se adequar a um projeto que estou fazendo, mas quando hospedei o site, no (000webhost – já que é grátis) ele não funcionou, sendo que fazendo o teste no próprio pc ele funciona normalmente.

    porque isso acontece ? e teria alguma alternativa para fazer funcionar nessa forma?

    1. Mauricio, boa tarde.

      Primeiramente, muito obrigado pela leitura e elogio!
      Sobre o site não funcionar ao hospeda-lo, há diversas causas possíveis. Vou listar abaixo as mais comuns, por favor verifique-as:

      – Você enviou para o servidor de hospedagem TODOS os arquivos vinculados à pagina (arquivos .js, .html, figuras, etc)?
      – O local que hospedou suporta hospedagem arquivos JavaScript (.js)? É bem provavel que sim, mas tenha certeza que o servidor aceita hospedar arquivos .js
      – O seu servidor de hospedagem possui regras para permitir a hospedagem gratuita (como, por exemplo, ser obrigado a inserir um código nas suas páginas para banners de patrocinadores)? Já vi caso de servidores que exigem tal coisa e, na ausência deste trecho de código nas páginas, o funcionamento das mesmas não fica ok.

      Atenciosamente,
      Pedro Bertoleti

  37. Olá !

    Eu fiz de acordo com o post e nenhuma das duas partes conecta ao broker iot.eclipse.org. No NodeMCU ele compila, carrega e conecta no wifi porém não conecta ao broker. já mudei o tópico do subscribe e do publish bem como o ID e não conecta… fica tentando de 2 em 2 segundos. Na pagina disponibilizada eu baixo o pacote com os arquivos e extraio do .rar em uma mesma pasta e abro com o navegador chrome… a interface fica idêntica a mostra no post mas quando colo os tópicos e clico em conectar não acontece nada e quando eu clico em desconectar aparece a mensagem no Status do output (vindos do NodeMCU via MQTT): A conexão com o broker foi perdida. Realmente eu fiz tudo certo porém nenhuma das partes conecta. Chegay a repetir o processo 3 vezes e dá a mesma coisa.

    O que pode ser e como eu poderia resolver esse problema?

    1. Walisson, pelo que você descreveu, me parece que a sua rede possui algum tipo de bloqueio à porta 1883 (porta do MQTT sem criptografia). Já vi este tipo de comportamento em redes empresariais, por medida de segurança. Verifique se é isso que ocorre no seu caso.

      Atenciosamente,
      Pedro Bertoleti

      1. Então… Estou em uma rede doméstica… minha casa. Olhei no meu roteador e não tem nada bloqueando a porta. O engraçado é que quando eu mudo o broker iot.eclipse.org pelo test.mosquitto.org no código do Arduino ele conecta normal. Ai como eu mudei, a interface Web não funcionou mesmo o NodeMCU conectando ao broker test.mosquitto.org , o que era esperado.

        Fiz outro teste também, tentei conectar através do roteamento do 4G do celular, compartilhando wifi. Mesmo assim com o broker iot.eclipse.org no NodeMCU não conecta.

        Eu uso o NodeRed através test.mosquitto.org e funciona muito bem… nunca tive problema. Mas com esse exemplo ta tenso.

        Nenhuma outra ideia do que pode ser? Cheguei até pensar que o Broker deixou de existir até porque esse artigo é de 2016. Mas não é o caso, eu acho! 😛

  38. Muito bom Pedrão!!

    1. Obrigadão!!

  39. Boa tarde !!!

    O erro na verdade é também … Erro compilando para a placa NodeMCU 0.9 ( ESP-12 Module)

    Grato

    1. Utilize NodeMCU 1.0.

      1. Puts !! Deu mesmo erro só que compilando a placa NodeMCU 1.0 ( ESP-12 Module)

  40. Boa tarde a todos !!!

    Não estou conseguindo rodar o NodeMCU e MQTT … o erro que aparece é INVALID PREPROCESSING DIECTIVE #PROGRAMA …. o que devo fazer ??

    Grato

    1. Reinaldo, boa tarde.

      Cara, desculpa, havia um erro de digitação. Acabei de arrumar o código do post, por favor copie, cole e tente novamente.

      Novamente, desculpa pela falha.

      Atenciosamente,
      Pedro Bertoleti

      1. Obrigado Pedro!!

        Resolvido , só que agora deu erro compilando para a placa NodeMCU 0.9 ( ESP-12 Module )

        Abraço

  41. Gostaria de saber de algum exemplo, tendo em vista dos artigos de enviar dados do devices para o servidor mqtt ou broker. Queria saber é possível do contrário do servidor broker mandar um mqtt para o device específico, para um executar uma operação específica no device como reset? Teria algum exemplo?

    1. Olá Marcelo.

      Sobre sua pergunta, o serviço de broker por si só não pode se comportar como MQTT client (ao menos, não conforme o protocolo MQTT é especificado). Como alternativa ao seu caso, pode-se ter um client mqtt rodando no mesmo computador que o broker está rodando, dessa forma você não precisaria de um client “físico”.

      Atenciosamente,
      Pedro Bertoleti

  42. Boa noite. Eu tenho um servidor MQTT instalado no meu computador, o mosquitto. Eu troquei o endereço do ” ws://iot.eclipse.org/ws ” para o endereço do servidor local aqui da rede porém ele nao funcionou. Sabe me dizer como posso fazer isso funcionar? Tenho que instalar algo a mais no mosquitto? Ou tenho que fazer mais alguma alteração no codigo por vocês feito? Obrigado!

    Rodrigo Galvão Barros da Silva
    1. Rodrigo, bom dia.

      O Mosquitto, por default, não é instalado com o websocket configurado. Sem websocket configurado, não é possível utilizar a página de monitoramento (comportamento semelhante ao que você relatou).

      Sendo assim, recomendo habilitar o suporte a websocket no seu broker Mosquitto. Para isso, siga as instruções deste endereço: https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-the-mosquitto-mqtt-messaging-broker-on-ubuntu-16-04

      Atenciosamente,
      Pedro Bertoleti

  43. Muito Bom!

    Muito bem explicado. Uso o Homeseer e estou a implementar o MQTT com um raspberry 3 com mosquitto como broker

    1. Antonio, muito obrigado pelo elogio! Fico feliz que tenha gostado do post!

  44. Pedro bom dia! Voce pode me indicar um aplicativo ou alguma sugestão para que eu possa utilizer esse seu aplicativo web no celular? Ontem fiz os testes deste aplicativo no PC com sucesso!. Agora eu quero desenvolver um app para ligar um mecanismo na minha residencia em outra cidade por wifi. Estou muito feliz com meus estudos junto a felipeflop. Enfim com 55 anos consegui fazer alguma coisa ligar pela internet kkkkkkkkkk…..desde ja te agradeço e fico no aguardo de suas orientaçoes.

    1. Claudio, bom dia.

      Fico feliz que o post foi util e que está te motivando a criar projetos!
      Sobre o uso no celular, a maneira mais simples é hospedar a pagina e os arquivos .js (os mesmos que você fez funcionar no PC) em um servidor web e acessar essa página (já publicada/online) do seu celular.

      Atenciosamente,
      Pedro Bertoleti

      1. oi obrigado Pedro! Então coloquei eles no DROPBOx mas não esta funcionando. Instalei o dropbox no meu cellular, coloquei todos os arquivos do javascript num mesmo diretorio e chamei o arquivo html. …nada acontece

        1. O Dropbox é um serviço de armazenagem de arquivos em nuvem. Até onde eu sei, não funciona como servidor de hospedagem web.

          Procure por servidores gratis de hospedagem web e coloque a página (html e demais arquivos js) lá.

          1. entendi….mas meu amigo voce com sua experiencia….sabendo que estou querendo fazer um controle pessoal….qual voce me recomenda como web server gratis ?…Desculpe o incomodo!

        2. É que desenvolvimento de sites e hospedagem não é meu forte/não é o que costumo trabalhar. Sendo assim, infelizmente nao tenho uma indicação 100% certeira de um serviço de hospedagem grátis que seja bom.

          Porém, já ouvi dizer que de algumas pessoas que usaram o webhost (https://br.000webhost.com/), pode ser que te atenda.

          1. Muito obrigado! Um grande abraço

          2. ..os scripts do seu aplicativo web são auto instalaveis (mosquito…etc) porque o servidor gratuito esta dizendo que não aceita esse tipo gratuitamente….

          3. eu coloquei no servidor web gratuito e fiz upload de todos os arquivos. tentei executar o html porem ao apertar os botoes nada acontece. no meu pc funciona perfeitamente…o que pode ter acontecido

          4. Pedro obrigado! consegui colocar no servidor que voce sugeriu…o erro foi que temos que usar o prefixo htpp e nao htpps…só isso…obrigado amigao pela força

          5. Boa tarde!
            Estou com o mesmo problema, ao rodar através da hospedagem o site não funciona.

            Vitor Silveira
  45. Bom dia,

    Gostaria de saber se é possível fazer a seguinte aplicação:

    Fazer um servidor MQTT para receber informação de, por exemplo, 10 ESP32. Essa informação é uma uma variavel inteira que é recebida do ESP32. Consigo nesse servidor, fazer uma interface gráfica? Qual o caminho? Sou ainda iniciante, mas estou estudando bastante.

  46. Pedro ..

    Gostaria de saber se é possivel e em caso positivo como se “faz” para enviar uma variavel através do comando mqtt.publish ao invés da constante “DY50” …..
    MQTT.publish(TOPICO_PUBLISH, “DY50”);

    quero enviar uma variável mais ou menos assim :

    float temperatura

    MQTT.publish(TOPICO_PUBLISH, temperatura);

    Obrigado
    Edmundo

    1. Edmundo, boa tarde.

      Respondendo a sua dúvida, você precisa “conveter” / colocar o dado numérico que quer mandar em string. Sobre isso, há duas considerações:

      1) Se a variável for de um tipo diferente do tipo float (in, por exemplo)

      Neste caso, o sprintf resolverá, da seguinte forma:

      char numero_str[10];

      sprintf(numero_str,”%d”,numero_str);

      Lembrando que pra usar o sprintf, precisa usar o include #include

      2) Se a variável for do tipo float

      Nesse caso, o sprintf da biblioteca do NodeMCU não suporta float.
      Assim sendo, você terá um trabalho a mais, multiplicando o valor float por um fator de potencia de 10 (10 elevado ao numero de casas decimais que deseja converter), atribuir esse resultado a um inteiro, converter pra string e enviar. No lado do receptor você divide pelo mesmo fator que multiplicou, recuperando assim o float (no numero de casas decimais que você quer preservar, conforme dito).

      Exemplo:

      float temperatura = 10.234567;
      int temperatura_int = (int)((float)temperatura*100); //para considerar 2 casas decimais (10^2 = 100)

      char numero_str[10];

      sprintf(numero_str,”%d”,temperatura_int);

      1. Prezado Pedro

        Obrigado pela sua pronta resposta … Funcionou direitinho ……

        Se me permite mais uma dúvida ….

        Com faço para nesse campo resultado (numero_str) para incluir uma constante antes de enviar via publish ?

        P.S. O campo ficaria mais ou menos assim …. “DY50102345”
        constante “DY50” + variavel “1202345” …

        Obrigado

        Edmundo

        1. Edmundo, basta digitar esta constante antes do %d no sprintf. Por exemplo:

          sprintf(numero_str,”DY50%d”,temperatura_int);

  47. Boa tarde, primeiramente é muito legal ver suas publicações. Gostaria de saber se posso usar a biblioteca pubsubclient para enviar publicações para o aws iot. Posso fazer isso direto, ou seja, o aws iot serve como broker tambem? Vocês tem alguma coisa publicada no blog sobre isso? Desde já agradeço a atenção.

    1. Rubens, boa tarde.

      Primeiramente, muito obrigado pela leitura do post e pelo elogio!
      Sobre o envio de informações para AWS IoT, infelizmente não tenho algo pronto sobre isso. Porém, pelo que li, por questões de segurança, não é possível utilizar diretamente a pubsubclient para enviar dados ao AWS IoT. Se deseja fazer um client que envia dados para o AWS IoT, aconselho você a verificar os SDKs oficiais da AWS:

      https://aws.amazon.com/pt/tools/

      Atenciosamente,
      Pedro Bertoleti

      https://github.com/aws

  48. Olá. Saberia me dizer se é possível criar a mesma página de web para outras entradas do usuário, que não on/off do led? Gostaria de fazer o mesmo mas com entradas do tipo “número”, a ser enviadas ao node.

    Parabéns pelo tópico, muito didático!

    1. Vinicius, boa tarde.

      Primeiramente, obrigado pelo elogio.
      Sim, é possível enviar strings para o NodeMCU. Para isso, usando esta página web, você precisará mexer no arquivo tmo.js e no html. Você tem conhecimento de JavaScript e HTML?

      Atenciosamente,
      Pedro Bertoleti

  49. Boa noite, e se o servidor MQTT tiver senha? Onde eu coloco a senha?

    Rodrigo Galvão Barros da Silva
  50. Boa Noite,

    Muito bom tutoria!! Essa programação é possível fazer utilizando o ESPlorer com linguagem Lua?

  51. ola ,estou muito interessado em realizar o projeto, comprei o nodeMCU e algumas coisinhas a mais, porem ao carregar o sketch estou tendo problema, aparece a msg de erro
    C:\Users\eliakim\Documents\ArduinoData\packages\esp8266\hardware\esp8266\2.4.0\libraries\ESP8266WiFi\src/ESP8266WiFi.h:27:1: error: expected unqualified-id before ‘extern’

    extern “C” {

    alguem pode me ajudar????????????

    1. Olá Eliaquim!

      Você parece estar com problemas para programar o NodeMCU. Acredito que esses outros posts podem te ajudar:

      https://www.makerhero.com/blog/programar-nodemcu-com-ide-arduino/

      https://www.makerhero.com/blog/esp8266-nodemcu-como-programar/

      Abraços!

      André – Equipe MakerHero

  52. Exelente explicaçao, ja trabalho com arduino em um nivel basico(arduino + php + mysql) nos meus projetos e isso é totalmente novo para min. Gostaria de saber se com o mqtt eu consigo criar dispositivos que se conectam a internet sem necessidade de abrir portas no roteador ou precisar ficar um redirecionador DNS, ja vi alguns dispositivos que voce apenas liga eles no Wifi e faz um cadastro é eles ja estao prontos para usos, gostaria muito de aprender sobre isso, seria essa a ideia?

    1. Olá Gustavo, se você trabalha com arduino ou ESP8266, certamente vai gostar de conhecer a plataforma “aRest”, com com esta biblioteca você utiliza o protocolo MQTT e transforma o seu dispositivo em uma API Rest, desta maneira voce pode acessá-lo de qualquer lugar, sem a necessidade de utilizar um serviço de DNS ou realizar a abertura de portas no roteador. É Grátis, da uma conferida –> https://github.com/marcoschwartz/aREST

  53. Ótimo artigo, Pedro.

    Estou com dificuldades em montar o meu projeto, talvez você possa me ajudar. A ideia é criar um sensor utilizando o NodeMCU junto com o DHT11, enviando os dados para o Mosquitto. Porém, pretendo fazer isso utilizando SSL/TLS, como sou iniciante nessa área, não encontrei nada que explicasse com clareza. O sensor já está funcionando, bastando apenas implementar tais protocolos de segurança. Você teria algo para me ajudar?

  54. Muito legal este tutorial… Este blog tem despertado meu interesse em automatizar minha casa. Eu gostaria de usar broker mqtt local em uma raspbarry, e na mesma rodar uma interce web, “uma dashboard” para monitorar e controlar todos os dispositivos (apagar e acender luzes, abrir portões, temperatura, nível de água, consumo de energia etc.) seria possível os senhores criarem algum tutorial de exemplo focando um pouca na dashboard?

  55. Seus posts são ótimos, sou apenas um entusiasta me aventurando nesse mundo IOT. Gostaria de saber se existe como controlar varias portas digitais do NodeMCU pelo mqtt?
    Desde já agradeço.
    Luís Augusto

    1. Luis Augusto, muito obrigado pelo elogio!

      Sim, existe como controlar portas digitais via MQTT com o NodeMCU. Leia este post, nele tem exatamente o que você busca: https://www.makerhero.com/blog/robo-iot-com-esp8266-nodemcu/

      Atenciosamente,
      Pedro Bertoleti

  56. Olá, fiz algumas alterações na interface Web que você criou e queria mudar o broker, fiz testes com o broker que você utilizou e deu tudo certo, mas quando mudo pra um broker local aparece uma mensagem “undefined”. Poderia me ajudar? Eu mudei no arquivo tmo.js de var url = “ws://iot.eclipse.org/ws” para var url = “ws://localhost” coloquei o IP da minha máquina também, mas continuou do mesmo jeito. Utilizo o mosquitto como broker local.

    1. Consegui. O mosquitto não vem com o websocket habilitado. Uso o ubuntu 18.04. Segue o tutorial para habilitar:
      $ sudo gedit /etc/mosquitto/mosquitto.conf

      Adicionei essas 3 linhas na área onde esta descrita Default listener:

      listener 1883
      listener 1884
      protocol websockets

      Reinicie o PC.

      Onde tem “ws:/iot.eclipse.org/ws” substitua por “ws://localhost:1884/mqtt”.

      Pronto.

  57. Bom dia. Muito bom o artigo. Parabéns.
    Eu o servidor MQTT AntoIO e gostaria de ativar uma notificação via Pusingbox através de um ESP8266. O ESP está conectado a um sensor de movimento Sr501 e quando ele acionar a sirene conectada a ele quero receber a notificação informando que a sirene foi ativada. Eu estou usando um ESP8266-01, ou seja só tenho as GPIOs 00 e 2 que podem ser usadas com OUTPUT e INPUT. Alguma dica pra me ajudar???
    Há como inserir uma linha de código do Pushingox e onde eu poderia inserir para ativar a notificação???

    Obrigado

    Meu código é este:

    #include
    #include

    const char *ssid = “your access point SSID”;
    const char *pass = “access point password”;
    const char *user = “your username”;
    const char *token = “your token”;
    const char *thing = “your thing”;

    // initialize AntoIO instance
    AntoIO controle(user, token, thing);

    int ctrl1 = 0, ctrl2 = 0;
    int value = 0;

    void setup() {
    Serial.begin(115200);
    delay(10);

    Serial.println();
    Serial.println();
    Serial.print(“Anto library version: “);
    Serial.println(controle.getVersion());

    Serial.print(“\nTrying to connect “);
    Serial.print(ssid);
    Serial.println(“…”);

    while (!controle.wifi.begin(ssid, pass));
    Serial.println(“\nConnected, trying to connect to broker…”);

    while (!controle.mqtt.connect());
    Serial.println(“\nConnected”);

    //port output
    pinMode(D3,OUTPUT);
    pinMode(D4,OUTPUT);

    controle.mqtt.onData(messageReceived);
    controle.mqtt.sub(“ctrl1”);
    controle.mqtt.sub(“ctrl2”);
    }

    void loop() {
    controle.mqtt.loop();
    }

    // a callback function for arriving data.
    void messageReceived(String thing, String channel, String payload) {

    Serial.print(“Recieved: “);
    Serial.print(thing);
    Serial.print(“/”);
    Serial.print(channel);
    Serial.print(“-> “);
    Serial.println(payload);

    if(channel.equals(“ctrl1”)){
    value = payload.toInt();
    if(value == 1){
    digitalWrite(D3,LOW);
    }
    else{
    digitalWrite(D3,HIGH);
    }
    controle.pub(“ctrl1status”, !digitalRead(D3));
    }
    else if(channel.equals(“ctrl2”)){
    value = payload.toInt();
    if(value == 1){
    digitalWrite(D4,LOW);
    }
    else{
    digitalWrite(D4,HIGH);

    controle.pub(“ctrl2status”, !digitalRead(D4));

    }
    }
    }

    1. Marinaldo, boa tarde.

      Primeiramente, muito obrigado pela leitura e elogio.
      Infelizmente, não tenho um projeto parecido com o seu para te ajudar. Porém, indico este post aqui do nosso blog como referência para a parte de notificações:

      https://www.makerhero.com/blog/alarme-de-incendio-com-esp8266-esp-12e/

      Atenciosamente,
      Pedro Bertoleti

      1. Pedro, muito obrigado por responder. Vou ver o post.

  58. Boa tarde.

    Primeiramente parabéns pelo tópico.

    Tenho uma dúvida a respeito do broker MQTT. Estou utilizando o CloudMQTT e consigo publicar tópicos e subscrever, recebendo as mensagens publicadas.

    Porém não consigo acessar as mensagens já enviadas. Por exemplo, se eu deixar meu dispositivo publicando dados um dia inteiro e no outro dia eu quiser ler estes dados de algum outro dispositivo, eles ficam armazenados no broker?

    Obrigado.

    1. Michel, primeiramente obrigado pelo elogio e pela leitura.

      Infelizmente, o broker por si só não armazena as mensagens enviadas. Ele apenas as redireciona.
      O único caso de armazenamento que conheço é para QoS = 2, onde as mensagens são armazenadas temporariamente no broker caso não existitem subscribers da mensagem em questão. Porém, uma vez que as mensagens foram entregues, o broker não mantém registro algum destas mensagens.

      Atenciosamente,
      Pedro Bertoleti

      1. Obrigado pelo retorno.

        Entendi. E caso eu deseje armazenar estes dados em algum provedor na nuvem, existe algum que já contenha o broker MQTT integrado ou eu preciso utilizar outro protocolo?

        Obrigado

        1. Desconheço algum serviço com essa funcionalidade que você que já pronta.

  59. Olá, gostaria de saber se é possível utilizar esse protocolo MQTT para integrar o nodemcu ao um aplicativo desenvolvido no Android Studio, teria algum exemplo dessa aplicação? Obrigado.

    1. Kenny, bom dia.

      Sim, é possível utilizar MQTT no Android, porém não tenho nenhum exemplo pronto sobre isso no momento. Eu recomendaria você começar por aqui: https://github.com/eclipse/paho.mqtt.android

      Atenciosamente,
      Pedro Bertoleti

  60. Felipe e Pedro,

    parabéns pelo tutorial, implementei conforme as especificações e funcionou perfeitamente. Farei uso como meus alunos na universidade.

    Um grande abraço e sucesso!!!

    1. Jasmine, muito obrigado! Fico feliz (e posso dizer o mesmo pela equipe MakerHero) por te ajudar!

  61. Pedro, boa tarde,

    Como posso colocar mais dois botões de para ligar e desligar?
    1 – Quais arquivos devo editar?
    2 – Qual lógica ser feita.

    OBS: Claro se isso for possivel.

  62. Fiz tudo como no exemplo e hospedei os arquivos em um web server, quando acesso do meu pc, blz, mas quando acesso do celular 3g ele nao faz nada, nem dá o status de conexao ao broken? o que seria?

    1. Marcelo, uma coisa ficou confusa: você hospedou ele num webserver local? Se sim, acho que ele não seria acessível via 3g do celular.

      Se o seu servidor não é local, imagino que o navegador que usou no celular está com execução de JavaScript desabilitada (isso explicaria também o que você relatou).

      Atenciosamente,
      Pedro Bertoleti

  63. Primeiramente parabéns
    Baixei sua interface funcionou perfeitamente quando subo para um servidor Web quando coloco conectar ele não obtêm resposta nenhuma…
    sabe qual é o problema ?

    1. Primeiro verifique as configurações do “wifi”, depois se a porta 1883 está liberada. Eu tive que liberar a minha porta(servidor local) para receber comandos externos via no-ip.

      1. não é isso ele só não funciona no servidor web, local funciona normal

  64. Boa tarde poderia me ajudar com esse codigo?

    #include // Importa a Biblioteca ESP8266WiFi
    #include // Importa a Biblioteca PubSubClient
    #include

    //defines:
    //defines de id mqtt e tópicos para publicação e subscribe
    #define TOPICO_SUBSCRIBE “jjtriacaenvia” //tópico MQTT de escuta
    #define TOPICO_PUBLISH “jjtriacarecebe” //tópico MQTT de envio de informações para Broker
    //IMPORTANTE: recomendamos fortemente alterar os nomes
    // desses tópicos. Caso contrário, há grandes
    // chances de você controlar e monitorar o NodeMCU
    // de outra pessoa.
    #define ID_MQTT “jjtriacameuportao” //id mqtt (para identificação de sessão)
    //IMPORTANTE: este deve ser único no broker (ou seja,
    // se um client MQTT tentar entrar com o mesmo
    // id de outro já conectado ao broker, o broker
    // irá fechar a conexão de um deles).

    #define Abrindo D7
    #define Fechando D6
    #define Sinal D2
    #define Aberto D4
    #define Fechado D5
    #define Controle D0
    int A = 0;
    int B = 0;
    int C = 0;
    int D = 1;
    int E = 1;

    int Barra = 10;

    char* Estado = “Fechado”;
    char* Direcao = “Parado”;
    long tempo = 0;
    long barratempo = 1000;

    Atm_timer timer1;
    Atm_timer sinal1;

    // WIFI
    const char* SSID = “Juliano”; // SSID / nome da rede WI-FI que deseja se conectar
    const char* PASSWORD = “ju290480”; // Senha da rede WI-FI que deseja se conectar

    // MQTT
    const char* BROKER_MQTT = “iot.eclipse.org”; //URL do broker MQTT que se deseja utilizar
    int BROKER_PORT = 1883; // Porta do Broker MQTT

    //Variáveis e objetos globais
    WiFiClient espClient; // Cria o objeto espClient
    PubSubClient MQTT(espClient); // Instancia o Cliente MQTT passando o objeto espClient

    void passar( int idx, int v, int up ){
    sinal1.begin()
    .onTimer (sinal)
    .start();
    }

    void sinal( int idx, int v, int up ){
    digitalWrite(Sinal, 1);
    delay(200);
    digitalWrite(Sinal, 0);
    }

    //Prototypes
    void initSerial();
    void initWiFi();
    void initMQTT();
    void reconectWiFi();
    void mqtt_callback(char* topic, byte* payload, unsigned int length);
    void VerificaConexoesWiFIEMQTT(void);
    void InitOutput(void);

    /*
    * Implementações das funções
    */
    void setup()
    {
    //inicializações:
    InitOutput();
    initSerial();
    initWiFi();
    initMQTT();
    }

    //Função: inicializa comunicação serial com baudrate 115200 (para fins de monitorar no terminal serial
    // o que está acontecendo.
    //Parâmetros: nenhum
    //Retorno: nenhum
    void initSerial()
    {
    Serial.begin(115200);
    }

    //Função: inicializa e conecta-se na rede WI-FI desejada
    //Parâmetros: nenhum
    //Retorno: nenhum
    void initWiFi()
    {
    delay(10);
    Serial.println(“——Conexao WI-FI——“);
    Serial.print(“Conectando-se na rede: “);
    Serial.println(SSID);
    Serial.println(“Aguarde”);

    reconectWiFi();
    }

    //Função: inicializa parâmetros de conexão MQTT(endereço do
    // broker, porta e seta função de callback)
    //Parâmetros: nenhum
    //Retorno: nenhum
    void initMQTT()
    {
    MQTT.setServer(BROKER_MQTT, BROKER_PORT); //informa qual broker e porta deve ser conectado
    MQTT.setCallback(mqtt_callback); //atribui função de callback (função chamada quando qualquer informação de um dos tópicos subescritos chega)
    }

    //Função: função de callback
    // esta função é chamada toda vez que uma informação de
    // um dos tópicos subescritos chega)
    //Parâmetros: nenhum
    //Retorno: nenhum
    void mqtt_callback(char* topic, byte* payload, unsigned int length)
    {
    String msg;

    //obtem a string do payload recebido
    for(int i = 0; i = barratempo) && (Barra = barratempo) && (Barra > 10 )) {
    tempo = currentMillis;
    Barra -= 10;
    }
    }
    if ((D == 1) && (E == 1)){
    Direcao = “Parado”;

    }

    //aberto ou fechado

    if ((A == 0) && (B == 1)){
    Estado = “Aberto”;
    Barra = 120;

    }
    if ((A == 1) && (B == 0)){
    Estado = “Fechado”;
    Barra = 10;

    }
    if ((A == 1) && (B == 1)){
    Estado = “Semi”;
    }

    Serial.println(A);
    Serial.println(B);
    Serial.println(C);
    Serial.println(Estado);
    Serial.println(Direcao);
    Serial.print(“Barra: “);
    Serial.println(Barra);

    if (C == 1) {
    timer1.begin()
    .stop();
    }
    }

    1. Tenho funcionando sem a implementação do MQQT no portão da minha casa porem só funciona quando estou conectado em minha Wifi. fiz um aplicativo no APP Inventor, ficou ótimo, retorna o estado e a posição em que se encontra o portão.

      Código sem o MQQT.

      #include
      #include
      #include
      #include
      #include
      #ifdef __AVR__
      #include
      #endif

      const char* Login = “Juliano”;
      const char* Senha = “ju290480”;

      IPAddress ip(192, 168, 2, 55);
      IPAddress gateway(192, 168, 2, 1);
      IPAddress subnet(255, 255, 255, 0);
      WiFiServer server(80);

      Atm_timer timer1;
      Atm_timer sinal1;

      #define Abrindo D7
      #define Fechando D6
      #define Sinal D2
      #define Aberto D4
      #define Fechado D5
      #define Controle D0
      int A = 0;
      int B = 0;
      int C = 0;
      int D = 1;
      int E = 1;
      int Barra = 10;

      String Estado = “Fechado”;
      String Direcao = “Parado”;
      long tempo = 0;
      long barratempo = 1000;

      void passar( int idx, int v, int up ){
      sinal1.begin()
      .onTimer (sinal)
      .start();
      }

      void sinal( int idx, int v, int up ){
      digitalWrite(Sinal, 1);
      delay(200);
      digitalWrite(Sinal, 0);
      }

      void setup() {
      #if defined (__AVR_ATtiny85__)
      if (F_CPU == 16000000) clock_prescale_set(clock_div_1); // NOVO CLOCK DO PROCESSADOR
      #endif
      Serial.begin(115200);
      WiFi.mode(WIFI_STA);
      delay(10);

      WiFi.begin(Login, Senha);
      WiFi.config(ip, gateway, subnet);

      pinMode(Abrindo, INPUT_PULLUP);
      digitalRead(Abrindo);

      pinMode(Fechando, INPUT_PULLUP);
      digitalRead(Fechando);

      pinMode(Sinal, OUTPUT);
      digitalWrite(Sinal, LOW);

      pinMode(Aberto, INPUT_PULLUP);
      digitalRead(Aberto);

      pinMode(Fechado, INPUT_PULLUP);
      digitalRead(Fechado);

      pinMode(Controle, OUTPUT);
      digitalWrite(Controle, LOW);

      Serial.println();
      Serial.print(“Conectando na rede: “);
      Serial.println(Login);

      while (WiFi.status() != WL_CONNECTED) {
      delay(3000);
      Serial.print(“.”);
      }

      Serial.println(“WiFi conectada”);

      server.begin();
      Serial.println(“Servidor Iniciado”);
      Serial.println(WiFi.localIP());

      //OTA
      ArduinoOTA.onStart([]() {
      Serial.println(“Start”);
      });
      ArduinoOTA.onEnd([]() {
      Serial.println(“\nEnd”);
      });
      ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
      Serial.printf(“Progress: %u%%\r”, (progress / (total / 100)));
      });
      ArduinoOTA.onError([](ota_error_t error) {
      Serial.printf(“Error[%u]: “, error);
      if (error == OTA_AUTH_ERROR) Serial.println(“Auth Failed”);
      else if (error == OTA_BEGIN_ERROR) Serial.println(“Begin Failed”);
      else if (error == OTA_CONNECT_ERROR) Serial.println(“Connect Failed”);
      else if (error == OTA_RECEIVE_ERROR) Serial.println(“Receive Failed”);
      else if (error == OTA_END_ERROR) Serial.println(“End Failed”);
      });
      ArduinoOTA.begin();
      Serial.println(“Ready”);
      Serial.print(“IP address: “);
      Serial.println(WiFi.localIP());
      }

      void loop() {
      ArduinoOTA.handle();
      WiFiClient client = server.available();
      automaton.run();
      unsigned long currentMillis = millis();

      A = digitalRead(Aberto);
      B = digitalRead(Fechado);
      C = digitalRead(Controle);
      D = digitalRead(Abrindo);
      E = digitalRead(Fechando);

      //Abrindo ou Fechando

      if ((D == 1) && (E == 0)){
      Direcao = “Abrindo”;
      if ((currentMillis – tempo >= barratempo) && (Barra = barratempo) && (Barra > 10 )) {
      tempo = currentMillis;
      Barra -= 10;
      }
      }
      if ((D == 1) && (E == 1)){
      Direcao = “Parado”;

      }

      //aberto ou fechado

      if ((A == 0) && (B == 1)){
      Estado = “Aberto”;
      Barra = 120;

      }
      if ((A == 1) && (B == 0)){
      Estado = “Fechado”;
      Barra = 10;

      }
      if ((A == 1) && (B == 1)){
      Estado = “Semi”;
      }

      if (!client) {
      return;
      }

      Serial.println(A);
      Serial.println(B);
      Serial.println(C);
      Serial.println(Estado);
      Serial.println(Direcao);
      Serial.print(“Barra: “);
      Serial.println(Barra);

      String req = client.readStringUntil(‘\r’);
      Serial.println(req);
      client.flush();

      String buf = “”;

      buf += “HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n\r\n”;
      buf += “\r\n”;
      buf += Barra;
      buf += ” “;
      buf += “”;
      buf += Estado;
      buf += Direcao;
      buf += “\n”;

      client.print(buf);
      client.flush();

      if (C == 1) {
      timer1.begin()
      .stop();
      }

      if (req.indexOf(“Tudo”) != -1){
      sinal1.begin()
      .onTimer (sinal)
      .start();
      timer1.begin()
      .stop();
      }
      if ((req.indexOf(“Pessoa”) != -1) && (A == 1) && (B == 0)){
      timer1.begin()
      .stop();
      delay(10);
      sinal1.begin()
      .onTimer (sinal)
      .start();
      timer1.begin(3500)
      .onTimer(passar)
      .start();
      }
      if ((req.indexOf(“Passar”) != -1) && (A == 1) && (B == 0)){
      timer1.begin()
      .stop();
      delay(10);
      sinal1.begin()
      .onTimer (sinal)
      .start();
      timer1.begin(3500)
      .onTimer(passar)
      .repeat(2)
      .start();

      }
      if ((req.indexOf(“Carro”) != -1) && (A == 1) && (B == 0)){
      timer1.begin()
      .stop();
      delay(10);
      sinal1.begin()
      .onTimer (sinal)
      .start();
      timer1.begin(25000)
      .onTimer(passar)
      .start();
      }

      Serial.println(“Client desconetado”);

      }

  65. Amigo, seria possível você aproveitar esse tópico e implementar o monitoramento via OpenHab ?

  66. Alguem pode me ajudar? queria saber como ficaria o codigo para ligar duas lampadas diferentes? tentei aqui mais sempre desliga as duas juntas. desde ja agradeço.

    Obrigado

    1. Junior, boa tarde.

      Coloque por favor aqui seu código, assim poderemos ver onde está errado.

      Atenciosamente,
      Pedro Bertoleti

    2. Fiz um script para 5 devices (sineir.blogspot.com). Colequei o mosquitto dentro do tplink wr1043nd e vinculei ao servidor remoto, pois minha internet sempre cai e “travava” o sistema. Fica aí um exemplo (mas precisa de ajustes, pois não entendo bem).

  67. Pexro, esse tutorial .e ajudou muito…. tudo dum funcionou perfeitamente. Só estou observando uma coisa, eu conecto ao broker, ligo/desligo pelo web normalmente, porem se eu ficar 2 minutos se interação “apertar o botão liga/desliga” tenho que conectar novamente…só que ele não fala que está desconectado só não funciona ai clico em conectar e tudo funciona normalmente… sabe o que pode ser isso?

    1. Rodrigo, boa tarde.

      Primeiramente, muito obrigado pela leitura.
      O seu problema ta com cara de ser tempo de keep-alive muito alto na interface web (seu roteador ou sua infra de rede está matando a conexão antes do tempo default de inatividade, então antes do keep-alive ser enviada a conexão já é encerrada, dando este efeito que você está vendo).
      O default de tempo de keep-alive é 60 segundos. Pra mudar esse valor, ao chamar a função de conexão no arquivo tmo.js, você deve passar um objeto do tipo connectOptions, com o parâmetro de keepalive com valor menor que 60s. Isso deverá resolver seu problema.

      Atenciosamente,
      Pedro Bertoleti

  68. Excelente Pedro, muito bom mesmo, era bem o que eu estava procurando!

    Consegui colocar pra funcionar tudo perfeitamente na rede local, porém quando hospedei a página na web… ela não encontra o servidor broker eu acho, pois não conecta.

    Saberia o que pode estar acontecendo?

    Obrigado!

    1. Thomas, muito obrigado pela leitura e elogio!

      Sobre o erro ocorrido, tenho duas perguntas:
      1) Você mandou TODOS os arquivos para o servidor (imagens, arquivos html e arquivos .js)?
      2) Você tem certeza que o servidor onde hospedou da acesso à sua página da porta 1883 (porta utilizada no projeto, que significa a porta do MQTT sem segurnança)?

      Atenciosamente,
      Pedro Bertoleti

  69. Só o meu que está dando erro na biblioteca?? Aparece que tem que ter e aquel &lt dá problema também, o que fazer??

    1. Boa tarde Gustavo,

      Por favor copie o código novamente, pois o mesmo estava sendo apresentado com erro.

      Abraço!

      Adilson – Equipe MakerHero

      1. Obrigado Adilson, agora deu certo. Mais uma dúvida, existe mais algum jeito para eu acessar a placa de uma rede WIFI externa?

        1. Estou com o meso problema já conseguiu resolver

  70. Bom dia Pedro Bertoleti;
    Como faço para controlar uma câmera yy2p com ESP8266 e mais 4 relés?
    Grato pela atenção!

  71. Bom dia prezado,
    Têm como usar o esp8266 12e nodemcu para monitora uma câmera de segurança yy2p pelo Mqtt?
    Grato!

  72. Pedro, parabéns pelo artigo!
    Acabei de adquirir um nodeMCU e o programa funcionou perfeitamente!
    Queria deixar apenas uma contribuição que me fez quebrar a cabeça por um tempo.
    Há uma versão do nodeMCU da Lolin (V3), em que o LED on board passou a ser ligado no pino D4 (GPIO 2).
    Caso seja o modelo de mais alguém, seria interessante colocar essa observação.

    Um abraço.

    1. Olá Pedro,

      Obrigado por compartilhar, mas todas as placas nodemcu da lolin e outras marcas, possuem o LED onboard no D4 GPIO2, e funcionam com logica invertida, ou seja, ativam com LOW e desativam com HIGH, neste link a folha de dados do ESP8266,
      https://raw.githubusercontent.com/nodemcu/nodemcu-devkit/master/Documents/NODEMCU_DEVKIT_SCH.png

      Abs.

      Carlos kwiek

  73. Olá Pedro. Tudo bem? Muto legal os seus artigos. Parabéns! Fiquei com uma dúvida…
    Montei o projeto CONTROLE E MONITORAMENTO IOT COM NODEMCU E MQTT e funcionou tudo perfeitamente no broker “iot.eclipse.org”. Quando alterei para o meu broker mosquitto que tenho instalado em uma instância própria na AWS, o websocket não funcionou. Conecta, mas o interruptor não liga ou desliga.
    Já fiz a alteração no firmware substituindo o endereço do broker e também no InterfaceWeb.html na linha 7, mas não adiantou. Você poderia me explicar melhor o que tenho que alterar?
    Obs. 1: Apesar de estar rodando na AWS, instalei um broker Mosquitto independente do AWS IoT, pois o mesmo não é compatível com o ESP8266.
    Obs. 2: Testei com outro MQTT Client e funcionou legal. Só o websocket que dar problema.
    Abraços.
    Vitor

    1. Vitor, boa noite.

      Primeiramente, muito obrigado pelo elogio e pela leitura!
      Sobre o seu problema, imagino que o que está ocorrendo é que, por default, o websocket não é habilitado ao se instalar o Mosquitto. Enfrentei o mesmo problema quando instalei um Mosquitto numa VPS minha da DigitalOcean, e o resolvi seguindo este tutorial: https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-the-mosquitto-mqtt-messaging-broker-on-ubuntu-16-04

      Imagino que você encontre na Internet algum tutorial ensinando a habilitar o websocket do Mosquitto no AWS.

      Atenciosamente,
      Pedro Bertoleti

      1. Valeu Pedro. Muito obrigado pelo retorno!

  74. Boa tarde, estou trabalhando nesse sistema e gostaria que me ajudasse, gostaria de deixar o MQTT que aparece na pagina oculto, ou em forma de include ou no proprio arquivo sql, tentei agumas formas em include, mas não conecta no MQTT, como faço isso.

  75. A pessoa utilizando esse protocolo (MQTT), utiliza nuvem ou computador pessoal para ficar rodando o servidor, supondo que eu escolha a nuvem, se minha casa cair a conexão, mesmo sem internet se eu estiver dentro de minha casa eu conseguiria controlar os dispositivos?

    1. Não. Pois o servidor broker está na nuvem, e seus dispositivos conversam por meio dele. O que você pode fazer é criar um broker local, que permita a conversa entre os dispositivos e que replique as mensagens para o broker na nuvem. Assim, em caso de falha na conexao, o broker local continuaria permitindo a comunicação com os publicadores e consumidores.

  76. Olá Pedro. Primeiramente parabéns pelo conteúdo redigido.

    Gostaria de saber se é possível desenvolver uma página web com login e senha em que eu configuro a minha rede wifi no ESP8266 e após isso é gerado um subscribe e um publish aleatório para que assim, um determinado subscriber só possa ver os status de seus respectivos publishers.

    Desde ja agradeço.

    1. Guilherme, boa noite. Primeiramente, muito obrigado pelo elogio e leitura do artigo!

      Eu não sei se isso é possível (nunca cheguei a fazer algo parecido). Infelizmente vou ficar te devendo a resposta.

      Atenciosamente,
      Pedro Bertoleti

    2. Boa noite é possível sim. Segue o link do github de um exemplo.

      Paulo Roberto Ramos Pereira
      1. Olá Paulo. Muito obrigado pelo exemplo.

  77. Olá, tenho uma dúvida. Estou implementando um sistema de monitoramento de energia usando MQTT. O protocolo diz que publish e subscriber devem assinar o mesmo tópico para que as informações que um publique o outro tenha acesso. Então, eu n entendi pq vocês criaram dois tópicos e também não vi qual o momento em que os dispositivos assinam esses tópicos.

    1. Emanuel, bom dia.

      O que ocorre é que há um tópico dedicado para transmitir informações da interface web para o NodeMCU e outro dedicado para transmitir informações do NodeMCU para a interface web. Portanto, cada tópico está com publish e subscrbe “amarrado”, conforme especifica o protocolo MQTT.

      A razão de ter dois tópicos foi facilitar a visualização de mensagens MQTT (essa foi a ideia, desculpa se não ficou claro e boa essa parte).

      Quanto ao momento em que o NodeMCU assina o tópico, isso ocorre na função reconnect MQTT.

      Atenciosamente,
      Pedro Bertoleti

      1. Pedro, muito obrigado. Pelo que pude entender, estaria igualmente correto utilizar um ao tópico, onde os dois seriam hora publish e hora subscriber?

        Além disso, parabéns pelo trabalho aqui do MakerHero, tem uma postagem de vocês que uso como referência no meu tcc.

  78. Boa tarde Pedro,
    Fiquei com uma dúvida, como eu faço para ter vários tópicos de publicação?
    E como publicar em níveis diferentes?
    exemplo:
    CASA/ILUMINACAO/SALA
    CASA/TEMPERATURA/SALA o que eu teria que alterar no #define abaixo?

    #define TOPICO_SUBSCRIBE “MQTTMakerHeroEnvia”
    #define TOPICO_PUBLISH “MQTTMakerHeroRecebe”

    1. Elizeu, boa noite.

      Para ter vários tópicos distintos, basta criar mais defines e fazer mais subscribes aos tópicos dos defines (quantos quiser, não há limite definido neste caso).
      Respondi sua pergunta (essa era sua dúvida mesmo? não sei se entendi direito a sua pergunta)?

      Atenciosamente,
      Pedro Bertoleti

    2. Olá caro Elizeu, voce consegui ligar mais de uma lampada? se sim pode disponibilizar o codigo.

  79. Pedro, boa noite!
    Primeiramente, parabéns pelo artigo!
    Instalei o MQTT broker no Windows e ele já está funcionando.
    Gostaria de saber quais as modificações que devo fazer no seu código para usa-lo localmente (em localhost).

    Att.:Jurandir

    1. Jurandir, bom dia.

      Muito obrigado pela leitura e pelo elogio!
      Para fazer o NodeMCU se conectar ao seu broker, basta colocar como “alvo” o IP do computador onde o broker está rodando. Para descobrir o IP do computador que está rodando o broker, vá ao prompt de comando e digite ipconfig. O IP que aparece em IPv4 é o IP de seu computador na rede.
      Com este IP em mãos, ao invés de colocar “iot.eclipse.org” no código, coloque o IP obtido (entre as áspas).

      Atenciosamente,
      Pedro Bertoleti

      1. Pedro, boa noite!
        Mudei o trecho do código de conexão BROKER_MQTT no arduino.

        ao invés de:
        //const char* BROKER_MQTT = “iot.eclipse.org”; //URL do broker MQTT que se deseja utilizar
        coloquei
        const char* BROKER_MQTT = “192.168.1.110”; //Ip do meu PC
        int BROKER_PORT = 1883; // Porta do Broker MQTT

        No terminal serial aparece
        Conectando-se na rede: GA-Lab
        Aguarde
        ……………………..
        Conectado com sucesso na rede GA-LabIP obtido:
        192.168.1.188
        * Tentando se conectar ao Broker MQTT: 192.168.1.110
        Conectado com sucesso ao broker MQTT!
        – Estados dos motores enviados ao broker!

        Ou seja ele conecta normalmente, porém quando tento conectar com o código em html e js que você disponibilizou ele não conecta

        Fiz as seguintes mudanças no arquivo tmo.js:
        mosq.ondisconnect = function(rc){
        var p = document.createElement(“p”);
        //var url = “ws://iot.eclipse.org/ws”;
        var url = “ws://192.168.1.110/ws”;
        e
        Page.prototype.connect = function(){
        //var url = “ws://iot.eclipse.org/ws”;
        var url = “ws://192.168.1.110/ws”;
        mosq.connect(url);

        tenho como resposta: A conexão com o broker foi perdida.
        No que estou errando?

        Desde já agradeço!

        1. Olá
          Estou com o mesmo problema.
          Conseguiu resolver?

  80. Boa noite Pedro

    Fantástico o blog eu gostaria de usar o seu projeto, para aprender mais sobre o iot porem sou novato no assunto, que IDE você usou para criar a pagina de web, como posso aprender mais sobre o passo a passo para que eu desenvolva o meu projeto sozinho.

    1. Diego, boa tarde.

      Muito obrigado pela leitura e pelo feedback!
      Quanto à página web, eu a criei “na mão” mesmo (programei o HTML e JavaScript na mão). De coisa pronta, usei somente a biblioteca JavaScript do Paho-MQTT mesmo.
      Quando você diz aprender mais sobre o passo-a-passo, o que você quis dizer? Não entendi, desculpa.

      Atenciosamente,
      Pedro Bertoleti

  81. É, a interface web não está funcionando (não conecta). Alguma dica do que fazer?

    Abraços!

  82. Excelente explicação sobre o MQTT e o uso com a NodeMCU!
    Estou fazendo um TCC no qual pretendo usar o MQTT para transmissão de informações para um site mas, no momento, estou com dificuldade para criar um websocket para receber e enviar as informações para a NodeMCU.
    Eu enviei o seu código para a NodeMCU e funcionou bem (com um LED externo e usando o programa Mosquitto), mas a sua Interface Web não funcionou aqui. Além disso, não entendi como funciona o teste disponibilizado pelo mosquitto.org (test.mosquitto.org).

    Se não for muito incômodo, gostaria que você me ajudasse nesses detalhes. Te agradeço desde já por ter feito este post sobre o MQTT pois realmente ajudou bastante.

    Vou deixar meu email caso queira entrar em contato: [email protected]

  83. Olá Pedro,

    parabéns pelo site e pelo tópico, venho aprendendo muita coisa com vocês ultimamente.
    Entretanto estou com dificuldades de colocar a minha ESP8266 para funcionar. Estou com a mesma placa utilizada nesse tópico, inclusive comprada no site e, ao seguir esse passo a passo, no site aparece o seguinte erro:
    “A conexão com o broker foi perdida.”
    Como se não fosse possível se conectar com a placa.
    Qual erro está ocorrendo e como seria possível corrigir isso?
    Nas configurações deixei:
    Placa: “Node MCU 1.0 ESP-12E Module)
    CPU Frequency: 80MHz
    Flash Size: 4M(SPIFFS)
    UploadSpeed: 155200
    Porta COM4
    Programador: AVRISP mkll.

    Modifiquei o nome e a senha da minha internet, e não alterei o:
    #define TOPICO_SUBSCRIBE “MQTTMakerHeroEnvia”
    #define TOPICO_PUBLISH “MQTTMakerHeroRecebe”

    // WIFI
    const char* SSID = “GVT-73F0”; // SSID / nome da rede WI-FI que deseja se conectar
    const char* PASSWORD = “91DC114621”; // Senha da rede WI-FI que deseja se conectar

    A fim de poder testar o código diretamente como se encontra o seu site pre-definido.

    Agradeço desde já pela sua ajuda.

    1. Rangel, muito obrigado pela leitura e pelos elogios!

      Conforme mostra os comentários no código, além de alterar os nomes dos tópicos (para não ter risco de coincidir com o tópico de alguém), é preciso modificar o ID_MQTT. Experimente alterar o valor dele e tente de novo.

      Atenciosamente,
      Pedro Bertoleti

      1. Pedro Bertoleti,

        tentei fazer isso, deixei da seguinte forma:
        #define TOPICO_SUBSCRIBE “entdadosszillat”
        #define TOPICO_PUBLISH “saidadosszillat” .
        #define ID_MQTT “Szill”

        e atualizei esses dados interface web feita por ti e mesmo assim não consegui conectar a rede.

        Ao passar os dados ao controlador inicialmente veio os seguintes erros:

        warning: espcomm_sync failed
        error: espcomm_open failed
        error: espcomm_upload_mem failed
        error: espcomm_upload_mem failed

        mas logo após tentar de novo, consegui carregar o código, conforme mensagem a seguir:

        Uploading 235920 bytes from C:UsersrafaeAppDataLocalTempbuildb891e3416cb23136a7af03139c3527b8.tmp/rele-teste-2.ino.ino.bin to flash at 0x00000000
        …………………………………………………………………….. [ 34% ]
        …………………………………………………………………….. [ 69% ]
        …………………………………………………………….. [ 100% ]

        Entretanto a mensagem de erro:
        “A conexão com o broker foi perdida”
        Continua sendo repetida continuamente.

        O que pode ser isso ?

        1. boa noite estou com esse mesmo problema.

  84. O meu conecta-se ao broker pelo serial mas pela interface web diz que a conexão com o broker foi perdida, Alguma sugestão? Grato.

  85. Boa noite Pedro Bertoleti,

    Muito obrigado pelo trabalho e esforço dedicados em publicar artigos tão bem feitos e tão didáticos. Gostaria de saber se o protocolo MQTT serve para trabalhar de maneira local?

    1. Bruno, boa tarde.

      Agradeço muito a leitura e feedback! É muito bom saber que os artigos estão sendo úteis! =]

      O MQTT pode ser usado e forma local se você disponibilizar, na sua rede local, uma máquina/servidor com um broker instalado. Para baixar e ver como instala um broker, acessa esse site: https://mosquitto.org/download/

      Atenciosamente,
      Pedro Bertoleti

  86. Olá, tenho uma dúvida sobre a placa, está descrito que tem 10 portas digitais e 1 analógica, certo? Mas, me informaram que não é possível utilizar todas?
    Obrigado

  87. Parabéns pelo trabalho.
    Foi de grande valia este trabalho.
    Gostaria de saber se posso aplicar este método no shield Ethernet W5100, tem algum tutorial.
    E sobre algum tutorial para criação de um servidor mqtt, procuro e não acho nada falando a respeito. Gostaria de implementar o meu próprio servidor, poderia me dar uma ajuda?

    Obrigado.

    1. Felipe, boa tarde.

      Obrigado pela leitura e pelos elogios. Eu nunca usei este Shield, mas ACHO que pode aplicar o MQTT com ele sem problema algum (pois o MQTT utiliza recursos simples de rede / protocolo TCP, coisas que com toda a certeza o Shield suportará).
      Quanto a criar um servidor MQTT, você pode baixar o Broker Mosquitto no site https://mosquitto.org/download/ e instalar na sua máquina/servidor/VPS (e, por consequência, utilizá-la como seu servidor MQTT particular). Nesta página tem instruções de como se instala e tudo mais =]

      Atenciosamente,
      Pedro Bertoleti

  88. Srs, o código funcionou bem no nodemcu, mas ainda não consegui entender pq temos 2 tópicos se estamos publicando/controlando apenas uma variável que é o estado do LED.
    Eu não deveria ter apenas um tópico onde eu publicaria o estado do LED e assinaria o mesmo pra saber em que estado o LED está?
    Alguém me explica por favor! hehehehe

    1. Augusto, boa tarde.

      O porque de ter dois tópicos é para facilitar o entendimento (ao menos foi o que planejei), pois dessa forma pode-se ver separadamente tudo o que sai e o que chega nos tópicos.
      Você pode fazer da maneira que sugeriu (usar um só tópico) sem prolemas também.

      Atenciosamente,
      Pedro Bertoleti

  89. Cara, primeiramente meu PARABÉNS, BELO PROJETO!!! Eratudo que eu queria saber!!!

    Bom, eu to em processo de construção do meu TCC 1, e eu gostaria de saber como posso contribuir para / com esse tipo de projeto?

    Mias uma dúvida, eu posso construir meu próprio site MQTT? Ou seja, eu posso fazer um site em que eu possa tanto enviar como receber dados do node, e cadastra-los em um Banco de dados possibilitando assim acessos via REST por exemplo?? Isso seria possível? se sim, como?

    Qualquer coisa, entra em contato cmg : [email protected] ou manda ai teus contatos.

    De já, super agradecido!!! Grande abraço.

    1. Arthur, boa tarde.

      Muito obrigado pelo feedback! Fico feliz em saber que te ajudei de alguma maneira.
      Quanto a contribuir com o projeto, o que você quis dizer? Evoluir o projeto e compartilhar conosco? Desculpa, é que não entendi muito bem.

      Quanto a sua segunda pergunta, sim, você pode construir seu próprio broker MQTT. Para fazer o que você deseja (broker, banco de dados e tudo mais), você precisará instalar em sua máquina todas essas coisas e disponibiliza-las em rede (dica: pesquise por broker Mosquitto e um pack de software/serviços chamado XAMPP) ou até mesmo comprar acesso a uma VPS (máquina virtual na Internet) instalar as coisas nela e deixar tudo remoto. Se não fui claro, é só falar que explico novamente.

      Atenciosamente,
      Pedro Bertoleti

  90. Boa tarde, muito obrigado pelo post!
    Consegui rodar e o serial consta como conectado ao MQTT, mas utilizando a página HTML não consigo conectar/controlar o projeto, alguma dica?

  91. Excelente material, entretanto estou com algumas dificuldades na conexão com o servidor. Verifiquei pelo serial monitor se a conexão com a placa foi bem sucedida, também vi que a conexão com o Broker MQTT do iot.eclipse.org também ocorreu normalmente, fiquei apenas tendo a mensagem de “- Estado da saida D0 enviado ao broker!” na serial, mas quando executo o .html, não tenho resposta do servidor. Já fiz as alterações de tópico de publish e subscribe, inseri um ID MQTT aleatório, inclusive alterei até a interface html o preenchimento dos tópicos e o problema permanece. Como proceder?

  92. Primeiramente, Parabéns pelo trabalho Pedro Bertoleti. Gostaria de saber se eu consigo ter acesso ao broker, ou existe alguma ferramenta que me possibilite monitorar os dados recebidos no broker do Nodemcu em tempo real? Desde já agradeço.

    1. Diego, boa noite.

      Primeiramente, muito obrigado pela leitura e pelo elogio.
      Quanto a acesso de dados ao broker, o que pode ser feito neste caso é você utilizar um cliente MQTT para computador (MQTTLens, por exemplo), dar subscribe / se subescrever em um determinado tópico que deseja obter informações e monitorar.
      Isso é possível pois no MQTT não há limites teóricos de número de clientes subescritos a um determinado tópico (da mesma forma que não há limites de clientes publicando em um mesmo tópico).

      Se você não entendeu, avise novamente por favor que explicarei de outra forma.

      Atenciosamente,
      Pedro Bertoleti

      1. Prezado Pedro,

        Perfeito, consegui exatamente o que queria. Desconhecia essa ferramenta MQTTlens, simples porém, robusta para testes. Mais outra coisa amigo, teu websocket não executa na minha máquina, o mesmo não consegue conectar ao servidor, nem mesmo exibe mensagem, existe algum plugin ou app que deva estar instalado na máquina para o mesmo conseguir conectar. Mais uma vez, parabéns pelo artigo e pelo respaldo para com os comentários.

        1. Diego, este problema relatado com o websocket no seu caso está me parecendo algum bloqueio de firewall ou algo do gênero.
          Você está com acesso a porta 1883 liberado no computador que está utilizando?

          Atenciosamente,
          Pedro Bertoleti

          1. Pedro,

            O Firewall está desativado, já havia instalado o Mosquitto anteriormente, serviço está rodando, o netstat -an retorna que a porta 1883 (TCP), está LISTENING (Aberta para receber conexões), acredito que não seja firewall, alguma outra sugestão? Obrigado pela atenção.

    2. Diego, você está tentando acessar um broker que está rodando na sua máquina ou o broker iot.eclipse.org? Se está tentando acessar um broker que está rodando na sua máquina, o websocket (mais precisamente, o arquivo tmo.js dele) precisa ser modificado.

  93. Bom dia. Gostaria de agradecer a sua boa vontade em compartilhar o seu conhecimento com todos. Suas publicações sempre tem me ajudado muito. Amigo eu programei o nodeMCU, porém não consegui me conectar ao servidor. Eu apenas executei a página que está em anexo e tentei me conectar para depois poder ligar e desligar o led. Eu deveria fazer algo mais? desde já muitooooooo obrigado.

    1. Alex, boa tarde.

      Primeiramente, muito obrigado pelo feedback. É uma satisfação saber que minhas publicações te ajudaram!
      Quanto ao erro ocorrido, há algumas possibilidades. Vou listá-las abaixo:

      – Verifique se seu nodemcu se conectou corretamente a rede wifi (esta informação aparece no Serial Monitor)
      – Verifique se seu nodemcu se conectou corretamente ao broker MQTT (esta informação aparece no Serial Monitor)
      – Se você alterou os tópicos de publish e subscribe, verifique se na página os tópicos estão iguais aos do código gravado no NodeMCU
      – O ID MQTT precisa ser alterado 9coloque algo único pra você ou “aleatório”. Se deu ID MQTT coincidir com algum outro já conectado ao Broker, haverá problemas.

      Por favor, verifique estas questões e retorne dizendo se conseguiu fazer funcionar.

      Atenciosamente,
      Pedro Bertoleti

  94. No meu canal do youtube fiz um vídeo usando esta aplicação https://www.youtube.com/watch?v=y5fWZvFVfxQ&feature=youtu.be

    Usei um modulo rele, e uma lâmpada de LED para a aplicação, tanto na descrição como no vídeo deixei claro de quem são os créditos e a autoria, bem como o link para baixar a aplicação.

    Abs.

    Carlos Kwiek.

    1. Carlos, muito obrigado!
      O MakerHero e eu ficamos muito gratos com o vídeo e por saber que de alguma forma te ajudamos no seu projeto.

      Atenciosamente,
      Pedro Bertoleti

  95. Parabéns Pedro,

    Praticamente foi baixar a interface, copiar e colar o código, e colocar pra funcionar, tanto na rede local como na rede externa funcionou sem problemas.

    Sobre o fato da logica invertida da porta, não tem como editar o arquivo para que os botões fiquem com nome liga e desliga inversos na interface para não ficar ligando quando se desliga e vice versa?

    Obrigado.

    Grande abraço!

    Eng. Carlos Kwiek.

    1. Carlos, bom dia.

      Primeiramente, muito obrigado pelo feedback!
      Quanto a sua resposta, sim, é possível. Acredito até que a melhor solução é dessa forma que você disse (ou seja, alterando na interface os botões).

      Atenciosamente,
      Pedro Bertoleti

      1. Pedro,
        Obrigado a você pela resposta, testei ontem mesmo editando os botões e ficou perfeito.

        Att.

        Eng.Carlos kwiek

  96. Eu tenho uma dúvida, se eu quisesse fazer isso também de forma local? teria como eu ter um servidor, que no caso seria um broker, localmente, sou iniciante e se eu estiver falando besteira, perdoe-me.. Por algum motivo perca a conexão com a internet, eu localmente conseguiria ainda assim ver as mensagens postadas..

    1. Sim(ainda que tarde). Vc pode instalar o mosquitto em um linux (pc,roteador c/openwrt, Linkit, Rasp…., Cubie, etc)… e ainda vincular o servidor local com um remoto, tendo como controlar dois dois lados.

  97. Boa tarde a todos sou novo aki.

  98. Pedro,

    Realmente muito bom o tutorial. Como você disse acima, eu espero ver novos posts sobre MQTT. Muito interessante o tema. Mas fiquei com uma dúvida: onde é definido o “ID” do nodeMCU que está enviando/recebendo as mensagens? Isso seria o TOPICO_SUBSCRIBE e o TOPICO_PUBLISH? Minha dúvida é, onde eu faço a definição de um cliente específico, de modo que eu saiba que está enviando ou recebendo a mensagem, caso eu tenha mais de um cliente conectado?

    1. Outra coisa, no código você definiu o led azul embutido no NodeMCU como sendo o D0. No NodeMCU que eu tenho aqui o led azul está ligado ao D4 (GPIO2). Troquei no código e funcionou.

      1. Christian, boa tarde.

        Primeiramente, muito obrigado pelo feedback. Sobre o ID do MQTT, este está definido no código em:

        #define ID_MQTT “HomeAut”

        Este ID serve para o broker gerenciar sua conexão / conexão de qualquer cliente com ele. Ou seja, cada cliente deve ter um ID único no broker. Se isso não for obedecido, um dos clientes (no caso, o que já estava conectado) será desconectado do servidor abruptamente.

        Quanto aos tópicos, via de regra estes podem se repetir, pois o MQTT funciona de forma que pode-se haver N publishers e N subscribers para um mesmo tópico.
        PORÉM, se você publicar informação em um tópico “alheio” (diferente do seu), quem subescreve este tópico irá “escutar” sua mensagem. No caso do projeto deste post em específico, isso significa que se você usar o mesmo nome de tópico de publish que outra pessoa, poderá controlar o LED da placa dela.

        Portanto, para rodar o exemplo com segurança:
        – Alterar o ID MQTT (de preferencia para algo aleatório ou incomum
        – Alterar os tópicos de publish e subscribe na interface web e no sketch

  99. Excelente artigo!!
    Bem didático!!
    Não vejo a hora de ter novos artigos sobre MQTT!!!

    Angelo José Roncali da Silva
    1. Angelo, muito obrigado!

      E pode deixar que vem mais coisa de MQTT por ai!

  100. Parabéns pelo belo tutorial. Muito didático e esclarecedor. São pessoas como você que nos dão animo a proseguir neste ramo. Me abriu um belo caminho.

    1. João, boa noite.

      Seu comentário me motiva cada vez mais a continuar este trabalho de escrever e ensinar o pouco que sei. É muito gratificante mesmo ler isso! Muito obrigado!

  101. Artigo muito bom!
    Estava procurando por algo assim.

    1. Franklin, muito obrigado!
      Espero que o artigo acrescente conhecimento a você!

      1. Cara melhor aula que tive , era o que estava procurando

        1. Que bom que curtiu, Ezequiel!

          Abraços!
          Diogo – Equipe MakerHero

  102. Parabéns pela iniciativa, estava lendo sobre o assunto, que ao meu ver achei muito interessante.

    1. Adriano, muito obrigado!

      1. Não estou conseguindo conectar com o Broker na página WEB. Quando clico para conectar ele diz que a Conexão com o Broker foi perdida e ao inspecionar a página , relata um erro no mosquitto na linha 90 com código . Obs.: No Arduino IDE, a conexão do Wi-fi e a conexão do Broker é feita com sucesso , o problema mesmo é quando vamos apertar pra conectar na página web , onde aparece um status relatando a conexão perdida.
        Ficarei muito grato se alguém me ajudar!!!

  103. Bom post. Sabe me dizer se existe uma quantidade máxima de mensagens que eu posso mandar diariamente ?

    1. Pedro, bom dia.

      Primeiramente, obrigado por ler e pelo comentário.
      O protocolo MQTT em si não coloca limites (tanto de conexões ao broker por device quanto em tópicos subescritos / publicados e número de mensagens). Portanto, fica a cargo do broker (o servidor MQTT) gerenciar este tipo de coisa (pois ele é quem gerenciará as conexões e “sabe até onde aguenta”).
      Sendo assim, o limite deve ser consultado / buscado no broker (cada broker tem o seu limite).

      Porém, sendo prático, eu já deixei sistemas embarcados enviando dados segundo a segundo no broker iot.eclipse.org por dias e não tive problemas (portanto, se pretende algo similar, não encontrará problemas).

Trackbacks and Pingbacks

  1. […] dito neste artigo do blog, o broker funciona como servidor em uma comunicação MQTT. Ou seja, ele é o responsável por […]

  2. […] feito usando o bom e velho MQTT. Se você não tem muita familiaridade com MQTT no NodeMCU, veja este nosso post aqui do blog. Sendo assim, o código-fonte do projeto completo pode ser visto abaixo. Leia atentamente os […]

  3. […] Arduino convencional, conforme mostrado no post Como Programar o NodeMCU com IDE Arduino e no post NodeMCU com MQTT. Sendo assim, neste post iremos abordar como ler Inputs e como escrever em Outputs, e você […]

  4. […] parte, muito do que foi abordado no artigo Controle e Monitoramento IoT com NodeMCU e MQTT será aproveitado. Portanto, é fortemente recomendada a leitura deste […]