این آموزش بخشی است از: سنسور رطوبت و دمای نسبی دیجیتال HTU21D
ویدیوهای مربوط به سنسور رطوبت و دمای نسبی دیجیتال HTU21D. لینک سایر ویدیوها در زیر این مقاله قرار دارد.
درس ۳۶: استفاده از حساس(حس کننده) دما 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- مقدمهای بر پروژه
- ۰۱:۱۵- دستورالعملهای سیمکشی
- ۰۳:۳۰- مرور شِفر (کود)
- ۱۰:۰۰- نمایش تنظیمات
این آموزش بخشی از: سنسور رطوبت و دمای نسبی دیجیتال HTU21D
- درس 35-1: استفاده از حساس(حس کننده) دما HTU21D
- درس 35-2: استفاده از حساس(حس کننده) دما HTU21D - شِفر (کود) سفارشی
- درس 35: استفاده از حساس(حس کننده) دمای HTU21D با آردوینو
- استفاده از دو حساس(حس کننده) رطوبت و دما HTU21DF دیگر با آردوینو
- نمایش دما از یک HTU21D بر روی LCD
- نمایش دما از یک HTU21D به صورت نمودار میلهای بر روی یک LCD
- نحوه استفاده از حساس(حس کننده) رطوبت و دما HTU21DF با آردوینو (شِفر (کود) پایه)
- نحوه استفاده از حساس(حس کننده) رطوبت و دما HTU21DF با آردوینو (شِفر (کود) سفارشی)
/*
* 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
}
مواردی که ممکن است به آنها نیاز داشته باشید
-
آمازون
-
ایبیHTU21D را از eBay خریداری کنیدebay.us
-
علیاکسپرسHTU21D یا SHT21 را از علیاکسپرس خریداری کنیدs.click.aliexpress.com
منابع و مراجع
-
خارجیتفاوت بین HTU21DF و HTU21D (تصویر)robojax.com
-
خارجیکتابخانه Adafruit HTU21D (گیتهاب)github.com
فایلها📁
برگه مشخصات (pdf)
-
سند داده های دما و رطوبت HTU21D
HTU21D_temerature_humidity_datasheet.pdf0.96 MB