Código de Pesquisa

Aula 36: Usando o Sensor de Temperatura HTU21D com um LCD Arduino Curso Passo a Passo

Aula 36: Usando o Sensor de Temperatura HTU21D com um LCD Arduino Curso Passo a Passo

O sensor de temperatura e umidade HTU21D é uma escolha popular para muitos projetos com Arduino devido à sua facilidade de uso e precisão. Nesta lição, construiremos um projeto simples que lê dados de temperatura e umidade do sensor e os exibe em uma tela LCD. Ao final deste tutorial, você terá uma configuração funcional que exibe continuamente a temperatura em Celsius, Fahrenheit e Kelvin, bem como a porcentagem de umidade relativa. Para mais esclarecimentos, você pode consultar o vídeo (no vídeo em mm:ss).

Hardware Explicado

O componente principal deste projeto é o sensor de temperatura e umidade HTU21D, que se comunica via I2C. Este sensor opera dentro de uma faixa de tensão de 1,5 a 3,6 volts, tornando-o adequado para sistemas de 3,3V e 5V. Ele consome muito pouca energia, tipicamente apenas 0,02 microamperes quando em repouso e 450 microamperes durante a medição. Além do HTU21D, também usaremos um display LCD, especificamente o LCD1602 com I2C. Este display permite a saída fácil de dados textuais e requer apenas dois pinos para comunicação: SDA (linha de dados) e SCL (linha de clock). A combinação destes componentes nos permitirá criar um display informativo para monitorar os níveis de temperatura e umidade.

Detalhes da Ficha Técnica

FabricanteTE Connectivity
Número da peçaHTU21D-F
Tensão de Lógica/IO1,5 - 3,6 V
Tensão de alimentação3,3 V (típ.)
Corrente de saída (típ.)0,02 µA (em repouso), 450 µA (medição)
Faixa de temperatura-40 a +125 °C
Faixa de umidade0 a 100 %UR
Resolução (Temperatura)0,01 °C
Resolução (Umidade)0,04 %UR
PacoteDFN-6

  • Use um resistor de pull-up para as linhas SDA e SCL, se não estiver integrado.
  • Garanta a tensão de alimentação correta para evitar danos ao sensor.
  • Mantenha a fiação adequada para evitar erros de comunicação.
  • Verifique o endereço I2C se o sensor não responder.
  • Use um atraso entre as leituras para evitar sobrecarga do sensor.
  • Certifique-se de que o LCD seja compatível com a comunicação I2C.

Instruções de Fiação

Para conectar o sensor HTU21D e o display LCD, comece pelas conexões de energia. Conecte o pino da esquerda do HTU21D à fonte de alimentação de 3,3V e o segundo pino (geralmente vermelho) ao terra. Em seguida, conecte o pino SDA do HTU21D ao pino analógico A4 do Arduino e o pino SCL ao pino analógico A5. Para o display LCD1602, conecte o pino VCC à mesma fonte de 3,3V e conecte o pino GND ao terra. O pino SDA no LCD também deve ser conectado a A4 e o pino SCL deve ser conectado a A5, permitindo que ambos os componentes compartilhem o barramento I2C. Certifique-se de que todas as conexões estejam seguras para facilitar a comunicação adequada entre o Arduino, o sensor e o display.

Exemplos de Código e Passo a Passo

O seguinte código inicializa o sensor HTU21D e o display LCD. Na função de configuração, o LCD é preparado para uso e o sensor é verificado quanto à conectividade:

void setup() {
  lcd.begin();
  lcd.backlight();
  if (!htu.begin()) {
      lcd.print("Robojax HTUD1DF");
      lcd.setCursor(0,1);
      lcd.print("sensor missing"); 
      while (1);
  } else {
      lcd.print("Robojax HTUD1DF");
      lcd.setCursor(0,1);
      lcd.print("Demo"); 
  }
  delay(2000);   
}

Este trecho verifica se o sensor está conectado corretamente. Se não, exibe uma mensagem de erro no LCD e interrompe o programa. Se o sensor estiver funcionando, mostra uma mensagem de demonstração por dois segundos. A função de loop é onde a leitura e exibição principais ocorrem. Aqui, chamamos a função `lcdDisplay` para mostrar a temperatura em diferentes unidades:

void loop() {
   lcd.clear(); // clear previous values from screen
   lcdDisplay(0, 0, "Celsius: ", 10, 0, getHTU('C'), 'd');  
   lcdDisplay(0, 1, "Fahrenheit: ", 10, 1, getHTU('F'), 'd');     
   delay(5000);
}

Neste loop, o LCD é limpo e as leituras de temperatura em Celsius e Fahrenheit são exibidas. A função `getHTU` é chamada com o caractere 'C' para Celsius e 'F' para Fahrenheit, respectivamente. Finalmente, a função `getHTU` é definida para ler a temperatura ou umidade com base no caractere de entrada:

float getHTU(char type) {
   float temp = htu.readTemperature();
   float rel_hum = htu.readHumidity();
   if(type =='F') {
       return temp * 9/5 + 32; // convert to Fahrenheit 
   } else if(type =='K') {
       return temp + 273.15; // convert to Kelvin
   } else if(type =='H') {
       return rel_hum; // return relative humidity
   } else {
       return temp; // return Celsius
   }
}

Esta função lê a temperatura e a umidade do sensor e converte a temperatura para a unidade solicitada. Certifique-se de verificar o código completo carregado abaixo do artigo para detalhes adicionais.

Demonstração / O que Esperar

Ao concluir a fiação e carregar o código, você deve ver os valores de temperatura e umidade exibidos no LCD. As leituras serão atualizadas a cada poucos segundos, refletindo as condições atuais. Se você aplicar calor ao sensor, deverá perceber a temperatura subindo de acordo, enquanto a umidade deve diminuir ligeiramente. Fique atento ao limite máximo de temperatura do sensor; exceder isso pode resultar em leituras imprecisas ou falha do sensor (no vídeo em mm:ss).

Marcos do Vídeo

  • 00:00- Introdução ao projeto
  • 01:15Instruções de fiação
  • 03:30- Revisão de código
  • 10:00- Demonstração da configuração
511-Lesson 36: Using the HTU21D Temperature Sensor with an LCD and Arduino: A Step-by-Step Course
Idioma: C++
/*
 * Robojax Arduino Step-by-Step Course
 * Part 4: Temperature Sensors
 * Lesson 36: HTU21D Temperature Sensor with LCD1602 and LCD2004 Display
 


 * Display Temperature from HTU21DF on LCD1602-I2C or LCD2004
 * Updated by Ahmad Shamshiri on July 13, 2019



  Please watch video instructions here https://youtu.be/SrFJKbmiaPM
 This code is available at http://robojax.com/course1/?vid=lecture36
 
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  

If you found this tutorial helpful, please support me so I can continue creating 
and make a donation using PayPal http://robojax.com/L/?id=64



*
  This is an example for the HTU21D-F Humidity & Temp Sensor

  Designed specifically to work with the HTU21D-F sensor from Adafruit
  ----> https://www.adafruit.com/products/1899

  These displays use I2C to communicate; 2 pins are required to
  interface

 Watch Introduction to a 360 Servo video with code: https://youtu.be/b_xvu6wWafA
You can get the wiring diagram from my Arduino Course at Udemy.com
Learn Arduino step by step with all libraries, codes, and wiring diagrams all in one place.
Visit my course now http://robojax.com/L/?id=62

If you found this tutorial helpful, please support me so I can continue creating 
content like this. 
or make a donation using PayPal http://robojax.com/L/?id=64

 * Code is available at http://robojax.com/learn/arduino

 * 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 downloaded 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/>. 

*/

#include <Wire.h>
#include "Adafruit_HTU21DF.h"

// Connect Vin to 3-5VDC
// Connect GND to ground
// Connect SCL to I2C clock pin (A5 on UNO)
// Connect SDA to I2C data pin (A4 on UNO)

Adafruit_HTU21DF htu = Adafruit_HTU21DF();

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

void setup() {
	//Get the code for the course: http://robojax.com/L/?id=339  
  lcd.begin();  
  lcd.backlight();
  if (!htu.begin()) {
      lcd.print("Robojax HTUD1DF");
      lcd.setCursor(0,1);
      lcd.print("sensor missing"); 
    while (1);
  }else{
  // initialize the LCD

  lcd.print("Robojax HTUD1DF");
  lcd.setCursor(0,1);
  lcd.print("Demo"); 
  }
  delay(2000);   
}

void loop() {
//Get the code for the course: http://robojax.com/L/?id=339  	
   lcd.clear();// clear previous values from screen
lcdDisplay(
             // to print Celsius:
             0, // character 0 
             0, // line 0
             "Celsius: ", 

             // to print Celsius
             10, // character 10
             0, // line 0
             getHTU('C'),
             'd'
             );  

  lcdDisplay(
             // to print fahrenheit:
             0, // character 0 
             1, // line 1
             "Fahrenheit: ", 

             // to print Fahrenheit
             10, // character 9
             1, // line 0
             getHTU('F'),
             'd'
             );     
    delay(5000);
lcdDisplay(
             // to print Kelvin:
             0, // character 0 
             0, // line 0
             "Kelvin: ", 

             // to print Celsius
             9, // character 10
             0, // line 0
             getHTU('K'),
             'k'
             );      
  lcdDisplay(
             // to print humidity text
             0, // character 0 
             1, // line 1
             "Humidity: ", 

             // to print humidity
             10, // character 9
             1, // line 1
             getHTU('H'),
             '%' 
             );  
   
        delay(5000);
}

/*
 * @brief returns temperature or relative humidity
 * @param "type" is character
 *     C = Celsius
 *     K = Kelvin
 *     F = Fahrenheit
 *     H = Humidity
 * @return returns one of the values above
 * Usage: to get Fahrenheit type: getHTU('F')
 * to print it on serial monitor Serial.println(getHTU('F'));
 * Written by Ahmad Shamshiri on July 13, 2019
 * in Ajax, Ontario, Canada
 * www.Robojax.com 
 */
float getHTU(char type)
{
	//Get the code for the course: http://robojax.com/L/?id=339  
  float value;
    float temp = htu.readTemperature();
    float rel_hum = htu.readHumidity();
   if(type =='F')
   {
    value = temp *9/5 + 32;//convert to Fahrenheit 
   }else if(type =='K')
   {
    value = temp + 273.15;//convert to Kelvin
   }else if(type =='H')
   {
    value = rel_hum;//return relative humidity
   }else{
    value = temp;// return Celsius
   }
   return value;
}//


/*
 * lcdDisplay(int tc, int tr, String title, int vc, int vr, float value)
 * displays value and title on LCD1602
 * How to use:
 * If you want to display: "Voltage: 13.56mV" starting from the first character
 * on the second row.
 * use:
 * lcdDisplay(0, 1, "Voltage: ", 13.56,'d')
 *   
 *   'd' is degree symbol
 * tc  is character number  (0)
 * tr is row in the lcd (1)
 * title is the text (Voltage:)
 * vc value for character 
 * vr value for  row or line
 * value is the value (13.56)
 */
void lcdDisplay(int tc, int tr, String title, int vc, int vr, float value,char symbol)
{
   // Robojax.com LCD1602 for HTU21D Demo
   lcd.setCursor (tc,tr); //
   lcd.print(title);
   
   lcd.setCursor (vc,vr); //
   lcd.print(value);
   if(symbol == 'd')
   {
    lcd.print((char)223);
   }else if(symbol =='%')
   {
    lcd.print("%");
   }else if(symbol =='k')
   {
    lcd.print("K");
   }
 // Robojax.com LCD1602 for HTU21D Demo
}

Coisas que você pode precisar

Arquivos📁

Folha de dados (pdf)