Пребарување код

Лекција 20/31: Прикажување температура и влажност од DHT11 на LCD екран

Лекција 20/31: Прикажување температура и влажност од DHT11 на LCD екран

Овој туторијал покажува како да се комбинира DHT11 сензор за температура и влажност со LCD1602 дисплеј со I2C поддршка за да се создаде компактна станица за следење на околината. Наместо да читате сурови податоци од сензорот од серискиот монитор, ќе научите да прикажувате живи отчитувања на температурата и влажноста на екран од 16x2 карактери. Овој проект е идеален за изградба на десктоп временска станица, мал монитор за стаклена градина или додавање на локален дисплеј на било кој проект за домашна автоматизација. I2C интерфејсот ја поедноставува жичаната врска, што го прави овој проект достапен за почетници и брз додаток за искусни творци.

LCD_sunFounder

Еве неколку практични идеи за тоа што можете да изградите со ова знаење:

  • Десктоп временска станица што ги прикажува моменталните услови во просторијата.
  • Компактен дисплеј за терариум со влекачи или растенија.
  • Локален дисплеј за серверска просторија или работна средина.
  • Основен модул за покомплексен систем за домашна автоматизација.

Хардвер и компоненти

За да го изградите овој проект, ќе ви требаат следниве компоненти:

  • Arduino Uno (или компатибилна плоча)
  • LCD1602 дисплеј со I2C интерфејс модул
  • DHT11 сензор за температура и влажност
  • Отпорник од 4.7kΩ или 10kΩ за повлекување (ако користите гол DHT11 сензор)
  • Жици за поврзување
  • Прототипна плоча (опционално, за полесно поврзување)

Разбирање на I2C LCD1602

LCD1602 е вообичаен дисплеј за карактери со 16 колони и 2 реда. „I2C“ модулот заварен на задниот дел на дисплејот е клучот за неговата едноставност. Овој модул го претвора паралелниот интерфејс на LCD-то во сериски I2C интерфејс, кој бара само две жици за податоци (SDA и SCL) и две за напојување (VCC и GND). Ова драстично го намалува бројот на пинови потребни на вашиот Arduino, оставајќи повеќе достапни за други сензори и актуатори. Модулот исто така вклучува мал потенциометар за прилагодување на контрастот на дисплејот, што е клучно за да се обезбеди видливост на текстот. I2C адресата на модулот може да се промени со помош на малите лемени мостови (A0, A1, A2) на плочата, овозможувајќи повеќе I2C уреди да коегзистираат на истата магистрала.

Водич за жичано поврзување

LCD1602_wiring_DHT11_nopcb_bb

Поврзете ги компонентите како што е прикажано на дијаграмот подолу. I2C LCD-то ги користи I2C пиновите на Arduino, додека DHT11 сензорот користи дигитален пин.

За LCD1602-I2C:

  • VCC на Arduino 5V
  • GND на Arduino GND
  • SDA на Arduino A4
  • SCL на Arduino A5

За DHT11 сензорот:

  • VCC (Пин 1) на Arduino 5V
  • Податоци (Пин 2) на Arduino Дигитален пин 2 (со отпорник од 10kΩ за повлекување до 5V)
  • NC (Пин 3) - Не е поврзан
  • GND (Пин 4) на Arduino GND

(во видеото на 25:16)

Поставување на библиотеките

Овој проект бара две библиотеки. Библиотеката Wire.h е дел од стандардната инсталација на Arduino. Ќе треба да ја инсталирате библиотеката LiquidCrystal_I2C и библиотеката dht11. Видеото демонстрира како да ги инсталирате. Можете да ги преземете библиотеките од линковите дадени во описот на видеото или од веб-страницата на Robojax. Откако ќе ги преземете, можете да ги инсталирате преку Arduino IDE со навигација до Sketch > Include Library > Add .ZIP Library... и избирање на преземените датотеки. (во видеото на 06:16)

Пронаоѓање на I2C адресата на вашиот LCD

Пред да можете да го користите дисплејот, мора да ја одредите неговата I2C адреса. Најчестата адреса е 0x27 или 0x3F, но може да варира. За да ја најдете, можете да користите I2C скенер скица. Ова е едноставна програма што ја скенира I2C магистралата и ги пријавува сите пронајдени адреси на Серискиот монитор. Поставете го кодот за скенер, отворете го Серискиот монитор на 9600 бауди и тој ќе ја прикаже адресата на вашиот LCD. (во видеото на 08:11)

Објаснување на кодот

Овој дел ги објаснува клучните, кориснички конфигурирани делови од кодот. Целосната програма е достапна за преземање подолу во статијата.

Кодот започнува со вклучување на потребните библиотеки и дефинирање на пиновите и објектите што се користат.

// датотека со заглавие од GetHub: https://github.com/adidax/dht11
#include <dht11.h>
dht11 DHT11; // креирај објект од DHT11
#define dhtpin 2 // постави го пинот за поврзување со DHT11

// почеток на поставки за LCD1602-I2C
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Постави ја LCD адресата на 0x3F за дисплеј со 16 карактери и 2 реда
LiquidCrystal_I2C lcd(0x3F, 16, 2);
// крај на поставки за LCD1602-I2C

Овие се најважните линии за конфигурирање за вашата поставка:

  • #define dhtpin 2: Ова го дефинира пинот на Arduino поврзан со пин за податоци на DHT11 сензорот. Променете го бројот 2 ако користите различен пин.
  • LiquidCrystal_I2C lcd(0x3F, 16, 2);: Оваа линија го креира LCD објектот. Првиот параметар, 0x3F, е I2C адресата што ја најдовте во претходниот чекор. 16 и 2 го дефинираат бројот на колони и редови на вашиот дисплеј. Ажурирајте ја адресата ако вашиот скенер најде различна (на пр., 0x27).

Кодот користи сопствена функција, getTemp(), за да ја прочита температурата и да ја претвори во различни единици. Ова е моќна функција што го прави кодот повторно употреблив за различни апликации.

float getTemp(char type) {
    float temp = (float)DHT11.temperature;//земи температура
  if(type =='F')
  {
    return temp * 1.8 + 32;// претвори во Фаренхајт
  }else if(type =='K')
  {
    return temp + 274.15;// претвори во Келвин
  }else{
   return temp; 
  }  
}

За да ја користите оваа функција, ја повикувате со еден знаковен аргумент што ја претставува саканата единица. На пример, getTemp('C') ја враќа температурата во Целзиусови степени, getTemp('F') ја враќа во Фаренхајтови, а getTemp('K') ја враќа во Келвинови. Функцијата ја чита сировата температура од сензорот DHT11 и ја применува потребната формула за конверзија. Ова ви овозможува лесно да ја промените прикажаната единица во главната loop() без да го препишувате логиката за читање на сензорот. Главната јамка ја печати температурата и влажноста на LCD-екранот користејќи ги функциите lcd.setCursor() и lcd.print() за да контролира каде на екранот се појавуваат вредностите.

Прикажување на симболот за степени

Стандардниот сет на знаци на HD44780 LCD-екранот не вклучува посветен симбол за степени (°). За да го прикажете, мора да ја користите функцијата lcd.write() со децималната вредност на знакот од ROM-от на LCD-екранот. За симболот за степени, оваа вредност е 223. Кодот го демонстрира ова со користење на lcd.print((char)223); за да го испечати симболот по вредноста на температурата. (во видеото на 30:16)

Демонстрација на проектот во живо

Откако кодот ќе се постави, екранот ќе прикаже порака за стартување пред да се исчисти и да ја прикаже моменталната температура и влажност. Првата линија на екранот го прикажува текстот „LCD1602 DHT11", додека втората линија ја прикажува температурата во Целзиусови степени, проследена со симболот за степени и „C", а потоа температурата во Фаренхајтови, проследена со симболот за степени и „F". Вредноста на влажноста се печати на серискиот монитор. Демонстрацијата во видеото покажува како екранот се ажурира на секоја половина секунда додека сензорот се држи, точно одразувајќи ги амбиенталните услови. (во видеото на 29:42)

Прикажувањето на напонот од потенциометар на LCD-екранот е покриено во Лекција 20/31: Прикажување напон на LCD1602.

Користењето на истиот LCD за прикажување растојание од ултразвучен сензор е покриено во Лекција 20/31: Користење LCD1602 со Arduino за прикажување температура, напон и растојание | Robojax.

Поврзани проекти од ова видео

Поглавја

  • [00:00] Вовед во LCD1602 и преглед на проектот
  • [01:30] Објаснување на LCD1602 хардверот и I2C модулот
  • [02:47] Прилагодување на контрастот на LCD-екранот
  • [03:14] LCD пин-аут и конфигурација на I2C адресата
  • [05:28] Дијаграм за поврзување на LCD1602
  • [06:16] Инсталирање на LiquidCrystal_I2C библиотеката
  • [08:11] Наоѓање на I2C адресата со скенер
  • [09:28] Основен код за печатење текст на LCD-екранот
  • [11:10] Примери: трепкачки курсор и сопствени знаци
  • [13:46] Креирање и користење сопствени знаци
  • [18:51] Пример за сериски приказ
  • [23:16] Скролување текст на LCD-екранот
  • [24:36] Комбинирање на кодот од сензорот DHT11 со LCD-екранот
  • [30:16] Прикажување на симболот за степени
  • [32:03] Отстранување децимални точки од температурата
  • [33:00] Прикажување напон од потенциометар на LCD-екранот
  • [35:56] Прикажување растојание од ултразвучен сензор

Слики

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
Јазик: 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; 
  }
  
}

Ресурси и референци

Датотеки📁

Arduino библиотеки (zip)

Упатство за корисникот