كود البحث

الدرس 20/31: عرض درجة الحرارة والرطوبة من DHT11 على شاشة LCD

الدرس 20/31: عرض درجة الحرارة والرطوبة من DHT11 على شاشة LCD

يشرح هذا البرنامج التعليمي كيفية دمج مستشعر درجة الحرارة والرطوبة DHT11 مع شاشة LCD1602 التي تدعم I2C لإنشاء محطة مراقبة بيئية مدمجة. بدلاً من قراءة بيانات المستشعر الخام من الشاشة التسلسلية، ستتعلم عرض قراءات درجة الحرارة والرطوبة الحية على شاشة أحرف 16x2. هذا المشروع مثالي لبناء محطة طقس مكتبية، أو مراقب دفيئة صغير، أو إضافة قراءة محلية لأي مشروع أتمتة منزلية. تعمل واجهة I2C على تبسيط التوصيلات، مما يجعل هذا المشروع سهل الوصول للمبتدئين وإضافة سريعة للصنّاع ذوي الخبرة.

LCD_sunFounder

إليك بعض الأفكار العملية لما يمكنك بناؤه بهذه المعرفة:

  • محطة طقس مكتبية تعرض ظروف الغرفة الحالية.
  • شاشة مدمجة لتررم الزواحف أو النباتات.
  • قراءة محلية لبيئة غرفة الخوادم أو ورشة العمل.
  • وحدة أساسية لنظام أتمتة منزلية أكثر تعقيدًا.

المكونات والأجهزة

لبناء هذا المشروع، ستحتاج إلى المكونات التالية:

  • Arduino Uno (أو لوحة متوافقة)
  • شاشة LCD1602 مع وحدة واجهة I2C
  • مستشعر درجة الحرارة والرطوبة DHT11
  • مقاوم سحب 4.7kΩ أو 10kΩ (إذا كنت تستخدم مستشعر DHT11 مكشوف)
  • أسلاك توصيل
  • لوحة تجارب (اختيارية، لتسهيل التوصيلات)

فهم شاشة LCD1602 مع I2C

شاشة LCD1602 هي شاشة أحرف شائعة تحتوي على 16 عمودًا وصفين. وحدة "I2C" الملحومة على الجزء الخلفي من الشاشة هي مفتاح البساطة. تحول هذه الوحدة الواجهة المتوازية للشاشة إلى واجهة I2C تسلسلية، والتي تتطلب سلكين فقط للبيانات (SDA وSCL) وسلكين للطاقة (VCC وGND). هذا يقلل بشكل كبير من عدد الدبابيس المطلوبة على لوحة Arduino، مما يترك المزيد متاحًا لأجهزة الاستشعار والمحركات الأخرى. تتضمن الوحدة أيضًا مقياس جهد صغير لضبط تباين الشاشة، وهو أمر بالغ الأهمية لضمان وضوح النص. يمكن تغيير عنوان I2C للوحدة باستخدام وصلات اللحام الصغيرة (A0 وA1 وA2) على اللوحة، مما يسمح لأجهزة I2C متعددة بالعمل معًا على نفس الناقل.

دليل التوصيلات

LCD1602_wiring_DHT11_nopcb_bb

قم بتوصيل المكونات كما هو موضح في الرسم البياني أدناه. تستخدم شاشة LCD مع I2C دبابيس I2C الخاصة بـ Arduino، بينما يستخدم مستشعر DHT11 دبوسًا رقميًا.

بالنسبة لشاشة LCD1602-I2C:

  • VCC إلى Arduino 5V
  • GND إلى Arduino GND
  • SDA إلى Arduino A4
  • SCL إلى Arduino A5

بالنسبة لمستشعر DHT11:

  • VCC (الطرف 1) إلى Arduino 5V
  • Data (الطرف 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 لشاشتك

قبل أن تتمكن من استخدام الشاشة، يجب تحديد عنوان I2C الخاص بها. العنوان الأكثر شيوعًا هو 0x27 أو 0x3F، لكنه قد يختلف. للعثور عليه، يمكنك استخدام رسم ماسح I2C. هذا برنامج بسيط يفحص ناقل I2C ويبلغ عن أي عناوين يجدها إلى الشاشة التسلسلية. ارفع رمز الماسح، وافتح الشاشة التسلسلية بمعدل 9600 باود، وسيعرض عنوان شاشتك. (في الفيديو عند 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 حرفًا وسطرين
LiquidCrystal_I2C lcd(0x3F, 16, 2);
// نهاية إعدادات LCD1602-I2C

هذه هي أهم الأسطر لتكوين إعداداتك:

  • #define dhtpin 2: يحدد هذا الدبوس المتصل بمنفذ بيانات مستشعر DHT11. غيّر الرقم 2 إذا كنت تستخدم دبوسًا مختلفًا.
  • LiquidCrystal_I2C lcd(0x3F, 16, 2);: ينشئ هذا السطر كائن الشاشة. المعامل الأول، 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 الخاصة بالشاشة. بالنسبة لرمز الدرجة، هذه القيمة هي 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; 
  }
  
}

الأشياء التي قد تحتاجها

ملفات📁

مكتبات أردوينو (ملف مضغوط)

دليل المستخدم