Conforme vimos artigo MIC160, o NodeMCU consiste numa placa de desenvolvimento muito versátil, podendo ser aplicada tanto em projetos IoT quanto em projetos que funcionem somente de forma local.

Um projeto de funcionamento local que pode ser muito útil é a medição de temperatura ambiente e umidade relativa do ar, afinal tais informações podem sem usadas desde para simples conhecimento até para garantir que normas de temperatura e umidade estão sendo respeitadas em determinados ambientes (como em Centros de Processamento de Dados e ambientes refrigerados, por exemplo).

E isso é exatamente o que faremos neste artigo: um medidor de temperatura e umidade relativa do ar. Para isso, usaremos o NodeMCU e o sensor DHT22.

 

 

Material necessário

Para fazer este projeto, você precisará de:

Um NodeMCU

Um sensor DHT22

Um resistor de 10k / 0,25W

Um protoboard (qualquer modelo de 400 pontos ou maior)

Alguns jumpers do tipo macho-macho

Um cabo micro-USB comum

 

 

Sensor DHT22

O sensor DHT22 é capaz de mensurar temperatura e umidade relativa do ar. Este sensor, também conhecido como AM2302, é facilmente encontrado para compra em lojas on-line (sobretudo em lojas on-line para hobbistas / makers) e possui vasto material de apoio na Internet, além de ter um custo bastante acessível. A figura 1 ilustra o sensor.

 

 

Figura 1 - sensor DHT22
Figura 1 - sensor DHT22

 

 

Em linhas gerais, suas principais características são:

Tensão de operação: de 3,3 a 5,5V (DC)

Faixa de operação de temperatura: -40 até +80ºC

Faixa de operação de umidade relativa do ar: 0 até 100%

Exatidão de +-0,5ºC na medição de temperatura

Exatidão de +- 2% na medição de umidade relativa

Protocolo de comunicação: 1-wire

 

Para mais informações do sensor DHT22, consulte o datasheet dele acessando este link. ( http://img.filipeflop.com/files/download/Datasheet_DHT22_AM2302.pdf )

 

 

Ligando o sensor DHT22 ao NodeMCU

Para ligar o sensor DHT22 ao NodeMCU, vamos seguir o circuito esquemático mostrado na figura 2.

 

 

Figura 2 - circuito esquemático
Figura 2 - circuito esquemático

 

 

IMPORTANTE: conforme vimos no artigo sobre os primeiros passos com o NodeMCU, ele não é tolerante a 5V em suas entradas. Portanto, para utilizar este sensor com o NodeMCU, obrigatoriamente o sensor deve ser alimentado com 3,3V.

 

 

Instalação da biblioteca para utilização do sensor com Arduino

Conforme também vimos no artigo sobre os primeiros passos com o NodeMCU, por razões de maior material de apoio disponível na Internet, iremos programá-lo exatamente como faríamos se fosse um Arduino comum. Portanto, para esse sensor ser utilizado no programa deste projeto, a melhor maneira é ser utilizada a biblioteca para Arduino dele.

Tal biblioteca é open-source, podendo ser obtida gratuitamente em: https://github.com/adafruit/DHT-sensor-library .

Para baixar e instalar a biblioteca e suas dependências, vamos seguir o procedimento abaixo:

 

1. Acesse o repositório da biblioteca ( https://github.com/adafruit/DHT-sensor-library ) e baixe-a clicando em “Clone or Download” e depois em “Download ZIP” , conforme mostra a figura 3.

 

 

Figura 3 - obtenção da biblioteca do sensor DHT22 diretamente do repositório oficial
Figura 3 - obtenção da biblioteca do sensor DHT22 diretamente do repositório oficial

 

 

Guarde o arquivo ZIP baixado em uma pasta conhecida / de fácil acesso para você

 

2. Agora, na Arduino IDE, vamos instalar a biblioteca baixada. Para isso, vamos clicar no menu “Sketch”, depois em “Incluir Biblioteca” e, por fim, locar em “Adicionar biblioteca .ZIP”, conforme a figura 4.

 

 

 

Figura 4 - caminho para inclusão de biblioteca Arduino em formato de arquivo compactado
Figura 4 - caminho para inclusão de biblioteca Arduino em formato de arquivo compactado

 

 

3. Na janela que abrir, busque pelo arquivo da biblioteca que você baixou (conforme passo 1 deste procedimento) e clique em “Abrir”. Desta forma, instalamos a biblioteca para comunicação com o sensor DHT22!

4. Ainda há uma biblioteca a ser instalada: a biblioteca Adafruit Unified Sensor Driver.

Esta biblioteca é uma dependência da biblioteca o sensor DHT22 (ou seja, ela é necessária para o funcionamento da biblioteca do DHT22).

Portanto, primeiramente, devemos baixar a biblioteca no repositório oficial da mesma: https://github.com/adafruit/Adafruit_Sensor  . A forma de baixar é a mesma vista no passo 1 deste procedimento.

5. Uma vez baixada, esta biblioteca deve ser instalada da mesma forma que foi explicada nos passos 2 e 3 deste procedimento.

6. Pronto! Todas as bibliotecas necessárias estão agora instaladas!

 

 

Projeto - medidor de temperatura e umidade relativa do ar

A partir deste ponto, está tudo pronto para desenvolvermos o projeto de medição de temperatura e umidade relativa do ar usando o sensor DHT22! As funcionalidades deste projeto são:

 

Medição da temperatura (ºC) e umidade relativa do ar a cada cinco segundos.

Em complemento, o projeto contabilizará a máxima e mínima temperatura medidas em todo o período de funcionamento.

As medições (temperatura e umidade relativa do ar atuais e máximas e mínimas registradas) serão formatadas em strings. Tais mensagens / strings com as medições poderão ser lidas pelo monitor serial da própria Arduino IDE. Ou seja, a mensagem será enviada pela USB (USB-CDC) do NodeMCU.

 

 

Código-fonte

 

Abaixo, segue o código-fonte do projeto. Leia com atenção seus comentários para total compreensão do mesmo.

 

//Projeto: medição de temperatura e umidade relativa do ar com NodeMCU e sensor DHT22.
//Autor: Pedro Bertoleti
//Data: Fevereiro/2018
#include <ESP8266WiFi.h>
#include <DHT.h>

/*
 * Defines do projeto
 */
//GPIO do NodeMCU que o pino de comunicação do sensor está ligado.
#define DHTPIN D1     

//A biblioteca serve para os sensores DHT11, DHT22 e DHT21. 
//No nosso caso, usaremos o DHT22, porém se você desejar utilizar 
//algum dos outros disponíveis, basta descomentar a linha correspondente.
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

/*
 * Variáveis e objetos globais
 */
//objeto para comunicação com sensor DHT22 
DHT dht(DHTPIN, DHTTYPE);

//variáveis que armazenam os valores máximo e mínimo de temperatura registrados.
float TemperaturaMax;
float TemperaturaMin;

//prototypes
void AtualizaTemperaturaMaxEMinima(float TempLida);
void EnviaMedicoesParaSerial(float TempLida, float UmidLida, float TempMax, float TempMin);

/*
 * Implementações
 */
//Função: verifica se os valores de temperatura máxima e mínima devem ser atualizados
//Parâmetros: temperatura lida
//Retorno: nenhum
void AtualizaTemperaturaMaxEMinima(float TempLida)
{
  if (TempLida > TemperaturaMax)
    TemperaturaMax = TempLida;

  if (TempLida < TemperaturaMin)
    TemperaturaMin = TempLida;  
}
 
//Função: envia, na forma de mensagens textuais, as medições para a serial
//Parâmetros: - Temperatura lida
//            - Umidade relativa do ar lida
//            - Máxima temperatura registrada
//            - Mínima temperatura registrada
//Retorno: nenhum
void EnviaMedicoesParaSerial(float TempLida, float UmidLida, float TempMax, float TempMin) 
{
  char Mensagem[200];
  char i;

  //pula 80 linhas, de forma que no monitor serial seja exibida somente as mensagens atuais (impressao de refresh de tela)
  for(i=0; i<80; i++)
    Serial.println(" ");

  //constrói mensagens e as envia
  //- temperatura atual
  memset(Mensagem,0,sizeof(Mensagem));
  sprintf(Mensagem,"- Temperatura: %d C",(int)TempLida);
  Serial.println(Mensagem);
  
  //- umidade relativa do ar atual
  memset(Mensagem,0,sizeof(Mensagem));
  sprintf(Mensagem,"Umidade atual: %d \\%",(int)UmidLida);
  Serial.println(Mensagem);
  
  //- temperatura maxima
  memset(Mensagem,0,sizeof(Mensagem));
  sprintf(Mensagem,"- Temperatura maxima: %d C",(int)TempMax);
  Serial.println(Mensagem); 
  
  //- temperatura minima
  memset(Mensagem,0,sizeof(Mensagem));
  sprintf(Mensagem,"- Temperatura minima: %d C", (int)TempMin);
  Serial.println(Mensagem);
}

void setup() {
  //configura comunicação serial (para enviar mensgens com as medições) 
  //e inicializa comunicação com o sensor.
  Serial.begin(115200);  
  dht.begin();

  //inicializa temperaturas máxima e mínima com a leitura inicial do sensor
  TemperaturaMax = dht.readTemperature();
  TemperaturaMin = TemperaturaMax;
}

/*
 * Programa principal
 */
void loop() {
  float TemperaturaLida;
  float UmidadeLida;
  
  //Faz a leitura de temperatura e umidade do sensor
  TemperaturaLida = dht.readTemperature();
  UmidadeLida = dht.readHumidity();

  //se houve falha na leitura do sensor, escreve mensagem de erro na serial
  if ( isnan(TemperaturaLida) || isnan(UmidadeLida) ) 
    Serial.println("Erro ao ler sensor DHT22!");
  else
  {
    //Se a leitura foi bem sucedida, ocorre o seguinte:
    // - Os valores mínimos e máximos são verificados e comparados à medição atual de temperatura
    //   se a temperatura atual for menor que a mínima ou maior que a máxima até então
    //   registrada, os limites máximo ou mínimo são atualizados.
    // - As medições (temperatura, umidade, máxima temperatura e mínima temperatura) são
    //   enviados pela serial na forma de mensagem textual. Tais mensagens podem ser vistas
    //   no monitor serial.
    AtualizaTemperaturaMaxEMinima(TemperaturaLida);
    EnviaMedicoesParaSerial(TemperaturaLida, 
                            UmidadeLida, 
                            TemperaturaMax, 
                            TemperaturaMin);
  }
  
  //espera cinco segundos até a próxima leitura
  delay(5000);
}

 

Para compilar, enviar o software compilado ao NodeMCU e começar sua execução, basta seguirmos os mesmos passos de artigo NodeMCU – primeiros passos (MIC160) .

Assim que o Upload for feito para o NodeMCU, siga o passo-a-passo abaixo para ver o projeto funcionar.

 

Atenção: o passo-a-passo deve ser feito ainda com o NodeMCU conectado ao computador via cabo micro-USB.

 

1. Na Arduino IDE, clique em “Ferramentas” e depois em “Monitor serial”, conforme ilustra a figura 5. Se preferir, pode utilizar o atalho de teclado Ctrl + Shift + M.

 

 

Figura 5 - caminho para acessar monitor serial
Figura 5 - caminho para acessar monitor serial

 

 

2. Na janela do monitor serial, vamos ajustar a velocidade em 115200bps, conforme mostra a figura 6.

 

 

Figura 6 - configuração da velocidade de comunicação entre monitor serial e NodeMCU
Figura 6 - configuração da velocidade de comunicação entre monitor serial e NodeMCU

 

 

 

3. Pronto! Agora basta observar as mensagens com as medições aparecendo de cinco em cinco segundos no monitor serial, conforme ilustrado na figura 7

 

 

Figura 7 - medições no monitor serial
Figura 7 - medições no monitor serial

 

 

 

Conclusão

Este artigo mostrou o passo-a-passo de como se construir um medidor de temperatura e umidade relativa do ar utilizando um NodeMCU e um sensor DHT22.

Este projeto pode ter variadas aplicações, desde mero conhecimento de tais medições em um dado ambiente até o monitoramento de ambientes críticos em termos de temperatura e umidade máximo e/ou mínimo.