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

نمایش دما از یک 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"

 // اتصال Vin به ۳-۵ ولت DC
 // اتصال GND به زمین
 // SCL را به پین کلاک I2C (A5 در UNO) وصل کنید
 // اتصال SDA به پین داده I2C (A4 در UNO)

Adafruit_HTU21DF htu = Adafruit_HTU21DF();

 // شروع تنظیمات LCD1602 با I2C
#include <LiquidCrystal_I2C.h>
 // برای نمایش ۱۶ کاراکتری و ۲ خطی، آدرس LCD را روی ۰x۲۷ تنظیم کنید.
LiquidCrystal_I2C lcd(0x3F, 16, 2);
 // پایان تنظیمات LCD1602 با 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{
 // مقداردهی اولیه LCD

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

void loop() {
   lcd.clear(); // پاک کردن مقادیر قبلی از صفحه
lcdDisplay(
 // برای چاپ درجه سانتیگراد:
             0, // کاراکتر 0
             0, // خط ۰
             "Celsius: ",

 // برای چاپ درجه سانتیگراد
             10, // شخصیت ۱۰
             0, // خط ۰
             getHTU('C'),
             'd'
             );

  lcdDisplay(
 // برای چاپ فارنهایت:
             0, // کاراکتر 0
             1, // خط ۱
             "Fahrenheit: ",

 // برای چاپ فارنهایت
             10, // شخصیت ۹
             1, // خط ۰
             getHTU('F'),
             'd'
             );
    delay(5000);
lcdDisplay(
 // برای چاپ کلوین:
             0, // کاراکتر 0
             0, // خط ۰
             "Kelvin: ",

 // برای چاپ درجه سانتیگراد
             9, // شخصیت ۱۰
             0, // خط ۰
             getHTU('K'),
             'k'
             );
  lcdDisplay(
 // برای چاپ متن رطوبت
             0, // کاراکتر 0
             1, // خط ۱
             "Humidity: ",

 // برای چاپ رطوبت
             10, // شخصیت ۹
             1, // خط ۱
             getHTU('H'),
             '%'
             );

        delay(5000);
}

/*
 * @brief دما یا رطوبت نسبی را برمی‌گرداند
 * @param "type" یک کاراکتر است
 * 
 * C = سانتیگراد
 * K = کلوین
 * F = فارنهایت
 * H = رطوبت
 * @return یکی از مقادیر بالا را برمی‌گرداند
 * 
 * کاربرد: برای دریافت فارنهایت نوع: getHTU('F')
 * 
 * برای چاپ آن روی مانیتور سریال Serial.println(getHTU('F'));
 * 
 * نوشته شده توسط احمد شمشیری در ۱۳ ژوئیه ۲۰۱۹
 * در آژاکس، انتاریو، کانادا
 * 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; // تبدیل به فارنهایت
   }else if(type =='K')
   {
    value = temp + 273.15; // تبدیل به کلوین
   }else if(type =='H')
   {
    value = rel_hum; // رطوبت نسبی برگشتی
   }else{
    value = temp; // بازگشت سانتیگراد
   }
   return value;
}


/*
 * lcdDisplay(int tc, int tr, String title, int vc, int vr, float value)
 * مقدار و عنوان را روی LCD1602 نمایش می‌دهد.
 * نحوه استفاده:
 * اگر می‌خواهید نمایش دهید: "ولتاژ: 13.56 میلی‌ولت" که از اولین کاراکتر روی ردیف دوم شروع می‌شود.
 * استفاده کنید:
 * lcdDisplay(0, 1, "ولتاژ: ", 13.56,'d')
 * 
 * 'd' نماد درجه است
 * tc شماره کاراکتر (0) است
 * tr سطر در LCD است (1)
 * title متن است (ولتاژ:)
 * مقدار vc برای کاراکتر
 * مقدار vr برای سطر یا خط
 * مقدار مقدار (13.56) است.
 */
void lcdDisplay(int tc, int tr, String title, int vc, int vr, float value,char symbol)
{
 // نسخه نمایشی LCD1602 برای HTU21D در Robojax.com
   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");
   }
 // نسخه نمایشی LCD1602 برای HTU21D در Robojax.com
}

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

منابع و مراجع

فایل‌ها📁

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