Suchcode

Lektion 20/31: Anzeige von Temperatur und Luftfeuchtigkeit vom DHT11 auf dem LCD-Bildschirm

Lektion 20/31: Anzeige von Temperatur und Luftfeuchtigkeit vom DHT11 auf dem LCD-Bildschirm

Dieses Tutorial zeigt, wie man einen DHT11-Temperatur- und Luftfeuchtigkeitssensor mit einem I2C-fähigen LCD1602-Display kombiniert, um eine kompakte Umweltüberwachungsstation zu erstellen. Anstatt rohe Sensordaten vom seriellen Monitor zu lesen, lernen Sie, Live-Temperatur- und Luftfeuchtigkeitswerte auf einem 16x2-Zeichendisplay anzuzeigen. Dieses Projekt ist ideal für den Bau einer Desktop-Wetterstation, eines kleinen Gewächshausmonitors oder für die Hinzufügung einer lokalen Anzeige zu jedem Hausautomationsprojekt. Die I2C-Schnittstelle vereinfacht die Verkabelung, was dieses Projekt für Anfänger zugänglich und für erfahrene Maker eine schnelle Ergänzung macht.

LCD_sunFounder

Hier sind einige praktische Ideen, was Sie mit diesem Wissen bauen können:

  • Eine Desktop-Wetterstation, die die aktuellen Raumkonditionen anzeigt.
  • Ein kompaktes Display für ein Reptilien- oder Pflanzen-Terrarium.
  • Eine lokale Anzeige für einen Serverraum oder eine Werkstattumgebung.
  • Ein Basismodul für ein komplexeres Hausautomationssystem.

Hardware und Komponenten

Um dieses Projekt zu bauen, benötigen Sie die folgenden Komponenten:

  • Arduino Uno (oder kompatibles Board)
  • LCD1602-Display mit I2C-Schnittstellenmodul
  • DHT11-Temperatur- und Luftfeuchtigkeitssensor
  • Ein 4,7kΩ- oder 10kΩ-Pull-up-Widerstand (wenn Sie einen nackten DHT11-Sensor verwenden)
  • Jumper-Kabel
  • Steckbrett (optional, für einfachere Verbindungen)

Verständnis des I2C-LCD1602

Das LCD1602 ist ein übliches Zeichendisplay mit 16 Spalten und 2 Zeilen. Das auf der Rückseite des Displays aufgelötete "I2C"-Modul ist der Schlüssel zu seiner Einfachheit. Dieses Modul wandelt die parallele Schnittstelle des LCDs in eine serielle I2C-Schnittstelle um, die nur zwei Drähte für Daten (SDA und SCL) und zwei für Strom (VCC und GND) benötigt. Dies reduziert drastisch die Anzahl der benötigten Pins auf Ihrem Arduino und lässt mehr für andere Sensoren und Aktoren frei. Das Modul enthält auch ein kleines Potentiometer zur Einstellung des Display-Kontrasts, was entscheidend ist, um sicherzustellen, dass Text sichtbar ist. Die I2C-Adresse des Moduls kann mit den kleinen Lötbrücken (A0, A1, A2) auf der Platine geändert werden, sodass mehrere I2C-Geräte auf demselben Bus koexistieren können.

Verkabelungsanleitung

LCD1602_wiring_DHT11_nopcb_bb

Verbinden Sie die Komponenten wie im Diagramm unten gezeigt. Das I2C-LCD verwendet die I2C-Pins des Arduinos, während der DHT11-Sensor einen digitalen Pin verwendet.

Für das LCD1602-I2C:

  • VCC an Arduino 5V
  • GND an Arduino GND
  • SDA an Arduino A4
  • SCL an Arduino A5

Für den DHT11-Sensor:

  • VCC (Pin 1) an Arduino 5V
  • Data (Pin 2) an Arduino Digital Pin 2 (mit einem 10kΩ-Pull-up-Widerstand zu 5V)
  • NC (Pin 3) - Nicht verbunden
  • GND (Pin 4) an Arduino GND

(im Video bei 25:16)

Einrichten der Bibliotheken

Dieses Projekt erfordert zwei Bibliotheken. Die Wire.h-Bibliothek ist Teil der Standard-Arduino-Installation. Sie müssen die LiquidCrystal_I2C-Bibliothek und die dht11-Bibliothek installieren. Das Video zeigt, wie man sie installiert. Sie können die Bibliotheken von den Links im Videobeschreibung oder von der Robojax-Website herunterladen. Nach dem Herunterladen können Sie sie über die Arduino-IDE installieren, indem Sie zu Sketch > Bibliothek einbinden > .ZIP-Bibliothek hinzufügen... navigieren und die heruntergeladenen Dateien auswählen. (im Video bei 06:16)

Finden der I2C-Adresse Ihres LCDs

Bevor Sie das Display verwenden können, müssen Sie seine I2C-Adresse bestimmen. Die häufigste Adresse ist 0x27 oder 0x3F, aber sie kann variieren. Um sie zu finden, können Sie einen I2C-Scanner-Sketch verwenden. Dies ist ein einfaches Programm, das den I2C-Bus scannt und alle gefundenen Adressen an den seriellen Monitor meldet. Laden Sie den Scanner-Code hoch, öffnen Sie den seriellen Monitor bei 9600 Baud, und er zeigt die Adresse Ihres LCDs an. (im Video bei 08:11)

Code-Erklärung

Dieser Abschnitt erklärt die wichtigsten, vom Benutzer konfigurierbaren Teile des Codes. Das vollständige Programm ist unten im Artikel zum Download verfügbar.

Der Code beginnt mit dem Einbinden der notwendigen Bibliotheken und der Definition der verwendeten Pins und Objekte.

// Header-Datei von GetHub: https://github.com/adidax/dht11
#include <dht11.h>
dht11 DHT11; // Objekt von DHT11 erstellen
#define dhtpin 2 // Pin zum Verbinden mit DHT11 festlegen

// Beginn der Einstellungen für LCD1602-I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// LCD-Adresse auf 0x3F für ein 16-Zeichen- und 2-Zeilen-Display setzen
LiquidCrystal_I2C lcd(0x3F, 16, 2);
// Ende der Einstellungen für LCD1602-I2C

Dies sind die wichtigsten Zeilen, die Sie für Ihr Setup konfigurieren müssen:

  • #define dhtpin 2: Dies definiert den Arduino-Pin, der mit dem Datenpin des DHT11-Sensors verbunden ist. Ändern Sie die Zahl 2, wenn Sie einen anderen Pin verwenden.
  • LiquidCrystal_I2C lcd(0x3F, 16, 2);: Diese Zeile erstellt das LCD-Objekt. Der erste Parameter, 0x3F, ist die I2C-Adresse, die Sie im vorherigen Schritt gefunden haben. Die 16 und 2 definieren die Anzahl der Spalten und Zeilen Ihres Displays. Aktualisieren Sie die Adresse, wenn Ihr Scanner eine andere gefunden hat (z. B. 0x27).

Der Code verwendet eine benutzerdefinierte Funktion, getTemp(), um die Temperatur zu lesen und in verschiedene Einheiten umzurechnen. Dies ist eine leistungsstarke Funktion, die den Code für verschiedene Anwendungen wiederverwendbar macht.

float getTemp(char type) {
    float temp = (float)DHT11.temperature;//Temperatur holen
  if(type =='F')
  {
    return temp * 1.8 + 32;// in Fahrenheit umrechnen
  }else if(type =='K')
  {
    return temp + 274.15;// in Kelvin umrechnen
  }else{
   return temp; 
  }  
}

Um diese Funktion zu verwenden, rufen Sie sie mit einem einzelnen Zeichenargument auf, das die gewünschte Einheit darstellt. Zum Beispiel gibt getTemp('C') die Temperatur in Celsius zurück, getTemp('F') in Fahrenheit und getTemp('K') in Kelvin. Die Funktion liest die rohe Temperatur vom DHT11-Sensor und wendet die notwendige Umrechnungsformel an. Dadurch können Sie die angezeigte Einheit in der Haupt-loop() einfach ändern, ohne die Sensor-Leselogik neu zu schreiben. Die Hauptschleife gibt die Temperatur und Luftfeuchtigkeit auf dem LCD aus, wobei die Funktionen lcd.setCursor() und lcd.print() verwendet werden, um zu steuern, wo auf dem Bildschirm die Werte erscheinen.

Anzeigen des Gradsymbols

Der standardmäßige HD44780-LCD-Zeichensatz enthält kein eigenes Gradsymbol (°). Um es anzuzeigen, müssen Sie die Funktion lcd.write() mit dem Dezimalwert des Zeichens aus dem ROM des LCDs verwenden. Für das Gradsymbol ist dieser Wert 223. Der Code demonstriert dies, indem er lcd.print((char)223); verwendet, um das Symbol nach dem Temperaturwert auszugeben. (im Video bei 30:16)

Live-Projektdemonstration

Sobald der Code hochgeladen ist, zeigt das Display eine Startmeldung an, bevor es gelöscht wird und die aktuelle Temperatur und Luftfeuchtigkeit anzeigt. Die erste Zeile des Displays zeigt den Text "LCD1602 DHT11", während die zweite Zeile die Temperatur in Celsius, gefolgt vom Gradsymbol und "C", und dann die Temperatur in Fahrenheit, gefolgt vom Gradsymbol und "F", anzeigt. Der Luftfeuchtigkeitswert wird auf dem seriellen Monitor ausgegeben. Die Demonstration im Video zeigt, wie sich das Display alle halben Sekunden aktualisiert, während der Sensor gehalten wird, und die Umgebungsbedingungen genau widerspiegelt. (im Video bei 29:42)

Das Anzeigen der Spannung eines Potentiometers auf dem LCD wird in Lektion 20/31: Spannung auf LCD1602 anzeigen behandelt.

Die Verwendung desselben LCDs zur Anzeige der Entfernung eines Ultraschallsensors wird in Lektion 20/31: Verwendung von LCD1602 mit Arduino zur Anzeige von Temperatur, Spannung und Entfernung | Robojax behandelt.

Verwandte Projekte aus diesem Video

Kapitel

  • [00:00] Einführung in das LCD1602 und Projektübersicht
  • [01:30] Erklärung der LCD1602-Hardware und des I2C-Moduls
  • [02:47] Einstellen des LCD-Kontrasts
  • [03:14] LCD-Pinbelegung und I2C-Adresskonfiguration
  • [05:28] Schaltplan für das LCD1602
  • [06:16] Installieren der LiquidCrystal_I2C-Bibliothek
  • [08:11] Finden der I2C-Adresse mit einem Scanner
  • [09:28] Grundlegender Code zum Drucken von Text auf dem LCD
  • [11:10] Beispiele: blinkender Cursor und benutzerdefinierte Zeichen
  • [13:46] Erstellen und Verwenden benutzerdefinierter Zeichen
  • [18:51] Serielles Anzeigebeispiel
  • [23:16] Scrollender Text auf dem LCD
  • [24:36] Kombinieren des DHT11-Sensorcodes mit dem LCD
  • [30:16] Anzeigen des Gradsymbols
  • [32:03] Entfernen von Dezimalstellen aus der Temperatur
  • [33:00] Anzeigen der Spannung eines Potentiometers auf dem LCD
  • [35:56] Anzeigen der Entfernung eines Ultraschallsensors

Bilder

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
Sprache: 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; 
  }
  
}

Ressourcen & Referenzen

Dateien📁

Arduino-Bibliotheken (zip)

|||Benutzerhandbuch