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.
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.
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.
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.
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.
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.
2. Na janela do monitor serial, vamos ajustar a velocidade em 115200bps, conforme mostra a figura 6.
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
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.