Básico - Projeto 87

Sensor de temperatura e umidade DHT22 com display LCD

Objetivo

Neste projeto vamos demonstrar o uso de um LCD como mostrador de temperatura e umidade obtidas através do sensor DHT22.

Sensor DHT22 - O DHT22 é um sensor básico de baixo custo utilizado para a medição de temperatura e umidade do ar ambiente através de um termistor e um sensor capacitivo. Existem várias versões diferentes do DHT22 com a mesma aparência e número de pinos. Portanto é importante verificar o "datasheet" do componente para obter suas características principais. No nosso projeto as características estão descritas na tabela de componentes.

Observações:

1. O sensor DHT22 é uma evolução do sensor DHT11, e deve ser utilizado sempre que se precisar obter valores de temperatura e da umidade ambiente como maior precisão.

2. Este projeto foi desenvolvido para um display LCD com controlador HD44780 em conjunto com o módulo serial I2C (soldado ou não).

3. Se você não possui um módulo I2C para display LCD, poderá adaptar o projeto para o display LCD sem o adaptador. Veja como montar o display no projeto Projeto 38 - Controlando um display LCD (instalação e comandos básicos).

4. Veja também como utilizar o sensor DHT11 no Projeto 40 - Sensor de temperatura e umidade DHT11 com display LCD

Aplicação

Para fins didáticos e projetos onde é necessária a medição de temperatura e/ou umidade do ambiente.

Componentes necessários

Referência

Componente

Quantidade

Imagem

Observação

Protoboard Protoboard 830 pontos 1 Resultado de imagem para protoboard 830v

No mínimo utilizar protoboard com 830 pontos

Jumpers Kit cabos ligação macho / macho 1  
Display LCD

Display LCD 16X2 com pinos soldados

1 DISPLAY LCD 16X2

LCD que utilize o controlador HD44780 (veja na descrição ou datasheet do componente)

O display poderá ser de qualquer cor (fundo verde, azul ou vermelho)

Módulo I2C para display LCD 

Módulo I2C com CI PCF8574

(opcional)

 
 1 Módulo I2C display LCD Arduino

O módulo I2C poderá vir separado ou já soldado no display LCD

(datasheet)

Se você não possui um módulo I2C para display LCD, poderá adaptar o projeto para o display LCD sem o adaptador.

Sensor de Temperatura e Umidade DHT22

Sensor de Temperatura e Umidade DHT22

1

Características do DHT11 utilizado neste exemplo:

Tensão de alimentação: 3,3V a 5V

Umidade relativa: 0% a 100% (precisão de 2%)

Temperatura: -40 a 80 ºC (precisão de 1%)

Resolução: 0,1

Intervalo entre medições: mínimo 2s

Corrente de utilização: 0,5mA

datasheet

 Resistor  Resistor 10KΩ   1   1 Resistor de 4,7KΩ a 10KΩ 
Arduino UNO R3 Arduino UNO 1

Você poderá utilizar uma placa Arduino UNO original ou similar

Montagem do Circuito

Conecte os componentes no Protoboard como mostra a figura abaixo. Verifique cuidadosamente os cabos de ligação antes de ligar seu Arduino. Lembre-se que o Arduino deve estar totalmente desconectado da força enquanto você monta o circuito.


Atenção

1. Neste projeto vamos utilizar um display LCD 16x2 com controlador HD44780, que se adapta aos mais diversos projetos com vários modelos de placas e microcontroladores. Este display possui 16 colunas por 2 linhas com backlight (luz de fundo) verde, azul ou vermelha e tem 16 pinos para a conexão. Atenção: Utilize um display LCD com os pinos soldados.

2. Para a montagem do display com adaptador, entenda a estrutura do módulo I2C para display LCD 16x2 / 20X4:

Módulo I2C - Detalhes

2.1. Na lateral do adaptador encontramos 4 pinos, sendo: 2 pinos para alimentação (Vcc e GND) e 2 pinos para conexão com a interface I2C (SDA e SCL) que deverão estar conectados nos pinos analógicos A4 (SDA) e A5 (SCL) do Arduino Uno ou nos pinos A20 (SDA) e A21 (SCL) do Arduino Mega 2560. Veja a tabela abaixo com onde temos as principais placas Arduino e suas conexões com o I2C.

2.2. Para controlar o contraste do display, utilize o potenciômetro de ajuste de contraste. O jumper lateral, quando utilizado, permite que a luz do fundo (backlight) seja controlada pelo programa ou permaneça apagada.

 

2.3. A seleção de endereço do adaptador I2C para display LCD, na maioria dos módulos fornecidos no mercado já vêm configurados com o com o endereço 0x27. Se você não sabe qual endereço que o seu módulo I2C e/ou módulo RTC DS3231 está configurado, baixe o seguinte "sketch":

2.3.1 Após instalar e rodar o sketch acima, abra o monitor serial que mostrará qual é o endereço que o seu módulo I2C e o módulo RTC DS3231 está configurado:

 

2.3.1.1 Nos casos em que módulo I2C estiver configurado com uma faixa de endereços diferente do endereço 0X27 altere a alinha de programação -> LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); com o endereço correto.

2.5. Para saber mais sobre a montagem e utilização de display LCD com módulo I2C leia: Projeto 48 - Como controlar um display LCD com o módulo I2C.

 3. Cuidado para não ligar o sensor de temperatura invertido. Ele deve ficar com a face reta virada para frente e conectado da seguinte forma:

Pinagem DHT11

3.1. O pino 1 deverá estar conectado no polo positivo Vcc - tensão de contínua contínua de 3.3V a 5V.

3.2. O pino 2 deverá estar conectado em uma porta analógica do Arduino. No nosso projeto utilizamos a porta analógica A1.

3.2.1. ATENÇÃO: Para evitar flutuações e garantir que o sinal seja lido corretamente é necessário acrescentar um resistor "pullup" de 4,7KΩ a 10KΩ.

3.2.2. Veja abaixo como deve ser a montagem do resistor "pullup":

3.3. Pino 3 não deverá estar conectado (NC - não conectado);

3.4. Pino 4 deverá estar conectado ao polo negativo GND - tensão 0V)

4. A montagem do nosso projeto foi realizada em um protoboard com linhas de alimentação contínuas. Verifique se o seu protoboard possui linhas de alimentação contínuas ou separadas - saiba mais em protoboard

Incluindo a biblioteca para os Sensores de Temperatura DHT11, DHT22, DHT33 e DHT44

Para facilitar e reduzir o tempo gasto em programação, utilizaremos a biblioteca DHTIB desenvolvida para os sensores DHT11, DHT22, DHT33 e DHT44:

Download dos arquivos da biblioteca do sensor DHT11

Para trabalharmos de forma mais fácil com o sensor DHT, podemos baixar a biblioteca DHTlib que foi desenvolvida para os sensores DHT11, DHT22, DHT33 e DHT44:

Para saber detalhes desta biblioteca clique aqui.

Instalando a biblioteca pelo IDE do Arduino

Após fazer o download do arquivo DHTlib.zip com todos os arquivos da biblioteca compactados no formato zip, abra o IDE do Arduino e siga o tutorial: Como incluir uma biblioteca no IDE do Arduino.

Incluindo biblioteca LiquidCrystal_I2C

Atenção: Caso você opte pela utilização do display de LCD sem o módulo I2C, siga os procedimentos do Projeto 38 - Controlando um display LCD (instalação e comandos básicos) e não instale a biblioteca abaixo.

Para que o módulo I2C funcione corretamente é necessário adicionarmos a biblioteca LiquidCrystal_I2C no IDE do Arduino. Uma das grandes vantagens das placas Arduino é a diversidade de bibliotecas disponíveis que podem ser utilizadas em seus programas. Estas bibliotecas podem ser criadas para a linguagem "C" ou especificamente para o Arduino, reduzindo drasticamente o tempo gasto com programação. Veja a tabela Coletânea de bibliotecas para sensores.

Download dos arquivos da biblioteca LiquidCrystal_I2C 

Para saber detalhes desta biblioteca clique aqui.

Instalando a biblioteca pelo IDE do Arduino

Após fazer o download do arquivo NewliquidCrystal_1.3.4.zip com todos os arquivos da biblioteca compactados no formato zip, abra o IDE do Arduino e siga o tutorial: Como incluir uma biblioteca no IDE do Arduino.

Utilizando a biblioteca LiquidCrystal_I2C

Para instalação e utilização da biblioteca para o módulo I2C como comunicação para um display LCD siga o tutorial: Projeto 48 - Como controlar um display LCD com o módulo I2C

Comandos do display LCD para a biblioteca LiquidCrystal

No projeto vamos utilizar alguns comandos de controle do display LCD através da biblioteca LiquidCrystal que já vem embutida na IDE do Arduino. Para conhecer todos os comandos desta biblioteca, acesse o link: Comandos display LCD para biblioteca LiquidCrystal e LiquidCrystal Library (Arduino Reference).

Obs.: Para acessarmos uma biblioteca embutida na IDE do Arduino, assim como, para acessarmos um biblioteca local através de um header file, utilizaremos a diretiva #include.

Código do Projeto (Sketch)

1) Faça o dowload e abra o arquivo projeto87.ino no IDE do Arduino:

Obs. 1: Nos casos em que módulo I2C estiver configurado com um endereço diferente do endereço 0X27, altere a alinha de programação -> LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); com o endereço correto. - Veja o tutorial Projeto 48 - Como controlar um display LCD com o módulo I2C

Obs. 2: Se estiver utilizando um display de LCD 20 X 4, altere o comando da linha 36 para lcd.begin (20,4);

Obs.3: Se não possuir o módulo I2C utilize apenas o display LCD conforme Projeto 38 - Controlando um display LCD (instalação e comandos básicos)

Obs.4: Atenção: Este código poderá ser utilizado também com o sensor DHT11. Para isto, basta excluir as duas barras de comentário na linha 29 (antes de DHT.read11) e acrescentar as duas barras na linha 30.

Se preferir, copie e cole o código abaixo no IDE do Arduino:

/*******************************************************************************
*
*    Projeto 87 - Utilizando um sensor de temperatura e umidade DHT22 com LCD 
*            http://squids.com.br/arduino
*
*******************************************************************************/
#include <dht.h> // Inclui a biblioteca no seu código
#include <LiquidCrystal_I2C.h>//Carrega a biblioteca lcd com I2C

//Define os pinos que serão utilizados para ligação ao display
LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE);
 
dht DHT; // Cria um objeto da classe dht
uint32_t timer = 0;
 
void setup()
{
  Serial.begin(9600); // Inicializa serial com taxa de transmissão de 9600 bauds
  lcd.begin(16, 2); // Define o display com 16 colunas e 2 linhas
  lcd.clear(); // limpa a tela do display
}
 
void loop() {
  // Executa 1 vez a cada 2 segundos
  if(millis() - timer>= 2000)  {

    // chama método de leitura da classe dht conectado no pino A1      
    //DHT.read11(A1); // uso do sensor DHT11
    DHT.read22(A1);   // uso do sensor DHT22            
     
    // Exibe na serial o valor da temperatura
    Serial.print("Temperatura = ");
    Serial.print(DHT.temperature,1); 
    Serial.print(" Celsius  ");
    
    // Exibe na serial o valor de umidade
    Serial.print("Umidade = ");
    Serial.print(DHT.humidity,1);
    Serial.println(" %  ");

    // Exibe no display LCD o valor da temperatura
    lcd.setCursor(0,0); // Define o cursor na posição de início
    lcd.print("Temp. = ");
    lcd.print(DHT.temperature,1);
    lcd.write(B11011111); // Imprime o símbolo de grau
    lcd.print("C");

    // Exibe no display LCD o valor da humidade
    lcd.setCursor(0,1); // Define o cursor na posição de início
    lcd.print("Humd. = ");
    lcd.print(DHT.humidity,1);
    lcd.print(" %");

    timer = millis(); // Atualiza a referência
  }
} 

Vídeo

Como o projeto deve funcionar

1. Ao executar o programa, a temperatura atual, em Celsius, e a umidade relativa, em porcentagem, serão exibidas no display LCD e atualizadas a cada 2 segundos.

Obs.: Após iniciar o programa é necessário aguardar 5 segundos para que o sensor estabilize a leitura de dados.

2. Para visualizar a leitura das temperaturas e umidade relativa registradas, clique no ícone monitor serial, como mostra a figura abaixo:

Explicando o Código do Projeto

1. Primeiro definimos e declaramos as bibliotecas, constantes e variáveis do projeto.

 

1.1. Através do comando #include incluímos as bibliotecas dht.h e LiquidCrystal_I2C.h para serem compiladas junto ao sketch (não utilize ponto e vírgula no final de uma diretiva #include).

1.1.1. A diretiva #include é utilizada para incluir bibliotecas externas em um sketch. Isso dá ao programador acesso a um grande grupo de bibliotecas C padrão (grupos de funções pré definidas) e também bibliotecas específicas para o Arduino.

1.1.2. Como já mencionamos anteriormente, o arquivo dht.h da biblioteca da DHTlib deve ser inserido no IDE do Arduino. Se tiver dúvidas leia o artigo Como incluir uma biblioteca no IDE do Arduino.

1.1.3. O mesmo deverá acontecer com o arquivo LiquidCrystal_I2C.h. A biblioteca LiquidCrystal_I2C contém todos os comandos e recursos para controlar um display LCD através do módulo I2C.

1.2. Através da instrução LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3, POSITIVE); a biblioteca do LCD faz com que o programa do Arduino saiba que ao dar o comando LiquidCrystal lcd_I2C iremos utilizar um display, e faremos a comunicação no Arduino com o endereço 0X27.: 12, 11, 5, 4, 3, conforme mostra a tabela abaixo:

 

1.3. O comando dht DHT instancia o objeto definido pela classe dht inserida na biblioteca dht.h. Isto faz com que possamos utilizar todos os métodos (funções) da biblioteca para uso no programa.

1.4. Observe que utilizamos a variável tipo unit32_t. Veja na tabela abaixo as diferenças nos tipos de constantes e variáveis:

Tipo Valores Válidos para Variáveis e Constantes

char

letras e símbolos: 'a', 'b', 'H', '^', '*','1','0' (utiliza 1 byte da memória,)
uint32_t, unsigned_long de 0 a 4.294.967.295 (números inteiros) (utiliza 2 bytes da memória)
unsigned int, uint16_t de 0 a 65.535 (números inteiros) (utiliza 2 bytes da memória)
long de - 2.147.483.648 a 2.147.483.647 (números inteiros) (utiliza 4 bytes da memória)

int, short

de -32767 até 32767 (números inteiros) (utiliza 2 bytes da memória)
float, double de -3.4 x 1038 até +3.4 x 10+38com até 6 dígitos de precisão (2 casas depois da vírgula - ponto flutuante) (utiliza 4 bytes da memória)

byte, uint8_t

de 0 a 255 (números inteiros) (utiliza 1 byte da memória)

boolean

true (1) , false (0) (utiliza 1 byte de memória)

1.5. Definimos a variável timer tipo uint32_t que recebe o valor zero.

2. Através da estrutura void setup(), definimos:

 

2.1. A função Serial.begin() serve para dizer ao Arduino que será coletado dados para o computador a partir da porta serial e o cabo USB. O número entre os parênteses significa qual é a taxa de dados que a placa vai se comunicar com o computador. Utilizaremos a taxa padrão de 9600bps (bits-per-second).

2.2. Através da instrução lcd.begin(16,2); a biblioteca do LCD informa ao Arduino que será utilizado um display com 16 colunas e 2 linhas.

2.3. O comando lcd.clear() limpa a tela do display LCD,

3. Através da estrutura void loop(), obtemos:

 

3.1. Através da expressão condicional if(millis() - timer >= 2000) verificamos se o valor da função millis() sbutraído do valor da variável timer é menor ou igual a 2000ms (2 segundos), sendo que:

3.1.2. A função millis() retorna o número de milissegundos passados desde que a placa Arduino começou a executar o programa atual. Esse número irá sofrer overflow (chegar ao maior número possível e então voltar pra zero), após aproximadamente 50 dias.

3.1.3. A variável timer tipo uint32_t, recebe inicialmente o valor zero.

3.1.4. Assim, quando a diferença entre a função milis() e zero (valor inicial de timer) for maior que 2.000, a expressão condicional será verdadeira e todos comandos inerentes a ela serão executados. Isto significa que, o programa roda durante 2 segundos sem executar os comandos definidos pela expressão if(millis() - timer >= 2000; fazendo com que estes comandos somente sejam executados a cada 2 segundos.

Obs.: É importante salientar que a utilização da função millis() como condicional é diferente de utilizamos a função pause() que paralisa totalmente o programa por um determinado período. Leia mais: função millis().

3.2. Caso a expressão condicional if(millis() - timer >= 2000) seja atendida, os seguintes comandos são realizados:

3.2.1. A expressão DHT.read22(A1); executa o método DHT.read22() da biblioteca dht.h permitindo realizar as leituras do sensor DHT22 que está conectado no pino analógico A1 do Arduino.

3.2.2. É exibido no Monitor Serial o valor da Temperatura em Celsius, através da diretiva DHT.temperatura, que faz parte do método DHT.read(). Para saber detalhes desta biblioteca clique aqui.

3.2.2.1. Observe que o valor será exibido com uma casa decimal, pois utilizamos a seguinte expressão: Serial.print(DHT.temperatura,1), sendo que 1 representa a exibição de uma casa decimal. Para saber mais leia: Serial.print() Reference

3.2.2.1. Para temperaturas lidas pelo sensor DHT22, podemos utilizar uma casa decimal, pois a resolução do sensor é de 0,1ºC. Já o sensor DHT11 tem resolução de 2º.

3.2.3. Da mesma forma é exibido o valor da Umidade Relativa do ar em porcentagem, através da diretiva DHT.humidity, que também faz parte do método DHT.read(). Para saber detalhes desta biblioteca clique aqui.

3.2.4. Em seguida, é exibido no display o valor da temperatura lido pelo comando DHT.temperature, sendo que:

 

Obs.: Para saber mais detalhes da biblioteca LiquidCrystal, leia: Biblioteca LiquidCrystal - Comandos display LCD

3.2.4.1. Através do comando lcd.setCursor(0,1) definimos a posição do cursor no primeiro caractere da segunda linha do display.

3.2.4.2. Com base na posição do cursor definida acima, é exibido no display LCD o texto "Temp. = ", através do comando lcd.print().

3.2.4.3. É exibido o valor da temperatura obtida pela leitura no DHT11 através do comando lcd.print( DHT.temperature,1);

3.2.4.3.1. Observe que o valor da temperatura será exibido com uma casa decimal, pois utilizamos o método lcd.print( DHT.temperature,1). O valor 1 na expressão indica o número de casas decimais, portanto, a temperatura deverá ser exibida com uma casa decimal apenas.

3.2.4.4. Através do comando lcd.write(B11011111) é exibida o símbolo de grau (º):

3.2.4.4.1. Diferentemente de lcd.print(), que imprime uma string no display, a função lcd.write() imprime um caractere.

3.2.4.4.2. Utilizamos um valor binário para definir o nosso caractere (11011111). Em C++, precisamos utilizar o prefixo "B" antes de um número binário, por isso lcd.write(B11011111) . Veja a tabela abaixo:

Obs.: Leia a referência para usos de constantes com base binário, octal ou hexadecimal - Constantes Inteiras

3.2.4.4.3. Se você converter o valor binário 11011111 para decimal e hexadecimal encontrará os valores 223 (decimal) e DF (hexadecimal). Assim, você poderia escrever lcd.write(B11011111) como lcd.write(223) ou lcd.write(0xDF) que o símbolo de grau seria exibido de qualquer forma. Obs.: Teste as conversões na Calculadora para Converter número Decimal para Binário, Octal e Hexadecimal.

3.2.4.4.4. O valor do caractere utilizado foi obtido na tabela de caracteres para display LCD com controlador HD44780 abaixo. Usamos o prefixo 1101 (linha horizontal) com o final xxxx1111 (linha vertical) e obtemos o valor binário 11011111. (Nota do Autor: Lembre-se, um caractere tem 1byte, ou seja, 8 bits).

ATENÇÃO: Esta tabela pode variar para outros tipos de displays.

LCD Character Set - source: mil.ufl.edu

3.2.4.5. Através do comando lcd.print() é exibida no display LCD a string "C".

3.2.5. Em seguida, será exibido no display LCD o valor da umidade lido pelo comando DHT.humidity, sendo que:

 

Obs.: Para saber mais detalhes da biblioteca LiquidCrystal, leia: Biblioteca LiquidCrystal - Comandos display LCD

3.2.5.1. Através do comando lcd.setCursor(0,0) definimos a posição do cursor no primeiro caractere da primeira linha do display.

3.2.5.2. Com base na posição do cursor definida acima, é exibido no display LCD o texto "Humid. = ", através do comando lcd.print().

3.2.5.3. É exibido o valor da umidade relativa do ar obtida pela leitura no DHT11 através do comando lcd.print( DHT.humidity,1); // uma casa decimal

3.2.5.4. Através do comando lcd.print() é exibida no display LCD a string "%".

3.2.6. Finalmente, a expressão timer = millis(); faz com que a variável timer receba agora o valor de millis() após 2000ms, reiniciando a contagem para a próxima exibição dos valores que atualizará as leituras do sensor de temperatura DHT11.

Desafios

Com base neste projeto, resolva o seguinte desafio:

O anúncio abaixo ajuda a manter o Squids Arduino funcionando.

Compartilhe:

Doações

Contribua pra manter o site online :)

Inscreva-se no canal Squids

Squids Arduino News

Desafio 88 - Projeto I12 Cronômetro contador de voltas com sensor infravermelho Com base no projeto I12 - Cronômetro com pause controlado por leds infravermelhos - Arduino resolva os seguintes ...

Intermediário - Projeto 12 Cronômetro com pause, sensor infravermelho e reset - Arduino Objetivo Criar um cronômetro utilizando o módulo TM1637 (opcional) e/ou o display LCD com pause controla...

Básico - Hub 013 Cronômetro com pause e reset (interrupção por timer)   Sugerido por: Wagner G L Objetivo O objetivo é adaptar o Projeto 64 - Cronômetro com display TM1637 e Arduino acresc...

Básico - Hub 012 Cronômetro com pause e reset   Sugerido por: Wagner G L Objetivo O objetivo é adaptar o Projeto 64 - Cronômetro com display TM1637 e Arduino acrescentando botões de pause ...

Básico - Hub 011 Acertar número aleatório usando potenciômetro - jogo   Sugerido por: Juliandrew Facundo Para iniciar o jogo deve-se pedir ao usuário que digite o valor 1 no teclado do comp...

Outros artigos

Mais: Desafios Projetos Intermediários Básico Projetos Básicos Arduino Maker

Você está preparado?

Topo