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

درس ۳۶: استفاده از حساس(حس کننده) دما HTU21D با یک LCD در دوره آموزشی مرحله به مرحله آردوینو

درس ۳۶: استفاده از حساس(حس کننده) دما HTU21D با یک LCD در دوره آموزشی مرحله به مرحله آردوینو

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

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

اجزای اصلی این پروژه حساس(حس کننده) دما و رطوبت HTU21D است که از طریق I2C ارتباط برقرار می‌کند. این حساس(حس کننده) در محدوده ولتاژ ۱.۵ تا ۳.۶ ولت کار می‌کند و بنابراین برای سیستم‌های ۳.۳ ولت و ۵ ولت مناسب است. این حساس(حس کننده) بسیار کم‌مصرف است و معمولاً تنها ۰.۰۲ میکروآمپر در حالت بیکار و ۴۵۰ میکروآمپر در حین اندازه‌گیری مصرف می‌کند. علاوه بر HTU21D، ما از یک نمایشگر LCD نیز استفاده خواهیم کرد، به‌خصوص LCD1602 با I2C. این نمایشگر امکان خروجی آسان داده‌های متنی را فراهم می‌کند و تنها به دو پایه برای ارتباط نیاز دارد: SDA (خط داده) و SCL (خط ساعت). ترکیب این اجزا به ما این امکان را می‌دهد که یک نمایشگر اطلاعاتی برای نظارت بر سطوح دما و رطوبت ایجاد کنیم.

جزئیات دیتا شیت

سازندهتی ای کانکتویتی
شماره قطعهHTU21D-F
ولتاژ منطق/ورودی و خروجی1.5 - 3.6 ولت
ولتاژ تغذیه۳.۳ ولت (معمولی)
جریان خروجی (معمولی)۰.۰۲ میکروآمپر (بی‌بار)، ۴۵۰ میکروآمپر (اندازه‌گیری)
دامنه دما-40 تا +125 درجه سانتی‌گراد
دامنه رطوبت۰ تا ۱۰۰ درصد رطوبت نسبی
وضوح (دما)0.01 درجه سانتی‌گراد
دقت (رطوبت)۰.۰۴ %RH
بستهDFN-6

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

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

برای اتصال حساس(حس کننده) HTU21D و نمایشگر LCD، ابتدا با اتصالات برق شروع کنید. پایه سمت چپ HTU21D را به منبع تغذیه 3.3V وصل کنید و پایه دوم (که معمولاً قرمز است) را به زمین متصل کنید. سپس، پایه SDA حساس(حس کننده) HTU21D را به پایه آنالوگ A4 آردوینو وصل کنید و پایه SCL را به پایه آنالوگ A5 وصل کنید. برای نمایشگر LCD1602، پایه VCC را به همان منبع تغذیه 3.3V وصل کنید و پایه GND را به زمین متصل کنید. پایه SDA روی LCD نیز باید به A4 متصل شود و پایه SCL باید به A5 متصل شود تا هر دو مؤلفه بتوانند از باس I2C استفاده کنند. اطمینان حاصل کنید که تمام اتصالات ایمن هستند تا ارتباط صحیح بین آردوینو، حساس(حس کننده) و نمایشگر تسهیل شود.

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

شِفر (کود) زیر حساس(حس کننده) HTU21D و نمایشگر LCD را راه‌اندازی می‌کند. در تابع راه‌اندازی، LCD برای استفاده آماده می‌شود و حساس(حس کننده) برای اتصال بررسی می‌شود:

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.print("Robojax HTUD1DF");
      lcd.setCursor(0,1);
      lcd.print("Demo"); 
  }
  delay(2000);   
}

این بخش بررسی می‌کند که آیا حساس(حس کننده) به درستی متصل شده است یا خیر. اگر نه، یک پیام خطا روی صفحه LCD نمایش داده می‌شود و برنامه متوقف می‌شود. اگر حساس(حس کننده) به درستی کار کند، یک پیام نمایشی به مدت دو ثانیه نشان داده می‌شود. تابع حلقه جایی است که خواندن و نمایش اصلی انجام می‌شود. در اینجا، ما تابع `lcdDisplay` را برای نمایش دما در واحدهای مختلف فراخوانی می‌کنیم:

void loop() {
   lcd.clear(); // clear previous values from screen
   lcdDisplay(0, 0, "Celsius: ", 10, 0, getHTU('C'), 'd');  
   lcdDisplay(0, 1, "Fahrenheit: ", 10, 1, getHTU('F'), 'd');     
   delay(5000);
}

در این حلقه، صفحه نمایش ال سی دی پاک می‌شود و دما به درجه سلسیوس و فارنهایت نمایش داده می‌شود. تابع `getHTU` با خصیصه 'C' برای سلسیوس و 'F' برای فارنهایت به ترتیب فراخوانی می‌شود. در نهایت، تابع `getHTU` تعریف شده است تا دما یا رطوبت را بر اساس خصیصه ورودی بخواند:

float getHTU(char type) {
   float temp = htu.readTemperature();
   float rel_hum = htu.readHumidity();
   if(type =='F') {
       return temp * 9/5 + 32; // convert to Fahrenheit 
   } else if(type =='K') {
       return temp + 273.15; // convert to Kelvin
   } else if(type =='H') {
       return rel_hum; // return relative humidity
   } else {
       return temp; // return Celsius
   }
}

این تابع دما و رطوبت را از حساس(حس کننده) می‌خواند و دما را به واحد درخواستی تبدیل می‌کند. حتماً شِفر (کود) کامل بارگذاری شده در زیر مقاله را برای جزئیات بیشتر بررسی کنید.

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

پس از اتمام سیم‌کشی و بارگذاری شِفر (کود)، باید مقادیر دما و رطوبت را بر روی LCD مشاهده کنید. خوانش‌ها هر چند ثانیه یک بار به‌روز می‌شوند و شرایط کنونی را منعکس می‌کنند. اگر به حساس(حس کننده) گرما اعمال کنید، باید شاهد افزایش دما باشید در حالی که رطوبت باید کمی کاهش یابد. توجه داشته باشید که حداکثر حد دما برای حساس(حس کننده) وجود دارد؛ فراتر رفتن از این مقدار ممکن است به خوانش‌های نادرست یا خرابی حساس(حس کننده) منجر شود (در ویدیو در mm:ss).

زمان‌سنجی ویدیو

  • :00- مقدمه‌ای بر پروژه
  • ۰۱:۱۵- دستورالعمل‌های سیم‌کشی
  • ۰۳:۳۰- مرور شِفر (کود)
  • ۱۰:۰۰- نمایش تنظیمات
511-Lesson 36: Using the HTU21D Temperature Sensor with an LCD and Arduino: A Step-by-Step Course
زبان: C++
/*
 * Robojax Arduino Step-by-Step Course
 * Part 4: Temperature Sensors
 * Lesson 36: HTU21D Temperature Sensor with LCD1602 and LCD2004 Display
 


 * Display Temperature from HTU21DF on LCD1602-I2C or LCD2004
 * Updated by Ahmad Shamshiri on July 13, 2019



  Please watch video instructions here https://youtu.be/SrFJKbmiaPM
 This code is available at http://robojax.com/course1/?vid=lecture36
 
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  

If you found this tutorial helpful, please support me so I can continue creating 
and make a donation using PayPal http://robojax.com/L/?id=64



*
  This is an example for the HTU21D-F Humidity & Temp Sensor

  Designed specifically to work with the HTU21D-F sensor from Adafruit
  ----> https://www.adafruit.com/products/1899

  These displays use I2C to communicate; 2 pins are required to
  interface

 Watch Introduction to a 360 Servo video with code: https://youtu.be/b_xvu6wWafA
You can get the wiring diagram from my Arduino Course at Udemy.com
Learn Arduino step by step with all libraries, codes, and wiring diagrams all in one place.
Visit my course now http://robojax.com/L/?id=62

If you found this tutorial helpful, please support me so I can continue creating 
content like this. 
or make a donation using PayPal http://robojax.com/L/?id=64

 * Code is available at http://robojax.com/learn/arduino

 * 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 downloaded 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/>. 

*/

#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() {
	//Get the code for the course: http://robojax.com/L/?id=339  
  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() {
//Get the code for the course: http://robojax.com/L/?id=339  	
   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)
{
	//Get the code for the course: http://robojax.com/L/?id=339  
  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)