Hľadať kód

Lekcia 20/31: Zobrazenie teploty a vlhkosti z DHT11 na LCD obrazovke

Lekcia 20/31: Zobrazenie teploty a vlhkosti z DHT11 na LCD obrazovke

Tento návod ukazuje, ako skombinovať DHT11 teplotný a vlhkostný senzor s I2C LCD1602 displejom a vytvoriť kompaktnú stanicu na monitorovanie prostredia. Namiesto čítania surových údajov zo senzora zo sériového monitora sa naučíte zobrazovať živé hodnoty teploty a vlhkosti na 16x2 znakovom displeji. Tento projekt je ideálny na vytvorenie stolnej meteorologickej stanice, malého monitora pre skleník alebo na pridanie lokálneho displeja do akéhokoľvek projektu domácej automatizácie. Rozhranie I2C zjednodušuje zapojenie, vďaka čomu je tento projekt dostupný pre začiatočníkov a rýchlym doplnkom pre skúsených tvorcov.

LCD_sunFounder

Tu je niekoľko praktických nápadov, čo môžete postaviť s týmito znalosťami:

  • Stolná meteorologická stanica zobrazujúca aktuálne podmienky v miestnosti.
  • Kompaktný displej pre terárium s plazmi alebo rastlinami.
  • Lokálny displej pre serverovňu alebo dielňu.
  • Základný modul pre komplexnejší systém domácej automatizácie.

Hardvér a komponenty

Na vytvorenie tohto projektu budete potrebovať nasledujúce komponenty:

  • Arduino Uno (alebo kompatibilnú dosku)
  • LCD1602 displej s I2C rozhraním modulom
  • DHT11 teplotný a vlhkostný senzor
  • 4,7kΩ alebo 10kΩ pull-up rezistor (ak používate holý DHT11 senzor)
  • Prepojovacie vodiče
  • Nepájivé pole (voliteľné, pre jednoduchšie zapojenie)

Pochopenie I2C LCD1602

LCD1602 je bežný znakový displej so 16 stĺpcami a 2 riadkami. Modul "I2C" prispájkovaný na zadnej strane displeja je kľúčom k jeho jednoduchosti. Tento modul konvertuje paralelné rozhranie LCD na sériové I2C rozhranie, ktoré vyžaduje iba dva vodiče pre dáta (SDA a SCL) a dva pre napájanie (VCC a GND). To výrazne znižuje počet pinov potrebných na vašom Arduino, čím zostáva viac voľných pre iné senzory a akčné členy. Modul tiež obsahuje malý potenciometer na nastavenie kontrastu displeja, čo je kľúčové pre zabezpečenie viditeľnosti textu. I2C adresa modulu sa dá zmeniť pomocou malých spájkovacích prepojok (A0, A1, A2) na doske, čo umožňuje koexistenciu viacerých I2C zariadení na rovnakej zbernici.

Návod na zapojenie

LCD1602_wiring_DHT11_nopcb_bb

Pripojte komponenty podľa schémy nižšie. I2C LCD používa I2C piny Arduina, zatiaľ čo DHT11 senzor používa digitálny pin.

Pre LCD1602-I2C:

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

Pre DHT11 senzor:

  • VCC (Pin 1) na Arduino 5V
  • Data (Pin 2) na Arduino Digitálny pin 2 (s 10kΩ pull-up rezistorom na 5V)
  • NC (Pin 3) - Nepripojené
  • GND (Pin 4) na Arduino GND

(vo videu o 25:16)

Nastavenie knižníc

Tento projekt vyžaduje dve knižnice. Knižnica Wire.h je súčasťou štandardnej inštalácie Arduina. Budete musieť nainštalovať knižnicu LiquidCrystal_I2C a knižnicu dht11. Video ukazuje, ako ich nainštalovať. Knižnice si môžete stiahnuť z odkazov uvedených v popise videa alebo z webovej stránky Robojax. Po stiahnutí ich môžete nainštalovať cez Arduino IDE prechodom do Sketch > Include Library > Add .ZIP Library... a výberom stiahnutých súborov. (vo videu o 06:16)

Zistenie I2C adresy vášho LCD

Pred použitím displeja musíte zistiť jeho I2C adresu. Najbežnejšia adresa je 0x27 alebo 0x3F, ale môže sa líšiť. Na jej zistenie môžete použiť I2C skener. Toto je jednoduchý program, ktorý skenuje I2C zbernicu a hlási všetky nájdené adresy do sériového monitora. Nahrajte kód skenera, otvorte sériový monitor pri 9600 baud a zobrazí adresu vášho LCD. (vo videu o 08:11)

Vysvetlenie kódu

Táto časť vysvetľuje kľúčové, používateľom konfigurovateľné časti kódu. Celý program je k dispozícii na stiahnutie nižšie pod článkom.

Kód začína zahrnutím potrebných knižníc a definovaním pinov a objektov, ktoré sa používajú.

// hlavičkový súbor z GetHub: https://github.com/adidax/dht11
#include <dht11.h>
dht11 DHT11; // vytvorenie objektu DHT11
#define dhtpin 2 // nastavenie pinu na pripojenie DHT11

// začiatok nastavení pre LCD1602-I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Nastavenie adresy LCD na 0x3F pre 16 znakov a 2 riadkový displej
LiquidCrystal_I2C lcd(0x3F, 16, 2);
// koniec nastavení pre LCD1602-I2C

Toto sú najdôležitejšie riadky na konfiguráciu pre vaše zapojenie:

  • #define dhtpin 2: Toto definuje pin Arduina pripojený k dátovému pinu DHT11 senzora. Zmeňte číslo 2, ak používate iný pin.
  • LiquidCrystal_I2C lcd(0x3F, 16, 2);: Tento riadok vytvára LCD objekt. Prvý parameter, 0x3F, je I2C adresa, ktorú ste zistili v predchádzajúcom kroku. 16 a 2 definujú počet stĺpcov a riadkov vášho displeja. Aktualizujte adresu, ak váš skener našiel inú (napr. 0x27).

Kód používa vlastnú funkciu getTemp() na čítanie teploty a jej prevod do rôznych jednotiek. Toto je výkonná funkcia, vďaka ktorej je kód znovupoužiteľný pre rôzne aplikácie.

float getTemp(char type) {
    float temp = (float)DHT11.temperature;//získa teplotu
  if(type =='F')
  {
    return temp * 1.8 + 32;// prevod na Fahrenheita
  }else if(type =='K')
  {
    return temp + 274.15;// prevod na Kelvina
  }else{
   return temp; 
  }  
}

Ak chcete použiť túto funkciu, zavoláte ju s jedným znakovým argumentom predstavujúcim požadovanú jednotku. Napríklad getTemp('C') vráti teplotu v stupňoch Celzia, getTemp('F') ju vráti vo Fahrenheite a getTemp('K') ju vráti v Kelvinoch. Funkcia číta surovú teplotu zo senzora DHT11 a aplikuje potrebný prevodný vzorec. To vám umožní jednoducho zmeniť zobrazenú jednotku v hlavnej slučke loop() bez prepisovania logiky čítania senzora. Hlavná slučka tlačí teplotu a vlhkosť na LCD pomocou funkcií lcd.setCursor() a lcd.print() na ovládanie toho, kde na obrazovke sa hodnoty zobrazia.

Zobrazenie symbolu stupňa

Štandardná znaková sada LCD HD44780 neobsahuje špeciálny symbol stupňa (°). Na jeho zobrazenie musíte použiť funkciu lcd.write() s desatinnou hodnotou znaku z pamäte ROM LCD. Pre symbol stupňa je táto hodnota 223. Kód to demonštruje použitím lcd.print((char)223); na vytlačenie symbolu za hodnotou teploty. (vo videu v čase 30:16)

Živá ukážka projektu

Po nahratí kódu displej zobrazí uvítaciu správu pred vyčistením a zobrazením aktuálnej teploty a vlhkosti. Prvý riadok displeja zobrazuje text "LCD1602 DHT11", zatiaľ čo druhý riadok zobrazuje teplotu v stupňoch Celzia, za ktorou nasleduje symbol stupňa a "C", a potom teplotu vo Fahrenheite, za ktorou nasleduje symbol stupňa a "F". Hodnota vlhkosti sa tlačí do sériového monitora. Ukážka vo videu ukazuje displej aktualizujúci sa každú pol sekundy, keď sa senzor drží, presne odrážajúc podmienky prostredia. (vo videu v čase 29:42)

Zobrazenie napätia z potenciometra na LCD je pokryté v Lekcii 20/31: Zobrazenie napätia na LCD1602.

Použitie rovnakého LCD na zobrazenie vzdialenosti z ultrazvukového senzora je pokryté v Lekcii 20/31: Použitie LCD1602 s Arduino na zobrazenie teploty, napätia a vzdialenosti | Robojax.

Súvisiace projekty z tohto videa

Kapitoly

  • [00:00] Úvod do LCD1602 a prehľad projektu
  • [01:30] Vysvetlenie hardvéru LCD1602 a modulu I2C
  • [02:47] Nastavenie kontrastu LCD
  • [03:14] Pinout LCD a konfigurácia adresy I2C
  • [05:28] Schéma zapojenia pre LCD1602
  • [06:16] Inštalácia knižnice LiquidCrystal_I2C
  • [08:11] Nájdenie adresy I2C pomocou skenera
  • [09:28] Základný kód na tlač textu na LCD
  • [11:10] Príklady: blikajúci kurzor a vlastné znaky
  • [13:46] Vytváranie a používanie vlastných znakov
  • [18:51] Príklad sériového zobrazenia
  • [23:16] Posúvanie textu na LCD
  • [24:36] Kombinácia kódu senzora DHT11 s LCD
  • [30:16] Zobrazenie symbolu stupňa
  • [32:03] Odstránenie desatinných miest z teploty
  • [33:00] Zobrazenie napätia z potenciometra na LCD
  • [35:56] Zobrazenie vzdialenosti z ultrazvukového senzora

Obrázky

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

Zdroje a referencie

Súbory📁

Knižnice Arduino (zip)

Používateľská príručka