كود البحث

عرض درجة الحرارة من HTU21D كرسوم بيانية على شاشة LCD

عرض درجة الحرارة من HTU21D كرسوم بيانية على شاشة LCD

في هذا الدرس، سنتعلم كيفية عرض قراءات درجة الحرارة من مستشعر HTU21D لدرجة الحرارة والرطوبة على شاشة LCD في شكل رسم بياني شريطي. ستتضمن القراءات قيمًا بالدرجات المئوية، والفهرنهايت، والكلفن، والرطوبة النسبية، مما يوفر نظرة شاملة على الظروف البيئية. سيساعدك هذا المشروع على فهم كيفية توصيل المكونات بشكل صحيح وتنفيذ الكود اللازم لجعل كل شيء يعمل بسلاسة.

HTU21D module

بالنسبة لأولئك الذين يرغبون في الحصول على دليل بصري، تأكدوا من مشاهدة الفيديو المرتبط بهذا الدرس (في الفيديو عند 00:00).

تفسير الأجهزة

تشمل المكونات الرئيسية لهذا المشروع مستشعر HTU21D وشاشة LCD 1602. يعد HTU21D مستشعرًا رقميًا للرطوبة ودرجة الحرارة يتواصل عبر I2C. يوفر قراءات دقيقة لدرجة الحرارة والرطوبة، والتي يمكن الوصول إليها بسهولة من خلال مكتبته. من ناحية أخرى، تعرض شاشة LCD 1602 القراءات بتنسيق مفهوم للبشر، مما يسمح بتقييمات سريعة للظروف البيئية.

يستخدم HTU21D واجهة I2C بسيطة، مما يجعله سهل الاتصال والتواصل مع الميكروكنترولر مثل الأردوينو. كما يستخدم شاشة LCD 1602 I2C، مما يبسط التوصيل عن طريق تقليل عدد الدبابيس المطلوبة للاتصال بالأردوينو. هذا يسمح بإعداد أنظف مع الحفاظ على توفير مخرجات بصرية واضحة.

تفاصيل ورقة البيانات

الصانعأدا فروت
رقم الجزءHTU21D
جهد المنطق/المدخلات والمخرجات3.3 فولت (تقريباً)
جهد الإمداد1.5 - 3.6 ف
نطاق درجة الحرارة-40 إلى 125 درجة مئوية
نطاق الرطوبة0 إلى 100 %RH
قرار0.01 °م / 0.04 %رطوبة نسبية
اتصالI2C
حزمة4-pin LGA

  • استخدم 3.3 فولت لتشغيل HTU21D؛ الاتصال بـ 5 فولت يمكن أن يتسبب في تلفه.
  • تأكد من استخدام مقاومات سحب صحيحة على خطوط I2C (SDA و SCL).
  • خذ المستشعر بعيدًا عن مصادر الحرارة أثناء الاختبار.
  • تحقق من عنوان I2C الصحيح باستخدام برنامج مسح I2C.
  • تأكد من أن شاشة LCD مُهيأة بشكل صحيح بالعنوان الصحيح.

تعليمات التوصيل

Arduino wiring for HTU21DF light intesity sensor with LCD
Arduino wiring for HTU21DF light intesity sensor with LCD

لربط مستشعر HTU21D وعرض LCD 1602، اتبع هذه الخطوات بعناية:

أولاً، قم بتوصيل مستشعر HTU21D. اتصل بالدبوس الأول (VCC) بدبوس 3.3 فولت على الأردوينو. يجب توصيل الدبوس الثاني (GND) بالأرض (GND) للأردوينو. الدبوس الثالث (SDA) متصل بدبوس A4 على الأردوينو، والدبوس الرابع (SCL) متصل بدبوس A5. تأكد من استخدام الألوان الصحيحة للأسلاك لتوضيح الأمور، حيث تستخدَم الأحمر لـ VCC، والأسود لـ GND، والبرتقالي لـ SDA، والأصفر لـ SCL.

بعد ذلك، بالنسبة لشاشة LCD 1602، قم بتوصيل دبوس VCC بدبوس 5 فولت على الأردوينو ودبوس GND بالأرض. يجب أن يتم توصيل دبوس SDA الخاص بشاشة LCD بنفس دبوس A4 المستخدم لـ HTU21D، ويجب توصيل دبوس SCL بدبوس A5. يتيح هذا الإعداد لكل من المستشعر والشاشة التواصل عبر بروتوكول I2C.

أمثلة الكود وإرشادات الاستخدام

في الكود، الخطوة الأولى هي تضمين المكتبات اللازمة للمستشعر وشاشة العرض. السطر#include أساسي للتواصل I2C، بينما#include "Adafruit_HTU21DF.h"يتم تهيئة مستشعر HTU21D. يقوم السطر التالي بإنشاء مثيل من فئة HTU21D:

Adafruit_HTU21DF htu = Adafruit_HTU21DF();

تقوم هذه السطر بإعداد المستشعر للاستخدام في البرنامج، مما يتيح لنا استدعاء طرقه لاحقًا لقراءة قيم درجة الحرارة والرطوبة.

داخل الـsetup()نقوم بتهيئة المراقب التسلسلي وشاشة LCD. السطور التالية تتحقق مما إذا كان المستشعر يعمل بشكل صحيح:

if (htu.begin()) {
    lcd.print("HTU21DF Bargraph");  
} else {
    lcd.print("missing HTU21DF"); 
    while(1); // Pause forever.
}

إذا فشل المستشعر في التهيئة، سيعرض البرنامج رسالة خطأ ويتوقف عن التنفيذ. هذا أمر حاسم لتصحيح الأخطاء ويضمن أن المستشعر متصل بشكل صحيح.

في الـloop()تتم أخذ قراءات درجة الحرارة وعرضها. الخطfloat T = getHTU('H');يسترجع درجة الحرارة أو الرطوبة بناءً على المعامل الممرر. ثم يتم عرض القيمة المسترجعة على شاشة LCD:

lcd.setCursor (0,1); 
lcd.print(T); // print  
lcd.print((char)223); // prints degree symbol
lcd.print("C"); //

هذا الكود يضع المؤشر في السطر الثاني من شاشة LCD ويطبع قيمة درجة الحرارة مع رمز الدرجة. استخدام(char)223هذه خدعة مفيدة لعرض رمز الدرجة على الشاشة LCD.

عرض / ما يمكن توقعه

بمجرد إعداد كل شيء وتحميل الشيفرة، يجب أن ترى قراءات درجة الحرارة معروضة على شاشة LCD كرسوم بيانية. ستتحدث القراءات باستمرار، مما يعكس درجة الحرارة والرطوبة الحالية. إذا قمت بنفخ هواء ساخن على المستشعر، ستلاحظ ارتفاع درجة الحرارة بسرعة، مما يؤكد أن النظام يعمل كما هو متوقع. كن حذرًا من عكس القطبية أو الأسلاك الخاطئة، حيث يمكن أن تؤدي هذه إلى خلل أو تلف (في الفيديو عند 02:30).

طوابع زمنية للفيديو

  • 00:00- المقدمة
  • 01:30- شرح التوصيلات
  • ٢:٣٠- عرض الشيفرة
  • ٤:٠٠- عرض
  • ٠٥:٣٠- الخاتمة

الصور

Arduino wiring for HTU21DF light intesity sensor with LCD
Arduino wiring for HTU21DF light intesity sensor with LCD
HTU21D module
HTU21D module
HTU21D module-back
HTU21D module-back
214-Arduino code using HTU21D-F Humidity & Temperature on LCD bargraph
اللغة: C++
/* 
 *  Display Temperature from HTU21D(F) on LCD as bargraph
 *  Written and Updated by Ahmad Shamshiri on July 18, 2019
 *  for Robojax in Ajax, Ontario, Canada
  Watch Video tutorial for this code: https://youtu.be/kpGvzNWLHuk

  Must watch: 
  1- Introduction to HTU21DF
  https://youtu.be/Q5y18rgTAhA
  2- LCD1602-I2C video: https://youtu.be/q9YC_GVHy5A
  
 *  Original Sources: 
 *  LCD library: https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
 *  Bargraph library from https://playground.arduino.cc/Code/LcdBarGraph/
 *  
 *  


- (GND) to GND
+ (VDD) to 3.3V

(WARNING: Do not connect + to 5V or the sensor will be damaged!)

*/

#include <Wire.h>
#include "Adafruit_HTU21DF.h"
Adafruit_HTU21DF htu = Adafruit_HTU21DF();

#define maxValue 160 // is the value in celsius or fahrenheit set in line above

// LCD settings
#include <LiquidCrystal_I2C.h>
byte lcdNumCols = 16; // -- number of columns in the LCD
byte lcdLine = 2; // -- number of lines in the LCD

LiquidCrystal_I2C lcd(0x3f,lcdNumCols,lcdLine); //0x3f is address for I2C
                  // to get I2C address, run I2C Scanner. 
                  //Link is provided (in same page as this code) at http://robojax.com/learn/arduino
// bargraph settings
#include <LcdBarGraphRobojax.h>
LcdBarGraphRobojax robojax(&lcd, 16, 0, 0);  // -- creating 16 character long bargraph starting at char 0 of line 0 (see video)



void setup()
{
  Serial.begin(9600);//initialize serial monitor
 // -- initializing the LCD
  lcd.begin();
  lcd.clear();
  lcd.print("Robojax"); 
   
 
  // Initialize the sensor (it is important to get calibration values stored on the device).

  if (htu.begin())
  {
   lcd.setCursor (0,1); //  
    lcd.print("HTU21DF Bargraph");  
  }else {
    lcd.setCursor (0,1); //  
    lcd.print("missing HTU21DF"); 
    while(1); // Pause forever.
  }
  // -- give user some time to read the text above
  delay(2000);
  lcd.clear();  
}// setup

void loop()
{
 // Robojax HTU21DF Bargraph main loop

 robojax.clearLine(1);// clear line 1 to display fresh temperature
 float T = getHTU('H');// get the temperature
 float Tgraph=T;

     if( Tgraph > maxValue){   
        Tgraph =0;
     }
        robojax.drawValue( Tgraph, maxValue);// draw the bargraph     
      // Print out the measurement:
      Serial.print("temperature: ");
      Serial.print(T,2);


      lcd.setCursor (0,1); //
      if(T< maxValue){       
       lcd.print("Temp.:"); 
       //lcd.print("Humi.:"); 
      }else{
       lcd.print("Max.:"); 
      }
      lcd.setCursor (7,1); //
      lcd.print(T); // print  
      lcd.print((char)223);// prints degree symbol
      //lcd.print("%");// prints degree symbol      
      lcd.print("C");//

 
delay(500);
}


/*
 * @brief returns temperature or relative humidity
 * @param "type" is a character
 *     C = Celsius
 *     K = Kelvin
 *     F = Fahrenheit
 *     H = Humidity
 * @return returns one of the values above
 * Usage: to get Fahrenheit, type: getHTU('F')
 * to print it on the serial monitor: Serial.println(getHTU('F'));
 * Written by Ahmad Shamshiri on July 13, 2019
 * in Ajax, Ontario, Canada
 * www.Robojax.com 
 */
float getHTU(char type)
{
  float value;
    float temp = htu.readTemperature();
    float rel_hum = htu.readHumidity();
   if(type =='F')
   {
    value = temp *9/5 + 32;//convert to Fahrenheit 
   }else if(type =='K')
   {
    value = temp + 273.15;//convert to Kelvin
   }else if(type =='H')
   {
    if(rel_hum<0){rel_hum =0;}//prevents it from negative value
    value = rel_hum;//return relative humidity
   }else{
    value = temp;// return Celsius
   }
   return value;
}//

ملفات📁

ورقة البيانات (pdf)