Soek Kode

Les 20/31: Vertoon van temperatuur en humiditeit vanaf DHT11 op LCD-skerm

Les 20/31: Vertoon van temperatuur en humiditeit vanaf DHT11 op LCD-skerm

Hierdie tutoriaal demonstreer hoe om 'n DHT11-temperatuur- en humiditeitsensor met 'n I2C-geaktiveerde LCD1602-skerm te kombineer om 'n kompakte omgewingsmoniteringstasie te skep. In plaas van om rou sensordata van die reeksmonitor te lees, sal jy leer om lewendige temperatuur- en humiditeitslesings op 'n 16x2-karakter-skerm te vertoon. Hierdie projek is ideaal vir die bou van 'n lessenaarweerstasie, 'n klein kweekhuis-monitor, of om 'n plaaslike uitlees by enige tuisoutomatiseringsprojek te voeg. Die I2C-koppelvlak vereenvoudig bedrading, wat dit 'n toeganklike projek vir beginners maak en 'n vinnige toevoeging vir ervare makers.

LCD_sunFounder

Hier is 'n paar praktiese idees vir wat jy met hierdie kennis kan bou:

  • 'n Lessenaarweerstasie wat huidige kamertoestande wys.
  • 'n Kompakte skerm vir 'n reptiel- of plantterrarium.
  • 'n Plaaslike uitlees vir 'n bedienerkamer of werkswinkelomgewing.
  • 'n Basismodule vir 'n meer komplekse tuisoutomatiseringstelsel.

Hardeware en Komponente

Om hierdie projek te bou, sal jy die volgende komponente benodig:

  • Arduino Uno (of versoenbare bord)
  • LCD1602-skerm met 'n I2C-koppelvlakmodule
  • DHT11-temperatuur- en humiditeitsensor
  • 'n 4.7kΩ of 10kΩ optrekweerstand (as jy 'n kaal DHT11-sensor gebruik)
  • Springdrade
  • Broodbord (opsioneel, vir makliker verbindings)

Verstaan die I2C LCD1602

Die LCD1602 is 'n algemene karakter-skerm met 16 kolomme en 2 rye. Die "I2C"-module wat aan die agterkant van die skerm gesoldeer is, is die sleutel tot sy eenvoud. Hierdie module omskakel die parallelle koppelvlak van die LCD in 'n reeks-I2C-koppelvlak, wat slegs twee drade vir data (SDA en SCL) en twee vir krag (VCC en GND) benodig. Dit verminder drasties die aantal penne wat op jou Arduino benodig word, wat meer beskikbaar laat vir ander sensors en aktueerders. Die module sluit ook 'n klein potensiometer in om die skerm se kontras aan te pas, wat noodsaaklik is om te verseker dat teks sigbaar is. Die I2C-adres van die module kan verander word deur die klein soldeerspringers (A0, A1, A2) op die bord te gebruik, wat veelvuldige I2C-toestelle toelaat om op dieselfde bus te bestaan.

Bedradingsgids

LCD1602_wiring_DHT11_nopcb_bb

Verbind die komponente soos in die diagram hieronder getoon. Die I2C LCD gebruik die Arduino se I2C-penne, terwyl die DHT11-sensor 'n digitale pen gebruik.

Vir die LCD1602-I2C:

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

Vir die DHT11-sensor:

  • VCC (Pen 1) na Arduino 5V
  • Data (Pen 2) na Arduino Digitale Pen 2 (met 'n 10kΩ optrekweerstand na 5V)
  • NC (Pen 3) - Nie Gekoppel nie
  • GND (Pen 4) na Arduino GND

(in video by 25:16)

Opstel van die Biblioteke

Hierdie projek vereis twee biblioteke. Die Wire.h-biblioteek is deel van die standaard Arduino-installasie. Jy sal die LiquidCrystal_I2C-biblioteek en die dht11-biblioteek moet installeer. Die video demonstreer hoe om dit te installeer. Jy kan die biblioteke aflaai van die skakels wat in die videobeskrywing verskaf word of van die Robojax-webwerf. Sodra dit afgelaai is, kan jy dit via die Arduino IDE installeer deur na Sketch > Include Library > Add .ZIP Library... te navigeer en die afgelaaide lêers te kies. (in video by 06:16)

Vind jou LCD se I2C-adres

Voordat jy die skerm kan gebruik, moet jy sy I2C-adres bepaal. Die mees algemene adres is 0x27 of 0x3F, maar dit kan verskil. Om dit te vind, kan jy 'n I2C-skandeerder-skets gebruik. Dit is 'n eenvoudige program wat die I2C-bus skandeer en enige adresse wat dit vind aan die Reeksmonitor rapporteer. Laai die skandeerder-kode op, maak die Reeksmonitor teen 9600 baud oop, en dit sal die adres van jou LCD vertoon. (in video by 08:11)

Kode-verduideliking

Hierdie afdeling verduidelik die sleutel, gebruikerskonfigureerbare dele van die kode. Die volledige program is beskikbaar vir aflaai onder die artikel.

Die kode begin deur die nodige biblioteke in te sluit en die penne en voorwerpe wat gebruik word, te definieer.

// kop-lêer van GetHub: https://github.com/adidax/dht11
#include <dht11.h>
dht11 DHT11; // skep voorwerp van DHT11
#define dhtpin 2 // stel die pen om aan DHT11 te koppel

// begin van instellings vir LCD1602-I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Stel die LCD-adres na 0x3F vir 'n 16 karakters en 2 lyn-skerm
LiquidCrystal_I2C lcd(0x3F, 16, 2);
// einde van instellings vir LCD1602-I2C

Dit is die belangrikste lyne om vir jou opstelling te konfigureer:

  • #define dhtpin 2: Dit definieer die Arduino-pen wat aan die DHT11-sensor se datapen gekoppel is. Verander die nommer 2 as jy 'n ander pen gebruik.
  • LiquidCrystal_I2C lcd(0x3F, 16, 2);: Hierdie lyn skep die LCD-voorwerp. Die eerste parameter, 0x3F, is die I2C-adres wat jy in die vorige stap gevind het. Die 16 en 2 definieer die aantal kolomme en rye van jou skerm. Dateer die adres op as jou skandeerder 'n ander een gevind het (bv. 0x27).

Die kode gebruik 'n pasgemaakte funksie, getTemp(), om die temperatuur te lees en dit na verskillende eenhede om te skakel. Dit is 'n kragtige kenmerk wat die kode herbruikbaar maak vir verskillende toepassings.

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

Om hierdie funksie te gebruik, roep jy dit aan met 'n enkele karakterargument wat die verlangde eenheid voorstel. Byvoorbeeld, getTemp('C') gee die temperatuur in Celsius terug, getTemp('F') gee dit in Fahrenheit terug, en getTemp('K') gee dit in Kelvin terug. Die funksie lees die rou temperatuur van die DHT11-sensor en pas die nodige omskakelingsformule toe. Dit laat jou toe om maklik die vertoonde eenheid in die hoof loop() te verander sonder om die sensorleeslogika te herskryf. Die hooflus druk die temperatuur en humiditeit na die LCD met behulp van die lcd.setCursor() en lcd.print() funksies om te beheer waar op die skerm die waardes verskyn.

Vertoon van die Graadsimbool

Die standaard HD44780 LCD-karakterstel bevat nie 'n toegewyde graadsimbool (°) nie. Om dit te vertoon, moet jy die lcd.write() funksie gebruik met die desimale waarde van die karakter uit die LCD se ROM. Vir die graadsimbool is hierdie waarde 223. Die kode demonstreer dit deur lcd.print((char)223); te gebruik om die simbool na die temperatuurwaarde te druk. (in video by 30:16)

Lewende Projekdemonstrasie

Sodra die kode opgelaai is, sal die vertoning 'n aanvangsboodskap wys voordat dit die huidige temperatuur en humiditeit skoonmaak en vertoon. Die eerste lyn van die vertoning wys die teks "LCD1602 DHT11", terwyl die tweede lyn die temperatuur in Celsius wys, gevolg deur die graadsimbool en "C", en dan die temperatuur in Fahrenheit, gevolg deur die graadsimbool en "F". Die humiditeitwaarde word na die seriële monitor gedruk. Die demonstrasie in die video wys die vertoning wat elke halwe sekonde opdateer terwyl die sensor vasgehou word, wat die omgewingstoestande akkuraat weerspieël. (in video by 29:42)

Die vertoon van die spanning van 'n potensiometer op die LCD word gedek in Les 20/31: Vertoon van spanning op LCD1602.

Die gebruik van dieselfde LCD om afstand van 'n ultrasoniese sensor te vertoon, word gedek in Les 20/31: Gebruik van LCD1602 met Arduino om temperatuur, spanning en afstand te vertoon | Robojax.

Verwante projekte uit hierdie video

Hoofstukke

  • [00:00] Inleiding tot die LCD1602 en projekoorsig
  • [01:30] LCD1602-hardeware en I2C-moduleverduideliking
  • [02:47] Aanpassing van die LCD-kontras
  • [03:14] LCD-pinout en I2C-adreskonfigurasie
  • [05:28] Bedradingsdiagram vir die LCD1602
  • [06:16] Installasie van die LiquidCrystal_I2C-biblioteek
  • [08:11] Vind die I2C-adres met 'n skandeerder
  • [09:28] Basiese kode om teks op die LCD te druk
  • [11:10] Voorbeelde: flikkerende wyser en pasgemaakte karakters
  • [13:46] Skep en gebruik van pasgemaakte karakters
  • [18:51] Seriële vertoonvoorbeeld
  • [23:16] Rolverdeling van teks op die LCD
  • [24:36] Kombineer DHT11-sensorkode met die LCD
  • [30:16] Vertoon van die graadsimbool
  • [32:03] Verwydering van desimale punte van temperatuur
  • [33:00] Vertoon van spanning van 'n potensiometer op die LCD
  • [35:56] Vertoon van afstand van 'n ultrasoniese sensor

Beelde

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

Hulpbronne en verwysings

Lêers📁

Arduino Biblioteke (zip)

Gebruikershandleiding