Código de Pesquisa

Lição 20/31: Exibindo temperatura e umidade do DHT11 na tela LCD

Lição 20/31: Exibindo temperatura e umidade do DHT11 na tela LCD

Este tutorial demonstra como combinar um sensor de temperatura e umidade DHT11 com um display LCD1602 habilitado para I2C para criar uma estação de monitoramento ambiental compacta. Em vez de ler dados brutos do sensor no monitor serial, você aprenderá a exibir leituras de temperatura e umidade em tempo real em uma tela de caracteres 16x2. Este projeto é ideal para construir uma estação meteorológica de mesa, um pequeno monitor de estufa ou adicionar uma leitura local a qualquer projeto de automação residencial. A interface I2C simplifica a fiação, tornando este um projeto acessível para iniciantes e uma adição rápida para criadores experientes.

LCD_sunFounder

Aqui estão algumas ideias práticas do que você pode construir com esse conhecimento:

  • Uma estação meteorológica de mesa mostrando as condições atuais do ambiente.
  • Um display compacto para um terrário de répteis ou plantas.
  • Uma leitura local para um servidor ou ambiente de oficina.
  • Um módulo base para um sistema de automação residencial mais complexo.

Hardware e Componentes

Para construir este projeto, você precisará dos seguintes componentes:

  • Arduino Uno (ou placa compatível)
  • Display LCD1602 com módulo de interface I2C
  • Sensor de temperatura e umidade DHT11
  • Um resistor pull-up de 4,7kΩ ou 10kΩ (se usar um sensor DHT11 puro)
  • Cabos jumper
  • Protoboard (opcional, para conexões mais fáceis)

Entendendo o LCD1602 I2C

O LCD1602 é um display de caracteres comum com 16 colunas e 2 linhas. O módulo "I2C" soldado na parte de trás do display é a chave para sua simplicidade. Este módulo converte a interface paralela do LCD em uma interface serial I2C, que requer apenas dois fios para dados (SDA e SCL) e dois para alimentação (VCC e GND). Isso reduz drasticamente o número de pinos necessários no seu Arduino, deixando mais disponíveis para outros sensores e atuadores. O módulo também inclui um pequeno potenciômetro para ajustar o contraste do display, o que é crucial para garantir que o texto seja visível. O endereço I2C do módulo pode ser alterado usando os pequenos jumpers de solda (A0, A1, A2) na placa, permitindo que vários dispositivos I2C coexistam no mesmo barramento.

Guia de Fiação

LCD1602_wiring_DHT11_nopcb_bb

Conecte os componentes conforme mostrado no diagrama abaixo. O LCD I2C usa os pinos I2C do Arduino, enquanto o sensor DHT11 usa um pino digital.

Para o LCD1602-I2C:

  • VCC ao 5V do Arduino
  • GND ao GND do Arduino
  • SDA ao A4 do Arduino
  • SCL ao A5 do Arduino

Para o sensor DHT11:

  • VCC (Pino 1) ao 5V do Arduino
  • Data (Pino 2) ao Pino Digital 2 do Arduino (com um resistor pull-up de 10kΩ para 5V)
  • NC (Pino 3) - Não Conectado
  • GND (Pino 4) ao GND do Arduino

(no vídeo em 25:16)

Configurando as Bibliotecas

Este projeto requer duas bibliotecas. A biblioteca Wire.h faz parte da instalação padrão do Arduino. Você precisará instalar a biblioteca LiquidCrystal_I2C e a biblioteca dht11. O vídeo demonstra como instalá-las. Você pode baixar as bibliotecas nos links fornecidos na descrição do vídeo ou no site da Robojax. Após o download, você pode instalá-las via IDE do Arduino navegando para Sketch > Include Library > Add .ZIP Library... e selecionando os arquivos baixados. (no vídeo em 06:16)

Encontrando o Endereço I2C do Seu LCD

Antes de usar o display, você deve determinar seu endereço I2C. O endereço mais comum é 0x27 ou 0x3F, mas pode variar. Para encontrá-lo, você pode usar um sketch de varredura I2C. Este é um programa simples que varre o barramento I2C e relata quaisquer endereços encontrados ao Monitor Serial. Carregue o código de varredura, abra o Monitor Serial a 9600 baud, e ele exibirá o endereço do seu LCD. (no vídeo em 08:11)

Explicação do Código

Esta seção explica as partes principais e configuráveis do código. O programa completo está disponível para download abaixo do artigo.

O código começa incluindo as bibliotecas necessárias e definindo os pinos e objetos usados.

// arquivo de cabeçalho do GetHub: https://github.com/adidax/dht11
#include <dht11.h>
dht11 DHT11; // cria objeto de DHT11
#define dhtpin 2 // define o pino para conectar ao DHT11

// início das configurações para LCD1602-I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Define o endereço do LCD como 0x3F para um display de 16 caracteres e 2 linhas
LiquidCrystal_I2C lcd(0x3F, 16, 2);
// fim das configurações para LCD1602-I2C

Estas são as linhas mais importantes para configurar na sua montagem:

  • #define dhtpin 2: Isso define o pino do Arduino conectado ao pino de dados do sensor DHT11. Altere o número 2 se você usar um pino diferente.
  • LiquidCrystal_I2C lcd(0x3F, 16, 2);: Esta linha cria o objeto do LCD. O primeiro parâmetro, 0x3F, é o endereço I2C que você encontrou na etapa anterior. Os 16 e 2 definem o número de colunas e linhas do seu display. Atualize o endereço se o seu scanner encontrou um diferente (por exemplo, 0x27).

O código usa uma função personalizada, getTemp(), para ler a temperatura e convertê-la em diferentes unidades. Este é um recurso poderoso que torna o código reutilizável para diferentes aplicações.

float getTemp(char type) {
    float temp = (float)DHT11.temperature;//obtém a temperatura
  if(type =='F')
  {
    return temp * 1.8 + 32;// converte para Fahrenheit
  }else if(type =='K')
  {
    return temp + 274.15;// converte para Kelvin
  }else{
   return temp; 
  }  
}

Para usar esta função, você a chama com um argumento de caractere único representando a unidade desejada. Por exemplo, getTemp('C') retorna a temperatura em Celsius, getTemp('F') retorna em Fahrenheit e getTemp('K') retorna em Kelvin. A função lê a temperatura bruta do sensor DHT11 e aplica a fórmula de conversão necessária. Isso permite que você altere facilmente a unidade exibida no loop() principal sem reescrever a lógica de leitura do sensor. O loop principal imprime a temperatura e a umidade no LCD usando as funções lcd.setCursor() e lcd.print() para controlar onde na tela os valores aparecem.

Exibindo o Símbolo de Grau

O conjunto de caracteres padrão do LCD HD44780 não inclui um símbolo de grau dedicado (°). Para exibi-lo, você deve usar a função lcd.write() com o valor decimal do caractere da ROM do LCD. Para o símbolo de grau, esse valor é 223. O código demonstra isso usando lcd.print((char)223); para imprimir o símbolo após o valor da temperatura. (no vídeo em 30:16)

Demonstração do Projeto ao Vivo

Uma vez que o código é carregado, o display mostrará uma mensagem de inicialização antes de limpar e exibir a temperatura e umidade atuais. A primeira linha do display mostra o texto "LCD1602 DHT11", enquanto a segunda linha mostra a temperatura em Celsius, seguida pelo símbolo de grau e "C", e depois a temperatura em Fahrenheit, seguida pelo símbolo de grau e "F". O valor da umidade é impresso no monitor serial. A demonstração no vídeo mostra o display atualizando a cada meio segundo enquanto o sensor é segurado, refletindo com precisão as condições ambientais. (no vídeo em 29:42)

Exibir a voltagem de um potenciômetro no LCD é abordado em Lição 20/31: Exibindo voltagem no LCD1602.

Usar o mesmo LCD para exibir a distância de um sensor ultrassônico é abordado em Lição 20/31: Usando LCD1602 com Arduino para exibir temperatura, voltagem e distância | Robojax.

Projetos relacionados deste vídeo

Capítulos

  • [00:00] Introdução ao LCD1602 e visão geral do projeto
  • [01:30] Explicação do hardware LCD1602 e módulo I2C
  • [02:47] Ajustando o contraste do LCD
  • [03:14] Pinagem do LCD e configuração do endereço I2C
  • [05:28] Diagrama de ligação para o LCD1602
  • [06:16] Instalando a biblioteca LiquidCrystal_I2C
  • [08:11] Encontrando o endereço I2C com um scanner
  • [09:28] Código básico para imprimir texto no LCD
  • [11:10] Exemplos: cursor piscante e caracteres personalizados
  • [13:46] Criando e usando caracteres personalizados
  • [18:51] Exemplo de exibição serial
  • [23:16] Rolando texto no LCD
  • [24:36] Combinando o código do sensor DHT11 com o LCD
  • [30:16] Exibindo o símbolo de grau
  • [32:03] Removendo pontos decimais da temperatura
  • [33:00] Exibindo voltagem de um potenciômetro no LCD
  • [35:56] Exibindo distância de um sensor ultrassônico

Imagens

LCD1602_wiring_DHT11_nopcb_bb
LCD1602_wiring_DHT11_nopcb_bb
LCD_sunFounder
LCD_sunFounder
911-Lesson 20/31: Displaying Temperature and humidity from DHT11 on LCD screen
Idioma: C++
/*
Lesson 20/31: Displaying Temperature and humidity from DHT11 on  LCD screen
Get this code and watch video Download and resource page https://robojax.com/RJT603
YouTube video https://www.youtube.com/watch?v=NXAswOc_2zg
 

 * This is the Arduino code for  DHT11 module to read temperature and humidity
 * This code can display temperature in:
 * C is used to get Celsius
 * F is used to get Fahrenheit
 * K is used for Kelvin

 *  * 
 * Written by Ahmad Shamshiri for Robojax
 * on Jan 04, 2018
 * Robojax.com

   Please watch video instruction here https://youtu.be/0XMLnCYkvbE
 This code is available at http://robojax.com/course1/?vid=lecture11
 
with over 100 lectures Free On  YouTube Watch it here http://robojax.com/L/?id=338
Get the code for the course: http://robojax.com/L/?id=339 

  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

// header file from GetHub: https://github.com/adidax/dht11
#include <dht11.h>

dht11 DHT11; // create object of DHT11
#define dhtpin 2 // set the pin to connect to DHT11

// start of settings for LCD1602-I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x3F for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x3F, 16, 2);
// end of settings for LCD1602-I2C


void setup() {
    Serial.begin(9600);// setting up serial monitor

  // initialize the LCD, 
  lcd.begin();
  // Turn on the blacklight and print a message.
  lcd.backlight();
  lcd.clear();
  lcd.setCursor (0,0); //
  lcd.print("DHT11 Sensor"); 
  delay(2000);
}

void loop() {
	//Robojax Step By Step Arduino Course YouTube Watch it here http://robojax.com/L/?id=338
  DHT11.read(dhtpin);// initialize the reading
  int humidity = DHT11.humidity;// get humidity

  lcd.clear();// clear previous values from screen
  lcd.setCursor (0,0); //character zero, line 1
  lcd.print("LCD1602 DHT11"); // print text 

  // print distance in degrees C
  lcd.setCursor (0,1); //character 0, line 2
  lcd.print(getTemp('C'));// print Temperature Celsius
  lcd.setCursor (4,1); //character 5, line 2 
  lcd.print((char)223);// print degree 
  lcd.setCursor (5,1); //character 6, line 2 
  lcd.print("C");// print C
  
   // print distance degrees F
  lcd.setCursor (7,1); //character 8, line 2
  lcd.print(getTemp('F'));// print distance in cm
  lcd.setCursor (13,1); //character 14, line 2 
  lcd.print((char)223);// print degree 
  lcd.setCursor (14,1); //character 16, line 2 
  lcd.print("F");// print F 
  
  
  //code for Robojax.com video
   Serial.print(getTemp('C'));
   Serial.print("C ");
   Serial.print(getTemp('F'));
   Serial.print("F ");
   Serial.print(getTemp('K'));
   Serial.print("K ");
   Serial.print(" humidity:");
   Serial.print (humidity);
   Serial.print("% ");
   Serial.println();
 delay(500);
}


/*
 * getTemp(char type)
 * type character of upper case 
 * C is used to get Celsius
 * F is used to get Fahrenheit
 * K is used for Kelvin
 */
float getTemp(char type) {
	//Robojax Step By Step Arduino Course YouTube Watch it here http://robojax.com/L/?id=338	
    float temp = (float)DHT11.temperature;//get temp
  if(type =='F')
  {
    return temp * 1.8 + 32;// convert to Fahrenheit
  }else if(type =='K')
  {
    return temp + 274.15;// convert to Kelvin
  }else{
   return temp; 
  }
  
}

Arquivos📁

Bibliotecas do Arduino (zip)

Manual do Usuário