Caută cod

Lecția 20/31: Afișarea temperaturii și umidității de la DHT11 pe ecranul LCD

Lecția 20/31: Afișarea temperaturii și umidității de la DHT11 pe ecranul LCD

Acest tutorial demonstrează cum să combini un senzor de temperatură și umiditate DHT11 cu un afișaj LCD1602 compatibil I2C pentru a crea o stație compactă de monitorizare a mediului. În loc să citești datele brute ale senzorului din monitorul serial, vei învăța să afișezi citirile live de temperatură și umiditate pe un ecran cu caractere de 16x2. Acest proiect este ideal pentru a construi o stație meteo de birou, un monitor pentru o seră mică sau pentru a adăuga o citire locală oricărui proiect de automatizare a locuinței. Interfața I2C simplifică cablarea, făcând acest proiect accesibil pentru începători și o adăugare rapidă pentru makerii experimentați.

LCD_sunFounder

Iată câteva idei practice despre ce poți construi cu aceste cunoștințe:

  • O stație meteo de birou care arată condițiile actuale din cameră.
  • Un afișaj compact pentru un terariu cu reptile sau plante.
  • O citire locală pentru o cameră de servere sau un mediu de atelier.
  • Un modul de bază pentru un sistem mai complex de automatizare a locuinței.

Hardware și componente

Pentru a construi acest proiect, vei avea nevoie de următoarele componente:

  • Arduino Uno (sau o placă compatibilă)
  • Afișaj LCD1602 cu modul de interfață I2C
  • Senzor de temperatură și umiditate DHT11
  • Un rezistor de pull-up de 4.7kΩ sau 10kΩ (dacă folosești un senzor DHT11 simplu)
  • Fire de legătură (jumper wires)
  • Breadboard (opțional, pentru conexiuni mai ușoare)

Înțelegerea LCD1602 cu I2C

LCD1602 este un afișaj obișnuit cu caractere, având 16 coloane și 2 rânduri. Modulul "I2C" lipit pe spatele afișajului este cheia simplității sale. Acest modul convertește interfața paralelă a LCD-ului într-o interfață serială I2C, care necesită doar două fire pentru date (SDA și SCL) și două pentru alimentare (VCC și GND). Acest lucru reduce drastic numărul de pini necesari pe Arduino, lăsând mai mulți disponibili pentru alți senzori și actuatoare. Modulul include, de asemenea, un potențiometru mic pentru a regla contrastul afișajului, esențial pentru a te asigura că textul este vizibil. Adresa I2C a modulului poate fi schimbată folosind micile punți de lipit (A0, A1, A2) de pe placă, permițând mai multor dispozitive I2C să coexiste pe același bus.

Ghid de cablare

LCD1602_wiring_DHT11_nopcb_bb

Conectează componentele așa cum se arată în diagrama de mai jos. LCD-ul I2C folosește pinii I2C ai Arduino, în timp ce senzorul DHT11 folosește un pin digital.

Pentru LCD1602-I2C:

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

Pentru senzorul DHT11:

  • VCC (Pin 1) la Arduino 5V
  • Data (Pin 2) la Arduino Pinul digital 2 (cu un rezistor de pull-up de 10kΩ la 5V)
  • NC (Pin 3) - Neconectat
  • GND (Pin 4) la Arduino GND

(în videoclip la 25:16)

Configurarea bibliotecilor

Acest proiect necesită două biblioteci. Biblioteca Wire.h face parte din instalarea standard Arduino. Va trebui să instalezi biblioteca LiquidCrystal_I2C și biblioteca dht11. Videoclipul demonstrează cum să le instalezi. Poți descărca bibliotecile din linkurile furnizate în descrierea videoclipului sau de pe site-ul Robojax. Odată descărcate, le poți instala prin Arduino IDE navigând la Sketch > Include Library > Add .ZIP Library... și selectând fișierele descărcate. (în videoclip la 06:16)

Găsirea adresei I2C a LCD-ului tău

Înainte de a putea folosi afișajul, trebuie să determini adresa sa I2C. Cea mai comună adresă este 0x27 sau 0x3F, dar poate varia. Pentru a o găsi, poți folosi un sketch de scanare I2C. Acesta este un program simplu care scanează bus-ul I2C și raportează orice adrese găsite în Monitorul Serial. Încarcă codul de scanare, deschide Monitorul Serial la 9600 baud, și va afișa adresa LCD-ului tău. (în videoclip la 08:11)

Explicația codului

Această secțiune explică părțile cheie, configurabile de utilizator, ale codului. Programul complet este disponibil pentru descărcare mai jos în articol.

Codul începe prin includerea bibliotecilor necesare și definirea pinilor și obiectelor folosite.

// fișier header de pe GetHub: https://github.com/adidax/dht11
#include <dht11.h>
dht11 DHT11; // creează obiectul DHT11
#define dhtpin 2 // setează pinul pentru conectarea la DHT11

// începutul setărilor pentru LCD1602-I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Setează adresa LCD la 0x3F pentru un afișaj cu 16 caractere și 2 linii
LiquidCrystal_I2C lcd(0x3F, 16, 2);
// sfârșitul setărilor pentru LCD1602-I2C

Acestea sunt cele mai importante linii de configurat pentru configurația ta:

  • #define dhtpin 2: Aceasta definește pinul Arduino conectat la pinul de date al senzorului DHT11. Schimbă numărul 2 dacă folosești un alt pin.
  • LiquidCrystal_I2C lcd(0x3F, 16, 2);: Această linie creează obiectul LCD. Primul parametru, 0x3F, este adresa I2C găsită în pasul anterior. 16 și 2 definesc numărul de coloane și rânduri al afișajului tău. Actualizează adresa dacă scannerul tău a găsit una diferită (de exemplu, 0x27).

Codul folosește o funcție personalizată, getTemp(), pentru a citi temperatura și a o converti în diferite unități. Aceasta este o caracteristică puternică care face codul reutilizabil pentru diferite aplicații.

float getTemp(char type) {
    float temp = (float)DHT11.temperature;//obține temperatura
  if(type =='F')
  {
    return temp * 1.8 + 32;// convertește în Fahrenheit
  }else if(type =='K')
  {
    return temp + 274.15;// convertește în Kelvin
  }else{
   return temp; 
  }  
}

Pentru a utiliza această funcție, o apelezi cu un argument de tip caracter care reprezintă unitatea dorită. De exemplu, getTemp('C') returnează temperatura în grade Celsius, getTemp('F') o returnează în Fahrenheit, iar getTemp('K') o returnează în Kelvin. Funcția citește temperatura brută de la senzorul DHT11 și aplică formula de conversie necesară. Acest lucru îți permite să schimbi ușor unitatea afișată în funcția principală loop() fără să rescrii logica de citire a senzorului. Bucla principală afișează temperatura și umiditatea pe LCD folosind funcțiile lcd.setCursor() și lcd.print() pentru a controla locul unde apar valorile pe ecran.

Afișarea simbolului gradului

Setul standard de caractere al LCD-ului HD44780 nu include un simbol dedicat pentru grade (°). Pentru a-l afișa, trebuie să folosești funcția lcd.write() cu valoarea zecimală a caracterului din ROM-ul LCD-ului. Pentru simbolul gradului, această valoare este 223. Codul demonstrează acest lucru folosind lcd.print((char)223); pentru a afișa simbolul după valoarea temperaturii. (în video la 30:16)

Demonstrație live a proiectului

Odată ce codul este încărcat, afișajul va arăta un mesaj de pornire înainte de a se curăța și de a afișa temperatura și umiditatea curente. Prima linie a afișajului arată textul „LCD1602 DHT11", în timp ce a doua linie arată temperatura în grade Celsius, urmată de simbolul gradului și „C", apoi temperatura în Fahrenheit, urmată de simbolul gradului și „F". Valoarea umidității este afișată pe monitorul serial. Demonstrația din video arată afișajul actualizându-se la fiecare jumătate de secundă în timp ce senzorul este ținut, reflectând cu precizie condițiile ambientale. (în video la 29:42)

Afișarea tensiunii de la un potențiometru pe LCD este acoperită în Lecția 20/31: Afișarea tensiunii pe LCD1602.

Utilizarea aceluiași LCD pentru a afișa distanța de la un senzor ultrasonic este acoperită în Lecția 20/31: Utilizarea LCD1602 cu Arduino pentru afișarea temperaturii, tensiunii și distanței | Robojax.

Proiecte conexe din acest video

Capitole

  • [00:00] Introducere în LCD1602 și prezentarea proiectului
  • [01:30] Explicația hardware-ului LCD1602 și a modulului I2C
  • [02:47] Reglarea contrastului LCD
  • [03:14] Configurarea pinilor LCD și a adresei I2C
  • [05:28] Schema de conexiuni pentru LCD1602
  • [06:16] Instalarea bibliotecii LiquidCrystal_I2C
  • [08:11] Găsirea adresei I2C cu un scaner
  • [09:28] Cod de bază pentru afișarea textului pe LCD
  • [11:10] Exemple: cursor intermitent și caractere personalizate
  • [13:46] Crearea și utilizarea caracterelor personalizate
  • [18:51] Exemplu de afișare serială
  • [23:16] Derularea textului pe LCD
  • [24:36] Combinarea codului senzorului DHT11 cu LCD-ul
  • [30:16] Afișarea simbolului gradului
  • [32:03] Eliminarea punctelor zecimale din temperatură
  • [33:00] Afișarea tensiunii de la un potențiometru pe LCD
  • [35:56] Afișarea distanței de la un senzor ultrasonic

Imagini

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

Resurse și referințe

Fișiere📁

Biblioteci Arduino (zip)

Manualul utilizatorului