Cerca codice

Visualizzazione della temperatura da un HTU21D su un LCD

Visualizzazione della temperatura da un HTU21D su un LCD

In questo tutorial, impareremo a visualizzare le letture della temperatura dal sensore di temperatura e umidità HTU21D su un LCD. Il risultato sarà un setup funzionante in cui la temperatura può essere visualizzata in gradi Celsius, Fahrenheit e Kelvin, insieme all'umidità relativa mostrata sullo stesso schermo. Questo progetto ti darà esperienza pratica con la comunicazione I2C e la gestione dei dati di base del sensore. Per una guida visiva dettagliata, assicurati di guardare il video (nel video a 00:00).

HTU21D module

Hardware Spiegato

I componenti principali per questo progetto includono il sensore HTU21D e il display LCD. L'HTU21D è un sensore digitale di umidità e temperatura che comunica tramite il protocollo I2C. Fornisce misurazioni precise della temperatura in gradi Celsius o Fahrenheit e dell'umidità relativa in percentuale. Il sensore opera tipicamente a una tensione di 3,3V ma può anche funzionare con sistemi a 5V. Il display LCD che utilizzeremo è un LCD 16x2 con interfaccia I2C. Questo tipo di display richiede solo due fili per la comunicazione dei dati, rendendo più semplice il collegamento con microcontrollori come Arduino. L'interfaccia I2C consente di collegare più dispositivi sullo stesso bus, semplificando il cablaggio e riducendo il numero di pin utilizzati.

Dettagli del datasheet

ProduttoreAdafruit
Numero di parteHTU21D-F
Tensione logica/IO3,3 V (tipico)
Tensione di alimentazione1,5 V a 3,6 V
Corrente di uscita0,5 mA (tip.)
Corrente di picco1,5 mA (massimo)
Intervallo di temperatura-40 a 125 °C
Intervallo di umidità0 a 100 %UR
PacchettoDFN-6
Note / variantiNone

  • Assicurati di avere i livelli di tensione corretti per evitare danni al sensore.
  • Utilizzare resistori di pull-up sulle linee SDA e SCL se necessario.
  • Controlla l'indirizzo I2C con uno scanner per garantire una corretta configurazione.
  • Gestisci l'uscita del sensore con attenzione per evitare errori di lettura.
  • Tenere il sensore lontano da fonti di calore durante le misurazioni.

Istruzioni di cablaggio

Arduino wiring for HTU21DF light intesity sensor with LCD
Arduino wiring for HTU21DF light intesity sensor with LCD

Per collegare il sensore HTU21D all'Arduino, collega il pin VCC del sensore all'uscita 3.3V dell'Arduino. Successivamente, collega il pin GND del sensore a terra dell'Arduino. Il pin SDA, utilizzato per la trasmissione dei dati, deve essere collegato al pin A4 dell'Arduino. Analogamente, collega il pin SCL, utilizzato per il segnale di clock, al pin A5 sull'Arduino. Assicurati che il tuo LCD sia collegato correttamente; l'indirizzo I2C per l'LCD in questa configurazione è tipicamente 0x3F. Se stai utilizzando un tipo diverso di LCD o un indirizzo I2C diverso, assicurati di modificare il codice di conseguenza. Dopo il cablaggio, assicurati di controllare eventuali collegamenti allentati prima di accendere l'Arduino.

Esempi di codice e guida passo passo

Nel codice, iniziamo includendo le librerie necessarie per il sensore HTU21D e l’LCD:

#include 
#include "Adafruit_HTU21DF.h"
#include 

Questo configura l'ambiente per utilizzare sia il sensore che il display. La libreria `Adafruit_HTU21DF` gestisce le funzionalità del sensore, mentre la libreria `LiquidCrystal_I2C` gestisce il display LCD. Successivamente, creiamo un'istanza per sia il sensore che l'LCD:

Adafruit_HTU21DF htu = Adafruit_HTU21DF();
LiquidCrystal_I2C lcd(0x3F, 16, 2);

Qui,htuè l'oggetto per il sensore HTU21D, elcdè l'oggetto per il display LCD. L'indirizzo I2C per il LCD è impostato su 0x3F, che potresti dover verificare in base alla tua configurazione. Nella setup()funzione, inizializziamo l'LCD e verifichiamo se il sensore è operativo:

void setup() {
  lcd.begin();  
  lcd.backlight();
  if (!htu.begin()) {
      lcd.print("Sensor missing"); 
      while (1);
  }
  lcd.print("HTU21D Ready");
}

Questo codice inizializza il LCD e controlla la presenza del sensore. Se il sensore non viene rilevato, verrà visualizzato "Sensore mancante" e il programma si fermerà. Infine, nelloop()funzione, leggiamo continuamente i valori di temperatura e umidità e li visualizziamo:

void loop() {
   lcd.clear();
   lcdDisplay(0, 0, "Celsius: ", 10, 0, getHTU('C'), 'd');  
   lcdDisplay(0, 1, "Humidity: ", 10, 1, getHTU('H'), '%');  
   delay(5000);
}

In questo estratto, cancelliamo l'LCD, poi chiamiamo illcdDisplay()funzione per mostrare la temperatura in Celsius e l'umidità. IlgetHTU()la funzione recupera la temperatura o l'umidità in base al carattere passato.

Dimostrazione / Cosa Aspettarsi

Quando la configurazione è completa e il codice è caricato sull'Arduino, il LCD dovrebbe visualizzare la temperatura attuale in Celsius e l'umidità relativa. Se tutto è collegato correttamente, vedrai i valori aggiornarsi ogni pochi secondi. Fai attenzione ai comuni errori, come collegamenti invertiti o indirizzi I2C errati, che possono portare a fallimenti nella comunicazione con il sensore (nel video alle 05:00).

Timestamp video

  • 00:00- Introduzione
  • 01:30- Istruzioni di cablaggio
  • 03:15- Spiegazione del codice
  • 04:50- Dimostrazione
  • 05:40- Conclusione

Immagini

LCD1602 o LCD2004 con Sensore di Umidità e Temperatura HTU21DF con Arduino
LCD1602 o LCD2004 con Sensore di Umidità e Temperatura HTU21DF con Arduino
Arduino wiring for HTU21DF light intesity sensor with LCD
Arduino wiring for HTU21DF light intesity sensor with LCD
HTU21D module
HTU21D module
HTU21D module-back
HTU21D module-back
213-Display Temperature from HTU21DF on LCD1602-I2C or LCD2004
Lingua: C++
/*
 * Display Temperature from HTU21DF on LCD1602-I2C or LCD2004
 * Updated by Ahmad Shamshiri on July 13, 2019
 * in Ajax, Ontario, Canada
 * Watch video instructions for this sketch:
**************************************************
*
  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  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, 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() {
  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() {
   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)
{
  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
}

Cose di cui potresti avere bisogno

Risorse e riferimenti

File📁

Scheda tecnica (pdf)