Pretraži kod

Lekcija 20/31: Prikaz temperature i vlažnosti sa DHT11 na LCD ekranu

Lekcija 20/31: Prikaz temperature i vlažnosti sa DHT11 na LCD ekranu

Ovaj tutorijal pokazuje kako kombinovati DHT11 senzor temperature i vlažnosti sa I2C LCD1602 displejom kako biste napravili kompaktnu stanicu za praćenje okoline. Umjesto čitanja sirovih podataka sa senzora sa serijskog monitora, naučit ćete prikazivati žive vrijednosti temperature i vlažnosti na 16x2 karaktera ekranu. Ovaj projekat je idealan za izradu desktop meteorološke stanice, malog monitora za staklenik ili dodavanje lokalnog prikaza bilo kojem projektu kućne automatizacije. I2C interfejs pojednostavljuje ožičenje, čineći ovaj projekat pristupačnim za početnike i brzim dodatkom za iskusne majstore.

LCD_sunFounder

Evo nekoliko praktičnih ideja šta možete napraviti s ovim znanjem:

  • Desktop meteorološka stanica koja prikazuje trenutne uslove u prostoriji.
  • Kompaktan displej za terarij za gmizavce ili biljke.
  • Lokalni prikaz za okruženje serverske sobe ili radionice.
  • Osnovni modul za složeniji sistem kućne automatizacije.

Hardver i komponente

Za izradu ovog projekta trebat će vam sljedeće komponente:

  • Arduino Uno (ili kompatibilna ploča)
  • LCD1602 displej sa I2C interfejs modulom
  • DHT11 senzor temperature i vlažnosti
  • Otpornik od 4.7kΩ ili 10kΩ za podizanje napona (ako koristite goli DHT11 senzor)
  • Kratkospojne žice
  • Breadboard (opciono, za lakše povezivanje)

Razumijevanje I2C LCD1602

LCD1602 je uobičajeni displej sa 16 kolona i 2 reda. "I2C" modul zalemljen na poleđini displeja ključ je njegove jednostavnosti. Ovaj modul pretvara paralelni interfejs LCD-a u serijski I2C interfejs, koji zahtijeva samo dvije žice za podatke (SDA i SCL) i dvije za napajanje (VCC i GND). Ovo drastično smanjuje broj pinova potrebnih na vašem Arduinu, ostavljajući više dostupnih za druge senzore i aktuatore. Modul također uključuje mali potenciometar za podešavanje kontrasta displeja, što je ključno za osiguravanje vidljivosti teksta. I2C adresa modula može se promijeniti pomoću malih lemnih mostova (A0, A1, A2) na ploči, omogućavajući da više I2C uređaja koegzistira na istoj magistrali.

Vodič za povezivanje

LCD1602_wiring_DHT11_nopcb_bb

Povežite komponente kao što je prikazano na dijagramu ispod. I2C LCD koristi Arduino I2C pinove, dok DHT11 senzor koristi digitalni pin.

Za LCD1602-I2C:

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

Za DHT11 senzor:

  • VCC (Pin 1) na Arduino 5V
  • Data (Pin 2) na Arduino Digitalni Pin 2 (sa otpornikom od 10kΩ za podizanje napona na 5V)
  • NC (Pin 3) - Nije povezano
  • GND (Pin 4) na Arduino GND

(u videu na 25:16)

Postavljanje biblioteka

Ovaj projekat zahtijeva dvije biblioteke. Wire.h biblioteka je dio standardne Arduino instalacije. Trebat ćete instalirati LiquidCrystal_I2C biblioteku i dht11 biblioteku. Video prikazuje kako ih instalirati. Biblioteke možete preuzeti s linkova navedenih u opisu videa ili sa Robojax web stranice. Nakon preuzimanja, možete ih instalirati putem Arduino IDE-a navigacijom do Sketch > Include Library > Add .ZIP Library... i odabirom preuzetih datoteka. (u videu na 06:16)

Pronalaženje I2C adrese vašeg LCD-a

Prije nego što možete koristiti displej, morate odrediti njegovu I2C adresu. Najčešća adresa je 0x27 ili 0x3F, ali može varirati. Da biste je pronašli, možete koristiti I2C skener skicu. Ovo je jednostavan program koji skenira I2C magistralu i prijavljuje sve pronađene adrese na serijski monitor. Učitajte skener kod, otvorite serijski monitor na 9600 bauda i prikazat će adresu vašeg LCD-a. (u videu na 08:11)

Objašnjenje koda

Ovaj odjeljak objašnjava ključne dijelove koda koje korisnik može konfigurirati. Cijeli program dostupan je za preuzimanje ispod članka.

Kod počinje uključivanjem potrebnih biblioteka i definiranjem pinova i objekata koji se koriste.

// header datoteka sa GetHub: https://github.com/adidax/dht11
#include <dht11.h>
dht11 DHT11; // kreiraj objekt DHT11
#define dhtpin 2 // postavi pin za povezivanje na DHT11

// početak postavki za LCD1602-I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Postavi LCD adresu na 0x3F za displej od 16 karaktera i 2 linije
LiquidCrystal_I2C lcd(0x3F, 16, 2);
// kraj postavki za LCD1602-I2C

Ovo su najvažnije linije za konfiguraciju vašeg postava:

  • #define dhtpin 2: Ovo definira Arduino pin povezan s data pinom DHT11 senzora. Promijenite broj 2 ako koristite drugi pin.
  • LiquidCrystal_I2C lcd(0x3F, 16, 2);: Ova linija kreira LCD objekt. Prvi parametar, 0x3F, je I2C adresa koju ste pronašli u prethodnom koraku. 16 i 2 definiraju broj kolona i redova vašeg displeja. Ažurirajte adresu ako je vaš skener pronašao drugu (npr. 0x27).

Kod koristi prilagođenu funkciju, getTemp(), za čitanje temperature i pretvaranje u različite jedinice. Ovo je moćna funkcija koja čini kod ponovno upotrebljivim za različite aplikacije.

float getTemp(char type) {
    float temp = (float)DHT11.temperature;//dohvati temp
  if(type =='F')
  {
    return temp * 1.8 + 32;// pretvori u Fahrenheite
  }else if(type =='K')
  {
    return temp + 274.15;// pretvori u Kelvine
  }else{
   return temp; 
  }  
}

Da biste koristili ovu funkciju, pozivate je s jednim znakovnim argumentom koji predstavlja željenu jedinicu. Na primjer, getTemp('C') vraća temperaturu u Celzijusima, getTemp('F') vraća je u Fahrenheitima, a getTemp('K') vraća je u Kelvinima. Funkcija čita sirovu temperaturu sa senzora DHT11 i primjenjuje potrebnu formulu pretvorbe. Ovo vam omogućava da lako promijenite prikazanu jedinicu u glavnoj loop() petlji bez ponovnog pisanja logike čitanja senzora. Glavna petlja ispisuje temperaturu i vlažnost na LCD pomoću funkcija lcd.setCursor() i lcd.print() kako bi kontrolirala gdje se vrijednosti pojavljuju na ekranu.

Prikazivanje simbola stepena

Standardni HD44780 LCD skup znakova ne uključuje namjenski simbol stepena (°). Da biste ga prikazali, morate koristiti funkciju lcd.write() s decimalnom vrijednošću znaka iz LCD ROM-a. Za simbol stepena, ova vrijednost je 223. Kod to demonstrira koristeći lcd.print((char)223); za ispis simbola nakon vrijednosti temperature. (u videu na 30:16)

Demonstracija uživo projekta

Nakon što se kod prenese, ekran će prikazati poruku pokretanja prije nego što se očisti i prikaže trenutnu temperaturu i vlažnost. Prvi red ekrana prikazuje tekst "LCD1602 DHT11", dok drugi red prikazuje temperaturu u Celzijusima, praćenu simbolom stepena i "C", a zatim temperaturu u Fahrenheitima, praćenu simbolom stepena i "F". Vrijednost vlažnosti ispisuje se na serijski monitor. Demonstracija u videu prikazuje ekran koji se ažurira svake pola sekunde dok se senzor drži, precizno odražavajući uvjete okoline. (u videu na 29:42)

Prikazivanje napona s potenciometra na LCD-u obrađeno je u Lekciji 20/31: Prikazivanje napona na LCD1602.

Korištenje istog LCD-a za prikaz udaljenosti s ultrazvučnog senzora obrađeno je u Lekciji 20/31: Korištenje LCD1602 s Arduinom za prikaz temperature, napona i udaljenosti | Robojax.

Povezani projekti iz ovog videa

Poglavlja

  • [00:00] Uvod u LCD1602 i pregled projekta
  • [01:30] Objašnjenje LCD1602 hardvera i I2C modula
  • [02:47] Podešavanje kontrasta LCD-a
  • [03:14] LCD pinout i konfiguracija I2C adrese
  • [05:28] Dijagram povezivanja za LCD1602
  • [06:16] Instalacija LiquidCrystal_I2C biblioteke
  • [08:11] Pronalaženje I2C adrese sa skenerom
  • [09:28] Osnovni kod za ispis teksta na LCD
  • [11:10] Primjeri: trepćući kursor i prilagođeni znakovi
  • [13:46] Kreiranje i korištenje prilagođenih znakova
  • [18:51] Primjer serijskog prikaza
  • [23:16] Skrolovanje teksta na LCD-u
  • [24:36] Kombiniranje DHT11 senzorskog koda s LCD-om
  • [30:16] Prikazivanje simbola stepena
  • [32:03] Uklanjanje decimalnih tačaka s temperature
  • [33:00] Prikazivanje napona s potenciometra na LCD-u
  • [35:56] Prikazivanje udaljenosti s ultrazvučnog senzora

Slike

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

Resursi i reference

Datoteke📁

Arduino biblioteke (zip)

Korisnički priručnik