Dando continuidade à serie de artigos sobre o MQTT Dash, e respondendo a dúvida do leitor Fernando Oliveira Brito, neste artigo vamos publicar o valor de temperatura e umidade de um sensor DHT11 usando uma placa nodeMCU e também vamos exibir os valores no MQTT Dash. Se você ainda não testou o MQTT Dash, recomendo a leitura do artigo anterior.
Hardware com o DHT11
Para este exemplo, vamos usar os mesmos componentes usados no artigo anterior e vamos acrescentar um sensor de temperatura e umidade, o DHT11.
O módulo relé é usado para acionamento da lâmpada. Você deve usar a etapa de potência que atenda os requisitos da carga.
Após realizadas as ligações elétricas do circuito, vamos para o desenvolvimento do firmware para o nodeMCU.
Firmware do nodeMCU
Aproveitando o software desenvolvido para o exemplo do artigo anterior, vamos adicionar a leitura da temperatura e umidade com o DHT11, assim como a publicação dos valores. Para uso do DHT11 na IDE Arduino é necessário ter a biblioteca DHT-sensor-library.
Com as mesmas configurações para o broker realizadas no artigo anterior, vamos publicar os valores de umidade e temperatura, nos respectivos tópicos: casa/umidade e casa/temperatura.
O código a seguir publica as informações do DHT11 a cada 20 segundos, assim como assina o tópico casa/L1, controlando o estado da lâmpada:
//Acionamento de lampada com MQTT Dash
//Por: Fábio Souza
//Data: 19/03/18
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"
#define INTERVALO_ENVIO 20000
#define DHTPIN 2 // o sensor dht11 foi conectado ao pino 2( D4 do node MCU)
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
#define DEBUG
#define L1 4 //pino de saida para acionamento da Lampada L1
//informações da rede WIFI
const char* ssid = "xxxxx"; //SSID da rede WIFI
const char* password = "xxxxxxx"; //senha da rede wifi
//informações do broker MQTT - Verifique as informações geradas pelo CloudMQTT
const char* mqttServer = "xxxxxxxxxxxxxxxxx"; //server
const char* mqttUser = "xxxxxxxx"; //user
const char* mqttPassword = "xxxxxxxxxxxx"; //password
const int mqttPort = xxxxx; //port
const char* mqttTopicSub ="casa/L1"; //tópico que sera assinado
int ultimoEnvioMQTT = 0;
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(115200);
pinMode(L1, OUTPUT);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
#ifdef DEBUG
Serial.println("Conectando ao WiFi..");
#endif
}
#ifdef DEBUG
Serial.println("Conectado na rede WiFi");
#endif
client.setServer(mqttServer, mqttPort);
client.setCallback(callback);
while (!client.connected()) {
#ifdef DEBUG
Serial.println("Conectando ao Broker MQTT...");
#endif
if (client.connect("ESP8266Client", mqttUser, mqttPassword )) {
#ifdef DEBUG
Serial.println("Conectado");
#endif
} else {
#ifdef DEBUG
Serial.print("falha estado ");
Serial.print(client.state());
#endif
delay(2000);
}
}
//subscreve no tópico
client.subscribe(mqttTopicSub);
dht.begin();
}
void callback(char* topic, byte* payload, unsigned int length) {
//armazena msg recebida em uma sring
payload[length] = '\0';
String strMSG = String((char*)payload);
#ifdef DEBUG
Serial.print("Mensagem chegou do tópico: ");
Serial.println(topic);
Serial.print("Mensagem:");
Serial.print(strMSG);
Serial.println();
Serial.println("-----------------------");
#endif
//aciona saída conforme msg recebida
if (strMSG == "1"){ //se msg "1"
digitalWrite(L1, LOW); //coloca saída em LOW para ligar a Lampada - > o módulo RELE usado tem acionamento invertido. Se necessário ajuste para o seu modulo
}else if (strMSG == "0"){ //se msg "0"
digitalWrite(L1, HIGH); //coloca saída em HIGH para desligar a Lampada - > o módulo RELE usado tem acionamento invertido. Se necessário ajuste para o seu modulo
}
}
//função pra reconectar ao servido MQTT
void reconect() {
//Enquanto estiver desconectado
while (!client.connected()) {
#ifdef DEBUG
Serial.print("Tentando conectar ao servidor MQTT");
#endif
bool conectado = strlen(mqttUser) > 0 ?
client.connect("ESP8266Client", mqttUser, mqttPassword) :
client.connect("ESP8266Client");
if(conectado) {
#ifdef DEBUG
Serial.println("Conectado!");
#endif
//subscreve no tópico
client.subscribe(mqttTopicSub, 1); //nivel de qualidade: QoS 1
} else {
#ifdef DEBUG
Serial.println("Falha durante a conexão.Code: ");
Serial.println( String(client.state()).c_str());
Serial.println("Tentando novamente em 10 s");
#endif
//Aguarda 10 segundos
delay(10000);
}
}
}
void loop() {
if (!client.connected()) {
reconect();
}
//envia a cada X segundos
if ((millis() - ultimoEnvioMQTT) > INTERVALO_ENVIO)
{
enviaDHT();
ultimoEnvioMQTT = millis();
}
client.loop();
}
//função para leitura do DHT11
void enviaDHT(){
char MsgUmidadeMQTT[10];
char MsgTemperaturaMQTT[10];
float umidade = dht.readHumidity();
float temperatura = dht.readTemperature();
if (isnan(temperatura) || isnan(umidade))
{
#ifdef DEBUG
Serial.println("Falha na leitura do dht11...");
#endif
}
else
{
#ifdef DEBUG
Serial.print("Umidade: ");
Serial.print(umidade);
Serial.print(" \n"); //quebra de linha
Serial.print("Temperatura: ");
Serial.print(temperatura);
Serial.println(" °C");
#endif
sprintf(MsgUmidadeMQTT,"%f",umidade);
client.publish("casa/umidade", MsgUmidadeMQTT);
sprintf(MsgTemperaturaMQTT,"%f",temperatura);
client.publish("casa/temperatura", MsgTemperaturaMQTT);
}
}
Configuração do MQTT Dash
Para a leitura dos valores de umidade e temperatura, vamos adicionar 2 elementos do tipo Range/progress:
Para exibir o valor da umidade, vamos configurar da seguinte forma:
Para exibir o valor de temperatura, vamos configurar da seguinte forma:
No final teremos 3 elementos em nosso dashboard:
Funcionamento
Agora com o programa carregado na nodeMCU e o MQTT Dash configurado, vamos testar a aplicação.
O primeiro passo é verificar se as informações estão sendo publicadas no broker. Use o recurso Websocket no CloudMQTT:
E em seguida verificar a atualização dos valores no MQTT Dash:
Pronto! Chegamos ao final deste tutorial. Deixo como desafio a inserção de mais sensores ao sistema, assim como novos publicadores e assinantes. Uma proposta interessante é criar um módulo com um botão para acionamento da lâmpada com um interruptor sem fio.
Não deixe de tirar as suas dúvidas ou então compartilhar seus projetos nos comentários abaixo.
Saiba mais
Conectando-se ao DeviceHub com NodeMCU e MQTT
Oficina Maker de IoT – Conecte sua planta à Internet com Thingspeak
Estação de medição de temperatura Open-Source com Arduino e IoT – Configuração

















Bom dia,
Desculpe a ignorância, mas vejo a criação da função Callback mas não vejo a chamada para ela, alguem pode me explicar quando ela é chamada ou qual intervalo de chamada?
A função callback é chamada quando um dado é recebido
Oi Fábio, tudo bem? Eu tenho um raspberry Pi zero e estou desenvolvendo um projeto para usar o módulo para coletar informações de temperatura e umdade do sensor DHT11 e analisar/processar os dados (minerando e usando o Hadoop) depois. Minha dificuldade é saber se o CloudMQTT guarda em arquivo csv as informações coletadas. Vc tem ideia de como se faz para guardar os dados coletados em arquivo?
Bom dia Cleide, achei interessante seu questionamento, conseguiu achar uma resposta?
Cleide, você pode assinar um tópico através da rasp e armazenar os valores em csv
Bom dia Fábio, estou tentando estabelecer um comunicação entre Arduíno Mega da RobotDyn com ESP8266 integrado, já que o ESP não tem portas suficientes para vários processos ao mesmo tempo. Mas até agora sem muito êxito em mandar vários dados de sensores via Serial.
Boas Fábio, Obrigado pelo teu post, ajudou bastante. Estou a usar um WeMos D1 e precisei de alterar o teu código para: (…) Serial.print(“New temperature: “); Serial.println(String(temp).c_str()); client.publish(“casa/sala/temp”, String(temp).c_str(), true); Serial.print(” New humidity: “); Serial.println(String(hum).c_str()); client.publish(“casa/sala/hum”, String(hum).c_str(), true); (…) pois conseguia ver os valores no monitor série mas não chegava nada ao broker. Agora tenho outro problema, quando programei mais um WeMos, não consigo ter os dois ligados ao mesmo tempo, aqui fica parte do retorno do monitor série: (…) Tentando conectar ao servidor MQTTConectado! Tentando conectar ao servidor MQTTConectado! Tentando conectar ao servidor MQTTConectado! Tentando conectar ao servidor MQTTConectado!… Leia mais »
Como faço pra postar isso em um cliente local, uso o mosquitto e tenho um node-red rodando no raspberry, porem como não sei como mudar a configuração pra ele postar no meu servidor local, ele da falha de estado 2, e fica tentando se reconectar
No meu eu queria apenas enviar os dados para o broker, mas não está enviando, conecta no wifi, conecta no broker, mas os dados não aparecem.
Quando eu clico em websocket no broker aparece um aviso de que não foi possível se conectar na porta websocket.
Olá Vilmondes, verifique as informações do broker MQTT no código. Pode ter algum dado errado
Muito Obrigado Fábio, mas eu já havia resolvido o problema.
As alterações que fiz no código passado no outro post ficaram bem semelhantes a que vc fez.
Estou fazendo a automatização parcial do meu aquário e seus dois artigos me ajudaram muito. Muito Obrigado.
Olá Fernando. Depois mostrar o resultado pra nós. Sucesso!