شِفر (کود) جستجو

درس ۲۰/۳۱: نمایش دما و رطوبت از DHT11 بر روی صفحه LCD

درس ۲۰/۳۱: نمایش دما و رطوبت از DHT11 بر روی صفحه LCD

این آموزش نحوه ترکیب حساس(حس کننده) دما و رطوبت DHT11 با نمایشگر LCD1602 مجهز به I2C را برای ساخت یک ایستگاه پایش محیطی جمع‌وجور نشان می‌دهد. به جای خواندن داده‌های خام حساس(حس کننده) از نمایشگر مسلسل، یاد می‌گیرید که خوانش‌های زنده دما و رطوبت را روی یک صفحه نمایش ۱۶x۲ کاراکتری نمایش دهید. این پروژه برای ساخت یک ایستگاه هواشناسی رومیزی، یک مانیتور گلخانه کوچک، یا افزودن یک نمایشگر محلی به هر پروژه اتوماسیون خانگی ایده‌آل است. رابط I2C سیم‌کشی را ساده می‌کند و این پروژه را برای مبتدیان قابل دسترس و برای سازندگان باتجربه یک افزودنی سریع می‌سازد.

LCD_sunFounder

در اینجا چند ایده عملی برای آنچه می‌توانید با این دانش بسازید آورده شده است:

  • یک ایستگاه هواشناسی رومیزی که شرایط فعلی اتاق را نشان می‌دهد.
  • یک نمایشگر جمع‌وجور برای تراریوم خزندگان یا گیاهان.
  • یک نمایشگر محلی برای محیط اتاق سرور یا کارگاه.
  • یک ماجیول پایه برای یک سیستم اتوماسیون خانگی پیچیده‌تر.

سخت‌افزار و قطعات

برای ساخت این پروژه، به قطعات زیر نیاز دارید:

  • آردوینو اونو (یا برد سازگار)
  • نمایشگر LCD1602 با ماجیول رابط I2C
  • حساس(حس کننده) دما و رطوبت DHT11
  • یک مقاومت pull-up 4.7kΩ یا 10kΩ (اگر از حساس(حس کننده) DHT11 خام استفاده می‌کنید)
  • سیم‌های جامپر
  • بردبورد (اختیاری، برای اتصالات آسان‌تر)

آشنایی با LCD1602 با I2C

LCD1602 یک نمایشگر کاراکتری رایج با ۱۶ ستون و ۲ ردیف است. ماجیول "I2C" که به پشت نمایشگر لحیم شده است، کلید سادگی آن است. این ماجیول رابط موازی LCD را به یک رابط سریال I2C تبدیل می‌کند که فقط به دو سیم برای داده (SDA و SCL) و دو سیم برای برق (VCC و GND) نیاز دارد. این کار تعداد پایه‌های مورد نیاز روی آردوینو را به شدت کاهش می‌دهد و پایه‌های بیشتری را برای سنسورها و عملگرهای دیگر آزاد می‌کند. این ماجیول همچنین شامل یک پتانسیومتر کوچک برای تنظیم کنتراست نمایشگر است که برای اطمینان از قابل مشاهده بودن متن حیاتی است. آدرس I2C ماجیول را می‌توان با استفاده از جامپرهای لحیم کوچک (A0، A1، A2) روی برد تغییر داد و به چندین دستگاه I2C اجازه می‌دهد روی همان باس همزیستی داشته باشند.

راهنمای سیم‌کشی

LCD1602_wiring_DHT11_nopcb_bb

قطعات را همانطور که در نمودار زیر نشان داده شده است وصل کنید. LCD با I2C از پایه‌های I2C آردوینو استفاده می‌کند، در حالی که حساس(حس کننده) DHT11 از یک پایه دیجیتال استفاده می‌کند.

برای LCD1602-I2C:

  • VCC به آردوینو 5V
  • GND به آردوینو GND
  • SDA به آردوینو A4
  • SCL به آردوینو A5

برای حساس(حس کننده) DHT11:

  • VCC (پایه ۱) به آردوینو 5V
  • Data (پایه ۲) به آردوینو پایه دیجیتال ۲ (با مقاومت pull-up 10kΩ به 5V)
  • NC (پایه ۳) - متصل نیست
  • GND (پایه ۴) به آردوینو GND

(در ویدیو در ۲۵:۱۶)

راه‌اندازی کتابخانه‌ها

این پروژه به دو کتابخانه نیاز دارد. کتابخانه Wire.h بخشی از نصب استاندارد آردوینو است. باید کتابخانه LiquidCrystal_I2C و کتابخانه dht11 را نصب کنید. ویدیو نحوه نصب آن‌ها را نشان می‌دهد. می‌توانید کتابخانه‌ها را از واصل‌های ارائه‌شده در توضیحات ویدیو یا از وب‌سایت Robojax دانلود کنید. پس از دانلود، می‌توانید آن‌ها را از طریق IDE آردوینو با رفتن به Sketch > Include Library > Add .ZIP Library... و انتخاب فایل‌های دانلودشده نصب کنید. (در ویدیو در ۰۶:۱۶)

پیدا کردن آدرس I2C نمایشگر LCD شما

قبل از استفاده از نمایشگر، باید آدرس I2C آن را تعیین کنید. رایج‌ترین آدرس 0x27 یا 0x3F است، اما می‌تواند متفاوت باشد. برای پیدا کردن آن، می‌توانید از یک اسکچ اسکنر I2C استفاده کنید. این یک برنامه ساده است که باس I2C را اسکن می‌کند و هر آدرسی را که پیدا می‌کند به نمایشگر مسلسل گزارش می‌دهد. شِفر (کود) اسکنر را آپلود کنید، نمایشگر مسلسل را با نرخ ۹۶۰۰ باز کنید و آدرس LCD شما را نمایش می‌دهد. (در ویدیو در ۰۸:۱۱)

توضیح شِفر (کود)

این بخش بخش‌های کلیدی و قابل تنظیم توسط کاربر شِفر (کود) را توضیح می‌دهد. برنامه کامل برای دانلود در زیر مقاله موجود است.

شِفر (کود) با شامل کردن کتابخانه‌های لازم و تعریف پایه‌ها و اشیاء استفاده‌شده شروع می‌شود.

// فایل هدر از 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 برای نمایشگر ۱۶ خصیصه و ۲ خط
LiquidCrystal_I2C lcd(0x3F, 16, 2);
// پایان تنظیمات برای LCD1602-I2C

این‌ها مهم‌ترین خطوط برای پیکربندی راه‌اندازی شما هستند:

  • #define dhtpin 2: این پایه آردوینو متصل به پایه داده حساس(حس کننده) 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.setCursor() و lcd.print() روی LCD چاپ می‌کند تا مکان ظاهر شدن مقادیر روی صفحه کنترل شود.

نمایش نماد درجه

مجموعه خصیصه استاندارد LCD HD44780 شامل یک نماد درجه اختصاصی (°) نیست. برای نمایش آن، باید از تابع 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 با آردوینو برای نمایش دما، ولتاژ و فاصله | 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; 
  }
  
}

مواردی که ممکن است به آن‌ها نیاز داشته باشید

فایل‌ها📁

کتابخانه‌های آردوینو (zip)

راهنمای کاربر