Suchcode

Lektion 36: Verwendung des HTU21D-Temperatursensors mit einem LCD Arduino Schritt-für-Schritt-Kurs

Lektion 36: Verwendung des HTU21D-Temperatursensors mit einem LCD Arduino Schritt-für-Schritt-Kurs

Der HTU21D Temperatur- und Feuchtigkeitssensor ist eine beliebte Wahl für viele Arduino-Projekte aufgrund seiner Benutzerfreundlichkeit und Genauigkeit. In dieser Lektion werden wir ein einfaches Projekt erstellen, das Temperatur- und Feuchtigkeitsdaten vom Sensor liest und auf einem LCD-Bildschirm anzeigt. Am Ende dieses Tutorials werden Sie ein funktionierendes Setup haben, das kontinuierlich die Temperatur in Celsius, Fahrenheit und Kelvin sowie den Prozentanteil der relativen Luftfeuchtigkeit anzeigt. Für weitere Informationen können Sie sich das Video (im Video bei mm:ss) ansehen.

Hardware erläutert

Die Hauptkomponente dieses Projekts ist der HTU21D Temperatur- und Feuchtigkeitssensor, der über I2C kommuniziert. Dieser Sensor arbeitet innerhalb eines Spannungsbereichs von 1,5 bis 3,6 Volt, was ihn sowohl für 3,3V- als auch für 5V-Systeme geeignet macht. Er verbraucht sehr wenig Strom, typischerweise nur 0,02 Mikroampere im Leerlauf und 450 Mikroampere während der Messung. Neben dem HTU21D werden wir auch ein LCD-Display verwenden, speziell das LCD1602 mit I2C. Dieses Display ermöglicht eine einfache Ausgabe von Textdaten und benötigt nur zwei Pins für die Kommunikation: SDA (Datenleitung) und SCL (Taktsignal). Die Kombination dieser Komponenten wird es uns ermöglichen, ein informatives Display zur Überwachung der Temperatur- und Feuchtigkeitswerte zu erstellen.

Datenblattdetails

HerstellerTE Connectivity
TeilenummerHTU21D-F
Logik/IO-Spannung1,5 - 3,6 V
Versorgungsspannung3,3 V (typ.)
Ausgangsstrom (typ.)0,02 µA (Leerlauf), 450 µA (Messung)
Temperaturbereich-40 bis +125 °C
Feuchtigkeitsbereich0 bis 100 %RH
Auflösung (Temperatur)0,01 °C
Auflösung (Luftfeuchtigkeit)0,04 %RH
PaketDFN-6

  • Verwenden Sie einen Pull-up-Widerstand für die SDA- und SCL-Leitungen, wenn dieser nicht integriert ist.
  • Stellen Sie die korrekte Versorgungsspannung sicher, um eine Beschädigung des Sensors zu vermeiden.
  • Halten Sie die richtige Verkabelung aufrecht, um Kommunikationsfehler zu vermeiden.
  • Überprüfen Sie die I2C-Adresse, wenn der Sensor nicht reagiert.
  • Verwenden Sie eine Verzögerung zwischen den Messungen, um eine Überlastung des Sensors zu verhindern.
  • Stellen Sie sicher, dass das LCD mit der I2C-Kommunikation kompatibel ist.

Verdrahtungsanweisungen

Um den HTU21D-Sensor und das LCD-Display zu verdrahten, beginnen Sie mit den Stromanschlüssen. Verbinden Sie den linken Pin des HTU21D mit der 3,3V-Stromquelle und den zweiten Pin (häufig rot) mit dem Boden. Verbinden Sie als Nächstes den SDA-Pin des HTU21D mit dem analogen Pin A4 des Arduino und den SCL-Pin mit dem analogen Pin A5. Für das LCD1602-Display verbinden Sie den VCC-Pin mit derselben 3,3V-Stromquelle und den GND-Pin mit dem Boden. Der SDA-Pin des LCD sollte ebenfalls mit A4 verbunden werden, und der SCL-Pin sollte mit A5 verbunden werden, sodass beide Komponenten den I2C-Bus gemeinsam nutzen können. Stellen Sie sicher, dass alle Verbindungen sicher sind, um eine ordnungsgemäße Kommunikation zwischen dem Arduino, dem Sensor und dem Display zu gewährleisten.

Code-Beispiele und Anleitung

Der folgende Code initialisiert den HTU21D-Sensor und das LCD-Display. In der Setup-Funktion wird das LCD für die Verwendung vorbereitet und die Verbindung zum Sensor überprüft:

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);   
}

Dieser Ausschnitt überprüft, ob der Sensor ordnungsgemäß angeschlossen ist. Wenn nicht, wird eine Fehlermeldung auf dem LCD angezeigt und das Programm angehalten. Wenn der Sensor funktioniert, wird für zwei Sekunden eine Demomeldung angezeigt. Die Schleifenfunktion ist der Ort, an dem das Hauptlesen und die Anzeige stattfinden. Hier rufen wir die Funktion `lcdDisplay` auf, um die Temperatur in verschiedenen Einheiten anzuzeigen:

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);
}

In dieser Schleife wird das LCD gelöscht, und die Temperaturwerte in Celsius und Fahrenheit werden angezeigt. Die Funktion `getHTU` wird jeweils mit dem Zeichen 'C' für Celsius und 'F' für Fahrenheit aufgerufen. Schließlich wird die Funktion `getHTU` definiert, um die Temperatur oder die Luftfeuchtigkeit basierend auf dem Eingabezeichen zu lesen:

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
   }
}

Diese Funktion liest die Temperatur und Luftfeuchtigkeit vom Sensor und konvertiert die Temperatur in die angeforderte Einheit. Stellen Sie sicher, den vollständigen Code zu überprüfen, der unter dem Artikel geladen ist, um weitere Details zu erhalten.

Demonstration / Was zu erwarten ist

Nachdem Sie die Verkabelung abgeschlossen und den Code hochgeladen haben, sollten die Temperatur- und Feuchtigkeitswerte auf dem LCD angezeigt werden. Die Werte werden alle paar Sekunden aktualisiert und spiegeln die aktuellen Bedingungen wider. Wenn Sie Wärme auf den Sensor anwenden, sollten Sie feststellen, dass die Temperatur entsprechend steigt, während die Feuchtigkeit leicht abnimmt. Achten Sie auf die maximale Temperaturgrenze des Sensors; das Überschreiten dieser Grenze kann zu ungenauen Messwerten oder einem Sensorfehler führen (im Video bei mm:ss).

Video-Zeiten

  • 00:00- Einführung in das Projekt
  • 01:15- Verkabelungsanweisungen
  • 03:30- Code-Durchgang
  • 10:00- Demonstration des Setups
511-Lesson 36: Using the HTU21D Temperature Sensor with an LCD and Arduino: A Step-by-Step Course
Sprache: 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
}

Dinge, die Sie vielleicht brauchen

Dateien📁

Datenblatt (pdf)