Code zoeken

Les 20/31: Weergave van temperatuur en luchtvochtigheid van DHT11 op LCD-scherm

Les 20/31: Weergave van temperatuur en luchtvochtigheid van DHT11 op LCD-scherm

Deze tutorial laat zien hoe je een DHT11 temperatuur- en luchtvochtigheidssensor combineert met een I2C-ondersteund LCD1602-display om een compact milieubewakingsstation te bouwen. In plaats van ruwe sensorgegevens van de seriële monitor te lezen, leer je live temperatuur- en luchtvochtigheidswaarden weer te geven op een 16x2-tekenweergave. Dit project is ideaal voor het bouwen van een desktop-weerstation, een kleine kasmonitor of het toevoegen van een lokale uitlezing aan elk huisautomatiseringsproject. De I2C-interface vereenvoudigt de bedrading, waardoor dit een toegankelijk project is voor beginners en een snelle toevoeging voor ervaren makers.

LCD_sunFounder

Hier zijn een paar praktische ideeën voor wat je met deze kennis kunt bouwen:

  • Een desktop-weerstation dat de huidige kamertemperatuur weergeeft.
  • Een compact display voor een reptielen- of plantenterrarium.
  • Een lokale uitlezing voor een serverruimte of werkplaatsomgeving.
  • Een basismodule voor een complexer huisautomatiseringssysteem.

Hardware en componenten

Om dit project te bouwen, heb je de volgende componenten nodig:

  • Arduino Uno (of compatibel bord)
  • LCD1602-display met een I2C-interfacemodule
  • DHT11 temperatuur- en luchtvochtigheidssensor
  • Een 4,7kΩ of 10kΩ pull-up weerstand (als je een kale DHT11-sensor gebruikt)
  • Jumperdraden
  • Breadboard (optioneel, voor eenvoudigere verbindingen)

De I2C LCD1602 begrijpen

De LCD1602 is een veelvoorkomend tekenweergave met 16 kolommen en 2 rijen. De "I2C"-module die op de achterkant van het display is gesoldeerd, is de sleutel tot de eenvoud ervan. Deze module zet de parallelle interface van de LCD om in een seriële I2C-interface, die slechts twee draden nodig heeft voor gegevens (SDA en SCL) en twee voor stroom (VCC en GND). Dit vermindert drastisch het aantal pinnen dat nodig is op je Arduino, waardoor er meer beschikbaar blijven voor andere sensoren en actuatoren. De module bevat ook een kleine potentiometer om het contrast van het display aan te passen, wat cruciaal is om ervoor te zorgen dat tekst zichtbaar is. Het I2C-adres van de module kan worden gewijzigd met behulp van de kleine soldeerjumpers (A0, A1, A2) op het bord, waardoor meerdere I2C-apparaten op dezelfde bus kunnen samenwerken.

Bedradingsgids

LCD1602_wiring_DHT11_nopcb_bb

Verbind de componenten zoals weergegeven in het onderstaande diagram. De I2C-LCD gebruikt de I2C-pinnen van de Arduino, terwijl de DHT11-sensor een digitale pin gebruikt.

Voor de LCD1602-I2C:

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

Voor de DHT11-sensor:

  • VCC (pin 1) naar Arduino 5V
  • Data (pin 2) naar Arduino digitale pin 2 (met een 10kΩ pull-up weerstand naar 5V)
  • NC (pin 3) - niet aangesloten
  • GND (pin 4) naar Arduino GND

(in video op 25:16)

De bibliotheken instellen

Dit project vereist twee bibliotheken. De Wire.h-bibliotheek maakt deel uit van de standaard Arduino-installatie. Je moet de LiquidCrystal_I2C-bibliotheek en de dht11-bibliotheek installeren. De video laat zien hoe je ze installeert. Je kunt de bibliotheken downloaden via de links in de videobeschrijving of van de Robojax-website. Eenmaal gedownload, kun je ze installeren via de Arduino IDE door naar Sketch > Include Library > Add .ZIP Library... te gaan en de gedownloade bestanden te selecteren. (in video op 06:16)

Het I2C-adres van je LCD vinden

Voordat je het display kunt gebruiken, moet je het I2C-adres bepalen. Het meest voorkomende adres is 0x27 of 0x3F, maar het kan variëren. Om het te vinden, kun je een I2C-scannerschets gebruiken. Dit is een eenvoudig programma dat de I2C-bus scant en eventuele gevonden adressen rapporteert aan de seriële monitor. Upload de scannercode, open de seriële monitor op 9600 baud en deze toont het adres van je LCD. (in video op 08:11)

Uitleg van de code

Deze sectie legt de belangrijkste, door de gebruiker configureerbare delen van de code uit. Het volledige programma is beschikbaar om te downloaden onder het artikel.

De code begint met het opnemen van de benodigde bibliotheken en het definiëren van de gebruikte pinnen en objecten.

// headerbestand van GetHub: https://github.com/adidax/dht11
#include <dht11.h>
dht11 DHT11; // maak object van DHT11
#define dhtpin 2 // stel de pin in om verbinding te maken met DHT11

// begin van instellingen voor LCD1602-I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Stel het LCD-adres in op 0x3F voor een display van 16 tekens en 2 regels
LiquidCrystal_I2C lcd(0x3F, 16, 2);
// einde van instellingen voor LCD1602-I2C

Dit zijn de belangrijkste regels om te configureren voor je opstelling:

  • #define dhtpin 2: Dit definieert de Arduino-pin die is verbonden met de datapin van de DHT11-sensor. Verander het nummer 2 als je een andere pin gebruikt.
  • LiquidCrystal_I2C lcd(0x3F, 16, 2);: Deze regel maakt het LCD-object. De eerste parameter, 0x3F, is het I2C-adres dat je in de vorige stap hebt gevonden. De 16 en 2 definiëren het aantal kolommen en rijen van je display. Werk het adres bij als je scanner een ander adres heeft gevonden (bijv. 0x27).

De code gebruikt een aangepaste functie, getTemp(), om de temperatuur te lezen en om te zetten naar verschillende eenheden. Dit is een krachtige functie die de code herbruikbaar maakt voor verschillende toepassingen.

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

Om deze functie te gebruiken, roep je deze aan met een enkel karakterargument dat de gewenste eenheid vertegenwoordigt. Bijvoorbeeld, getTemp('C') retourneert de temperatuur in Celsius, getTemp('F') retourneert deze in Fahrenheit, en getTemp('K') retourneert deze in Kelvin. De functie leest de ruwe temperatuur van de DHT11-sensor en past de benodigde conversieformule toe. Hiermee kun je eenvoudig de weergegeven eenheid in de hoofd-loop() wijzigen zonder de sensorleeslogica te herschrijven. De hoofdloop print de temperatuur en luchtvochtigheid naar de LCD met behulp van de functies lcd.setCursor() en lcd.print() om te bepalen waar op het scherm de waarden verschijnen.

Het graadsymbool weergeven

De standaard HD44780 LCD-tekenset bevat geen speciaal graadsymbool (°). Om dit weer te geven, moet je de functie lcd.write() gebruiken met de decimale waarde van het teken uit het ROM van de LCD. Voor het graadsymbool is deze waarde 223. De code demonstreert dit door lcd.print((char)223); te gebruiken om het symbool na de temperatuurwaarde te printen. (in video op 30:16)

Live projectdemonstratie

Zodra de code is geüpload, toont het display een opstartbericht voordat het wordt gewist en de huidige temperatuur en luchtvochtigheid worden weergegeven. De eerste regel van het display toont de tekst "LCD1602 DHT11", terwijl de tweede regel de temperatuur in Celsius toont, gevolgd door het graadsymbool en "C", en daarna de temperatuur in Fahrenheit, gevolgd door het graadsymbool en "F". De luchtvochtigheidswaarde wordt naar de seriële monitor geprint. De demonstratie in de video toont het display dat elke halve seconde wordt bijgewerkt terwijl de sensor wordt vastgehouden, en dat nauwkeurig de omgevingsomstandigheden weergeeft. (in video op 29:42)

Het weergeven van de spanning van een potentiometer op de LCD wordt behandeld in Les 20/31: Spanning weergeven op LCD1602.

Het gebruik van dezelfde LCD om afstand van een ultrasone sensor weer te geven wordt behandeld in Les 20/31: LCD1602 gebruiken met Arduino om temperatuur, spanning en afstand weer te geven | Robojax.

Gerelateerde projecten uit deze video

Hoofdstukken

  • [00:00] Inleiding tot de LCD1602 en projectoverzicht
  • [01:30] Uitleg over LCD1602-hardware en I2C-module
  • [02:47] Het LCD-contrast aanpassen
  • [03:14] LCD-pinconfiguratie en I2C-adresconfiguratie
  • [05:28] Bedradingsschema voor de LCD1602
  • [06:16] De LiquidCrystal_I2C-bibliotheek installeren
  • [08:11] Het I2C-adres vinden met een scanner
  • [09:28] Basiscode om tekst op de LCD te printen
  • [11:10] Voorbeelden: knipperende cursor en aangepaste tekens
  • [13:46] Aangepaste tekens maken en gebruiken
  • [18:51] Seriële weergavevoorbeeld
  • [23:16] Scrollende tekst op de LCD
  • [24:36] DHT11-sensorcode combineren met de LCD
  • [30:16] Het graadsymbool weergeven
  • [32:03] Decimale punten van temperatuur verwijderen
  • [33:00] Spanning van een potentiometer op de LCD weergeven
  • [35:56] Afstand van een ultrasone sensor weergeven

Afbeeldingen

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

Hulpmiddelen en referenties

Bestanden📁

Arduino-bibliotheken (zip)

Gebruikershandleiding