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

نمایش دما از یک HTU21D بر روی LCD

نمایش دما از یک HTU21D بر روی LCD

در این آموزش، ما یاد خواهیم گرفت که چگونه دماهای اندازه‌گیری شده از حساس(حس کننده) دما و رطوبت HTU21D را بر روی یک LCD نمایش دهیم. نتیجه یک راه‌اندازی کاربردی خواهد بود که در آن دما را می‌توان به درجه سلسیوس، فارنهایت و کلوین مشاهده کرد، همراه با رطوبت نسبی که در همان صفحه نمایش داده می‌شود. این پروژه به شما تجربه عملی در ارتباط I2C و مدیریت داده‌های حساس(حس کننده) پایه خواهد داد. برای یک راهنمای بصری دقیق، حتماً ویدیو را تماشا کنید (در ویدیو در 00:00).

HTU21D module

سخت‌افزار توضیح داده شده است

اجزای اصلی این پروژه شامل حساس(حس کننده) HTU21D و نمایشگر LCD است. HTU21D یک حساس(حس کننده) دیجیتال رطوبت و دما است که از طریق پروتکل I2C ارتباط برقرار می‌کند. این حساس(حس کننده) اندازه‌گیری‌های دقیقی از دما به درجه سلسیوس یا فارنهایت و رطوبت نسبی به صورت درصد ارائه می‌دهد. حساس(حس کننده) معمولاً با ولتاژ 3.3V کار می‌کند اما می‌تواند با سیستم‌های 5V نیز کار کند. نمایشگر LCD که ما استفاده خواهیم کرد یک LCD 16x2 با رابط I2C است. این نوع نمایشگر به فقط دو سیم برای ارتباط داده نیاز دارد که اتصال آن را به میکروکنترلرهایی مانند آردوینو آسان‌تر می‌کند. رابط I2C اجازه می‌دهد تا چندین دستگاه در یک باس متصل شوند و این امر باعث ساده‌تر شدن سیم‌کشی و کاهش تعداد پایه‌های استفاده شده می‌شود.

جزئیات برگه اطلاعات

تولیدکنندهادافروت
شماره قطعهHTU21D-F
ولتاژ منطق/ورودی-خروجی۳.۳ ولت (معمولی)
ولتاژ تغذیه۱.۵ ولت تا ۳.۶ ولت
جریان خروجی۰.۵ میلی آمپر (معمولی)
جریان اوج۱.۵ میلی آمپر (حداکثر)
دامنه دما-۴۰ تا ۱۲۵ درجه سانتی‌گراد
دامنه رطوبت۰ تا ۱۰۰ %RH
بستهDFN-6
یادداشت‌ها / واریانت‌هاNone

  • سطح ولتاژ صحیح را فراهم کنید تا از آسیب به حساس(حس کننده) جلوگیری شود.
  • در صورت نیاز از مقاومت‌های Pull-up بر روی خطوط SDA و SCL استفاده کنید.
  • آدرس I2C را با یک اسکنر بررسی کنید تا از پیکربندی صحیح اطمینان حاصل کنید.
  • خروجی حساس(حس کننده) را با احتیاط مدیریت کنید تا از بروز خطا در قرائت جلوگیری شود.
  • حساس(حس کننده) را هنگام انجام اندازه‌گیری‌ها از منابع حرارتی دور نگه دارید.

دستورالعمل‌های سیم‌کشی

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

برای اتصال حساس(حس کننده) HTU21D به آردوینو، پایه VCC حساس(حس کننده) را به خروجی ۳.۳ ولت آردوینو متصل کنید. سپس، پایه GND حساس(حس کننده) را به زمین آردوینو وصل کنید. پایه SDA که برای انتقال داده استفاده می‌شود، باید به پایه A4 آردوینو متصل شود. به همین ترتیب، پایه SCL که برای سیگنال ساعت استفاده می‌شود، به پایه A5 آردوینو متصل کنید. اطمینان حاصل کنید که LCD شما به درستی متصل شده باشد؛ آدرس I2C برای LCD در این تنظیم معمولاً ۰x3F است. اگر از نوع دیگری از LCD یا آدرس I2C متفاوتی استفاده می‌کنید، مطمئن شوید که شِفر (کود) را به طور متناسب تنظیم کنید. پس از سیم‌کشی، حتماً بررسی کنید که اتصالات شل نباشند قبل از روشن کردن آردوینو.

نمونه‌های شِفر (کود) و راهنمایی

در شِفر (کود)، با وارد کردن کتابخانه‌های ضروری برای حساس(حس کننده) HTU21D و LCD شروع می‌کنیم:

#include 
#include "Adafruit_HTU21DF.h"
#include 

این محیط را برای استفاده از حساس(حس کننده) و نمایشگر فراهم می‌کند. کتابخانه `Adafruit_HTU21DF` عملکرد حساس(حس کننده) را مدیریت می‌کند، در حالی که کتابخانه `LiquidCrystal_I2C` نمایشگر LCD را کنترل می‌کند. در مرحله بعد، ما یک نمونه برای هر دو حساس(حس کننده) و LCD ایجاد می‌کنیم:

Adafruit_HTU21DF htu = Adafruit_HTU21DF();
LiquidCrystal_I2C lcd(0x3F, 16, 2);

اینجا،htuشیء مربوط به حساس(حس کننده) HTU21D است وlcdشیء برای نمایشگر LCD است. آدرس I2C برای LCD به 0x3F تنظیم شده است که ممکن است نیاز به تأیید آن بر اساس پیکربندی شما داشته باشید.setup()تابع، ما LCD را راه‌اندازی کرده و بررسی می‌کنیم که آیا حساس(حس کننده) عملیاتی است:

void setup() {
  lcd.begin();  
  lcd.backlight();
  if (!htu.begin()) {
      lcd.print("Sensor missing"); 
      while (1);
  }
  lcd.print("HTU21D Ready");
}

این شِفر (کود) LCD را راه‌اندازی می‌کند و وجود حساس(حس کننده) را بررسی می‌کند. اگر حساس(حس کننده) شناسایی نشود، عبارت "حساس(حس کننده) یافت نشد" نمایش داده شده و برنامه متوقف می‌شود.loop()در این تابع، به طور مداوم مقادیر دما و رطوبت را می‌خوانیم و آن‌ها را نمایش می‌دهیم:

void loop() {
   lcd.clear();
   lcdDisplay(0, 0, "Celsius: ", 10, 0, getHTU('C'), 'd');  
   lcdDisplay(0, 1, "Humidity: ", 10, 1, getHTU('H'), '%');  
   delay(5000);
}

در این بخش، ما ال‌سی‌دی را پاک می‌کنیم، سپس فراخوانی می‌کنیمlcdDisplay()عملکردی برای نمایش دما به درجه سلسیوس و رطوبت.getHTU()تابعی دما یا رطوبت را بر اساس خصیصه وارد شده برمی‌گرداند.

نمایش / چه انتظاری باید داشته باشید

هنگامی که تنظیمات کامل شد و شِفر (کود) به آردوینو بارگذاری شد، LCD باید دمای جاری را به درجه سانتی‌گراد و رطوبت نسبی نمایش دهد. اگر همه‌چیز به درستی متصل شده باشد، مقادیر هر چند ثانیه یک‌بار به‌روز می‌شوند. مراقب مشکلات رایج باشید، مانند اتصالات معکوس یا آدرس‌های نادرست I2C، که می‌تواند به نقص‌های ارتباطی حساس(حس کننده) منجر شود (در ویدیو در 05:00).

برچسب‌های زمانی ویدئو

  • ۰۰:۰۰- مقدمه
  • ۰۱:۳۰- دستورالعمل‌های سیم‌کشی
  • ۰۳:۱۵- توضیح شِفر (کود)
  • ۰۴:۵۰- نمایش
  • ۰۵:۴۰- نتیجه گیری

تصاویر

LCD1602 یا LCD2004 با حساس(حس کننده) رطوبت و دما HTU21DF با آردوینو
LCD1602 یا LCD2004 با حساس(حس کننده) رطوبت و دما HTU21DF با آردوینو
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
213-Display Temperature from HTU21DF on LCD1602-I2C or LCD2004
زبان: C++
/*
 * نمایش دما از HTU21DF روی LCD1602-I2C یا LCD2004
 * به‌روزرسانی شده توسط احمد شمشیری در ۱۳ جولای ۲۰۱۹
 * در آژاکس، انتاریو، کانادا
 * دستورالعمل‌های ویدیویی این طرح را تماشا کنید:
 * 
 * این یک مثال برای سنسور رطوبت و دمای HTU21D-F است
 * 
 * به‌طور خاص برای کار با سنسور HTU21D-F از Adafruit طراحی شده است.
 * ----> https://www.adafruit.com/products/1899
 * 
 * این نمایشگرها از I2C برای ارتباط استفاده می‌کنند؛ برای اتصال به ۲ پین نیاز است
 * 
 * ویدیوی معرفی سروو موتور ۳۶۰ درجه به همراه کد را تماشا کنید: https://youtu.be/b_xvu6wWafA
 * شما می‌توانید نمودار سیم‌کشی را از دوره آردوینو من در Udemy.com دریافت کنید.
 * آردوینو را گام به گام با تمام کتابخانه‌ها، کدها، نمودارهای سیم‌کشی، همه در یک مکان یاد بگیرید.
 * همین حالا از دوره من دیدن کنید http://robojax.com/L/?id=62
 * 
 * اگر این آموزش برای شما مفید بود، لطفاً از من حمایت کنید تا بتوانم به تولید محتوایی مانند این ادامه دهم.
 * 
 * یا با استفاده از PayPal کمک مالی کنید http://robojax.com/L/?id=64
 * 
 * کد در http://robojax.com/learn/arduino موجود است.
 * 
 * این کد "به همین شکل" و بدون ضمانت یا مسئولیت است. تا زمانی که این یادداشت را دست نخورده نگه دارید، استفاده از آن رایگان است. این کد از Robojax.com دانلود شده است.
 * 
 * این برنامه یک نرم‌افزار آزاد است: شما می‌توانید آن را تحت شرایط مجوز عمومی گنو که توسط بنیاد نرم‌افزار آزاد منتشر شده است، چه نسخه ۳ مجوز و چه (به انتخاب شما) هر نسخه بعدی، مجدداً توزیع و/یا اصلاح کنید.
 * 
 * این برنامه به امید مفید بودن توزیع شده است، اما بدون هیچ گونه ضمانتی؛ حتی بدون ضمانت ضمنی «قابلیت فروش یا مناسب بودن برای یک هدف خاص». برای جزئیات بیشتر به «مجوز عمومی گنو» مراجعه کنید.
 * 
 * شما باید یک نسخه از مجوز عمومی گنو را همراه با این برنامه دریافت کرده باشید. در غیر این صورت، به <https://www.gnu.org/licenses/> مراجعه کنید.
 */
#include <Wire.h>
#include "Adafruit_HTU21DF.h"

 // Connect Vin to 3-5VDC
 // Connect GND to ground
 // Connect SCL to I2C clock pin (A5 on UNO)
 // Connect SDA to I2C data pin (A4 on UNO)

Adafruit_HTU21DF htu = Adafruit_HTU21DF();

 // start of settings for LCD1602 with I2C
#include <LiquidCrystal_I2C.h>
 // Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x3F, 16, 2);
 // end of settings for LCD1602 with I2C

void setup() {
  lcd.begin();
  lcd.backlight();
  if (!htu.begin()) {
      lcd.print("Robojax HTUD1DF");
      lcd.setCursor(0,1);
      lcd.print("sensor missing");
    while (1);
  }else{
 // initialize the LCD

  lcd.print("Robojax HTUD1DF");
  lcd.setCursor(0,1);
  lcd.print("Demo");
  }
  delay(2000);
}

void loop() {
   lcd.clear(); // clear previous values from screen
lcdDisplay(
 // to print Celsius:
             0, // character 0
             0, // line 0
             "Celsius: ",

 // to print Celsius
             10, // character 10
             0, // line 0
             getHTU('C'),
             'd'
             );

  lcdDisplay(
 // to print Fahrenheit:
             0, // character 0
             1, // line 1
             "Fahrenheit: ",

 // to print Fahrenheit
             10, // character 9
             1, // line 0
             getHTU('F'),
             'd'
             );
    delay(5000);
lcdDisplay(
 // to print Kelvin:
             0, // character 0
             0, // line 0
             "Kelvin: ",

 // to print Celsius
             9, // character 10
             0, // line 0
             getHTU('K'),
             'k'
             );
  lcdDisplay(
 // to print humidity text
             0, // character 0
             1, // line 1
             "Humidity: ",

 // to print humidity
             10, // character 9
             1, // line 1
             getHTU('H'),
             '%'
             );

        delay(5000);
}

/*
 * @brief returns temperature or relative humidity
 * @param "type" is 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 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')
   {
    value = rel_hum; // return relative humidity
   }else{
    value = temp; // return Celsius
   }
   return value;
}


/*
 * lcdDisplay(int tc, int tr, String title, int vc, int vr, float value)
 * displays value and title on LCD1602
 * How to use:
 * If you want to display: "Voltage: 13.56mV" starting from the first character
 * on the second row.
 * use:
 * lcdDisplay(0, 1, "Voltage: ", 13.56,'d')
 *   
 *   'd' is degree symbol
 * tc  is character number  (0)
 * tr is row in the lcd (1)
 * title is the text (Voltage:)
 * vc value for character 
 * vr value for  row or line
 * value is the value (13.56)
 */
void lcdDisplay(int tc, int tr, String title, int vc, int vr, float value,char symbol)
{
 // Robojax.com LCD1602 for HTU21D Demo
   lcd.setCursor (tc,tr);
   lcd.print(title);

   lcd.setCursor (vc,vr);
   lcd.print(value);
   if(symbol == 'd')
   {
    lcd.print((char)223);
   }else if(symbol =='%')
   {
    lcd.print("%");
   }else if(symbol =='k')
   {
    lcd.print("K");
   }
 // Robojax.com LCD1602 for HTU21D Demo
}

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

منابع و مراجع

فایل‌ها📁

برگه مشخصات (pdf)