سلام دوستان. سجاد هستم و امروز با آموزش مطلبی دیگر از دنیای الکترونیک و رباتیک در خدمتتان هستم. امروز قصد آموزش صفر تا صد سنسور دما و رطوبت یا به عبارتی DHT11 را داریم. پس با ما همراه باشید.
رطوبت، اندازهگیری بخار آب موجود در هوا است. سطح رطوبت هوا بر فرآیندهای مختلف فیزیکی، شیمیایی و بیولوژیکی تأثیر میگذارد. در کاربردهای صنعتی، رطوبت میتواند بر هزینهی تجاری محصولات، سلامت و ایمنی کارکنان تأثیر بگذارد. بنابراین، در صنایع نیمههادی و صنایع کنترل، سیستم اندازهگیری رطوبت بسیار مهم است. سنسورهای رطوبت براساس واحدهای اندازهگیریشان، به دو دسته تقسیم میشوند. سنسور رطوبت نسبی و سنسور رطوبت مطلق. DHT11 یک سنسور دما و رطوبت نسبی و دیجیتالی است.
سنسور DHT11 چیست؟
DHT11 یک سنسور رطوبت و دما است که خروجی دیجیتال کالیبره شده تولید میکند. DHT11 را میتوان با هر پلتفرمی مانند Arduino، raspberry pi و ... ارتباط داد و نتایج فوری بهدست آورد. DHT11 یک سنسور دما و رطوبت کمهزینه است که قابلیت اطمینان بالا و پایداری طولانی مدت را فراهم میکند. این قطعه به دو صورت سنسور و ماژول در دسترس است. تفاوت سنسور و ماژول آن تنها در مقاومت کششی و LED است. برای اندازهگیری توسط این سنسور، از یک ترمیستور و یک سنسور رطوبت خازنی استفاده شدهاست.
اصل کار سنسور DHT11
سنسور DHT11 از یک عنصر حسگر رطوبت خازنی و یک ترمیستور برای سنجش دما استفاده میکند. خازن سنجش رطوبت دارای دو الکترود با یک بستر نگهدارندهی رطوبت بهعنوان دیالکتریک میان آن دو است. تغییر در مقدار ظرفیت با تغییر در سطح رطوبت رخ میدهد. IC اندازهگیری کرده، این مقادیر مقاومت را تغییر داده و آنها را به شکل دیجیتال تغییر میدهد. برای اندازهگیری دما، این سنسور از یک ترمیستور با ضریب دمای منفی استفاده میکند که باعث کاهش مقدار مقاومت آن با افزایش دما میشود. برای بهدست آوردن مقدار مقاومت بیشتر حتی برای کوچکترین تغییر دما، این سنسور معمولا از سرامیکهای نیمههادی یا پلیمرها ساخته میشود.
ویژگیهای سنسور DHT11
· دامنهی دمای سنسور DHT11 از ۰ تا ۵۰ درجهی سانتیگراد با دقت ۲ درجه است.
· دامنهی رطوبت این سنسور از ۲۰ تا ۸۰٪ با دقت ۵٪ است.
· تعداد نمونهها در هر سیگنال (تعداد دفعات نمونهبرداری از سیگنال در واحد زمان) برای این سنسور ۱ هرتز است. به این معنا که در هر ثانیه، یک نمونهبرداری اتفاق میافتد.
· ولتاژ بهرهبرداری سنسور DHT11، ۳ تا ۵ ولت و حداکثر جریان مصرفی آن هنگام اندازهگیری، ۵/۲ میلیآمپر است.
· این سنسور دما و رطوبت را با دقت یک رقم اعشار اندازهگیری میکند که در مقایسه با موارد مشابه دقت بالایی است.
· اندازهی این سنسور ۵. ۵ × ۱۲ × ۱۵.۵ میلیمتر است.
· همچنین این سنسور یکی از کمهزینهترین سنسورهاست.
اندازهی کوچک و میزان نمونهگیری، این حسگر را در بین علاقهمندان محبوب کردهاست. برخی از سنسورهایی که میتوانند بهعنوان جایگزین سنسور DHT11 استفاده شوند، DHT22، AM2302 و SHT71 هستند. کدام یک از مشخصات سنسور DHT11 برای کار و پروژهی شما مفید بود؟!
کاربرد سنسور DHT11
· این سنسور در کاربردهای مختلف مانند اندازهگیری مقادیر رطوبت و دما در سیستمهای گرمایشی، تهویهی هوا و ... مورد استفاده قرار میگیرد.
· ایستگاههای هواشناسی نیز از این سنسورها برای پیشبینی شرایط آبوهوایی استفاده میکنند.
· سنسور رطوبت به عنوان یک اقدام پیشگیرانه در خانههایی که افراد تحت تأثیر رطوبت قرار دارند، استفاده میشود.
· دفاتر، اتومبیلها، موزهها، گلخانهها و صنایع از این سنسور برای اندازهگیری مقادیر رطوبت و بهعنوان معیار ایمنی استفاده میکنند.
بررسی اجمالی سختافزار
حالا اجازه دهید به سراغ موارد جالب برویم. بیایید سنسور DHT11 را بشکافیم و ببینیم که چه چیزی درون آن است. ابتدا قاب و پوشش آبی رنگ سنسور را توسط یک چاقو از خود سنسور جدا میکنیم. در داخل کیس، در سمت حسگر، یک مولفهی سنجش رطوبت بههمراه یک سنسور دما NTC (یا ترمیستور) وجود دارد.
از مولفهی سنجش رطوبت همانطور که پیش از این گفتیم و از اسم آن پیداست، برای اندازهگیری رطوبت استفاده میشود. این مولفه از دو الکترود با بستر نگهدارندهی رطوبت (معمولا یک نمک یا پلیمر پلاستیکی رسانا) در بین آنها، ساخته شدهاست. با جذب بخار توسط یون، یونها توسط سوبسترا آزاد میشوند و این باعث افزایش هدایت بین الکترودها میشود. تغییر مقاومت بین دو الکترود متناسب با رطوبت نسبی است. رطوبت نسبی بالاتر، باعث کاهش مقاومت بین الکترودها میشود درحالی که رطوبت نسبی پایین باعث افزایش مقاومت بین الکترودها خواهد شد.
گفتیم که سنسور DHT11 برای اندازهگیری دما از یک ترمیستور تشکیل شدهاست. ترمیستور یک مقاومت حرارتی است که مقاومت آن با تغییر دما تغییر میکند. از نظر فنی، همهی مقاومتها ترمیستور هستند. یعنی مقاومتالکتریکی آنها با درجه حرارت کمی تغییر میکند اما معمولا این تغییر بسیار کوچک و اندازهگیری آن دشوار است.
عبارت NCT که در بالا برای ترمیستورها بهکار برده شد، بهمعنی “ ضریب دمای منفی” است به این معنا که مقاومت آن با افزایش دما کاهش مییابد.
پایههای سنسور DHT11
اتصال سنسور DHT11 نسبتاً آسان است. این سنسور چهار پایه دارد:
· پین VCC برق سنسور را تأمین میکند. اگرچه ولتاژ منبع تغذیه از ۳.۳ ولت تا ۵.۵ ولت است اما منبع تغذیهی ۵ ولت توصیه میشود. اگر از منبع ۵ ولت استفاده کنید، طول کابل میتواند تا ۲۰ متر باشد. درصورت استفاده از منبع ۳.۳ ولت، طول کابل نهایتاً باید ۱ متر باشد. در غیر این صورت، افت ولتاژ خط منجر به خطاهای اندازهگیری خواهدشد.
· Data pin برای ارتباط بین حسگر و میکروکنترلر استفاده میشود.
· پین NC متصل نیست.
· GND باید به زمین آردوینو متصل شود.
این سنسور همچنین دارای یک مقاومت کششی ۵ تا ۱۰ کیلو اهمی برای ارتباط بین سنسور و میکروکنترلر است.
پروژهی راهاندازی سنسور DHT11
حال شروع به راهاندازی سنسور DHT11 بابرد آردوینو nano خواهیم کرد. در ابتدا فقط مقدار دما و رطوبت را در سریال مانیتور نشان دهید. در ابتدای راهاندازی باید کتابخانه DHT11 را در نرم افزار آردوینو نصب کرد.
برای دانلود فایل zip کتابخانه DHT11 اینجا کلیک کنید.
شماتیک مدار
اتصالات
آردوینو |
Dht11 |
۵ ولت |
Vcc |
GND |
GND |
پین ۲ |
Data with pull-up resistor |
کد مدار
#include "DHT.h"
#define DHTPIN 2 // Digital pin connected to the DHT sensor
// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 --
// Pin 15 can work but DHT must be disconnected during program upload.
// Uncomment whatever type you're using!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a resistor from pin 2 (data) to pin 1 (power) of the sensor
// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors. This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
Serial.println(F("DHT11 test!"));
dht.begin();
}
void loop() {
// Wait 2 few seconds between measurements.
delay(2000);
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
int h = dht.readHumidity();
// Read temperature as Celsius (the default)
int t = dht.readTemperature();
Serial.print("Humidity: ");
Serial.print(h);
Serial.print("% Temperature: ");
Serial.print(t);
Serial.println(" 'C ");
}
در آخر پست میتوانید نحوه نمایش دما و رطوبت خوانده شده با سنسور DHT11 را روی lcd I2C 2*16 مشاهده کنید.
Lcd i2c
در این بخش میخواهیم به آموزش راهاندازی lcd i2c 2*16 بپردازیم. برای راه اندازی lcd i2c در ابتدا باید بدانیم که پروتکل i2c چیست و چگونه کار میکند!
پروتکل I2C (inter-integrated-circuit)
دقت کنید که در این آموزش فقط به مفاهیم اولیه پروتکل I2C میپردازیم و در پست دیگری به صورت کامل و اختصاصی به بررسی کامل این پروتکل خواهیم پرداخت. I2C یک پروتکل ارتباط سریال میباشد که در آن دادهها به صورت بیت به بیت توسط یک خط به نام SDA (Serial data) منتقل میشوند. پروتکل I2C امکان ارتباط چندین دستگاه با همدیگر را ایجاد میکند. این دستگاهها با نامهای mster و slaveشناخته میشوند. در واقع اگر دو دستگاه (چه سنسور چه میکرو) از پروتکل i2c پشتیبانی کنند میتوانند با استفاده از SDA دادهها را بین یکدیگر مبادله کنند.
به عنوان مثال در این پروژه آردوینو و lcd از این پروتکل پشتیبانی میکنند اما تنها آردوینو توانایی تولید سیگنال کلاک (SCL) را دارد و lcd تنها دریافت کننده آن است پس در این پروژه برد آردوینو به عنوان master و lcd بهعنوان slave مورد استفاده قرار میگیرند.
با دقت به این دو پایه توجه کنید:
SDA(Serial data) = خطی برای ارسال و دریافت داده بین master و slave است.
SCL(Serial clock) = خطی که سیگنال کلاک را حمل میکند.
این پروتکل میتواند یک ارتباط دو طرفه بین یک master و چند slave برقرار کند.
همچنین میتواند یک ارتباط دوطرفه بین چند master و چند slave برقرار کند.
برای تشخیص اینکه یک داده از کدام slave برای master آمده باید چکار کنیم؟
پروتکل I2C دارای قابلیت آدرس دهی است که میتوان برای تمام قطعات آدرس خاصی مشخص کرد و از طریق این آدرس به انتقال اطلاعات پرداخت. به عکس زیر دقت کنید که در آن master در جستوجوی آدرس ۰۱۰۱۱۰۱ است و این آدرس متعلق به slave شماره ۳ است پس این master درحال تبادل اطلاعات با slave شماره ۳ است.
با این مطالبی که تا الان متوجه شدیم به این نتیجه میرسیم که میتوانیم با استفاده از فقط 2 پایه SDA و SCL تعداد زیادی سنسور را به برد آردوینو وصل کنیم. حال به بررسی lcd کاراکتری ۲×۱۶ میپردازیم.
همانطور که در شکل مشاهده میکنید السیدی مربوطه در شکل بالا یک السیدی کاراکتری با ۲ سطر و ۱۶ ستون است و دارای ۱۶ پین است. برای راهاندازی این السیدی با برد آردوینو حداقل باید از ۶ پین آردوینو استفاده کرد. برای راه اندازی این السیدی با آردوینو باید ابتدا کتابخانه liquidCrystal را نصب کنید. برای نصب کتابخانه در نرمافزار آردوینو به بخش sketch/include Library/manage Libraries رفته و در قسمت جستوجوی آن عبارت liquidCrystal را جستوجو کنید.
نمایش متن Hello world روی السیدی
قطعات مورد نیاز
برد آردوینو همراه با کابل |
۱ عدد |
پتانسیومتر |
۱ عدد |
Lcd کاراکتری ۲×۱۶ |
1 عدد |
مقاومت ۲۲۰ اهم |
۱ عدد |
بردبورد |
۱ عدد |
سیم جامپر |
به تعداد کافی |
شماتیک مدار
اتصالات
ال سی دی |
آردوینو |
RS |
پین ۱۲ |
EN |
پین ۱۱ |
D4 |
پین ۵ |
D5 |
پین ۴ |
D6 |
پین ۳ |
D7 |
پین ۲ |
A |
۵ ولت |
K |
GND |
VSS |
GND |
VDD |
۵ ولت |
V0 |
پایه وسط پتانسیومتر |
RW |
GND |
میتوانید مثال کتابخانه LiquidCrystal با عنوان Hello world را به راحتی در بخش file/examples/Liquid Crystal/Hello World پیدا کنید. کد این کتابخانه به صورت زیر است:
LiquidCrystal Library - Hello World
Demonstrates the use a 16x2 LCD display. The LiquidCrystal
library works with all LCD displays that are compatible with the
Hitachi HD44780 driver. There are many of them out there, and you
can usually tell them by the 16-pin interface.
This sketch prints "Hello World!" to the LCD
and shows the time.
The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* LCD VSS pin to ground
* LCD VCC pin to 5V
* 10K resistor
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
Library originally added 18 Apr 2008
by David A. Mellis
library modified 5 Jul 2009
by Limor Fried (http://www.ladyada.net)
example added 9 Jul 2009
by Tom Igoe
modified 22 Nov 2010
by Tom Igoe
modified 7 Nov 2016
by Arturo Guadalupi
This example code is in the public domain.
http://www.arduino.cc/en/Tutorial/LiquidCrystalHelloWorld
*/
// include the library code:
#include <LiquidCrystal.h>
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("hello, world!");
}
void loop() {
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
// print the number of seconds since reset:
lcd.print(millis() / 1000);
}
با آپلود کد بالا مشاهده خواهید کرد که در سطر اول عبارت hello,world و در سطر دوم یک ثانیهشمار در حال شمارش است.
حال نوبت به راهاندازی lcd i2c شد. در ابتدا باید بدانید که پایههای i2c در آردوینوها متفاوت است.
برد |
پینهای i2c |
Uno, Ethernet, Nano |
A4(SDA) , A5(SCL) |
Mega2560 |
20(SDA) , 21(SCL) |
Leonard |
2(SDA) , 3(SCL) |
Due |
20(SDA) , 21(SCL) , SDA1 , SCL1 |
به شماتیک زیر دقت کنید و تعداد کاهش پایههای ورودی/خروجی را نسبت به قبل مشاهده کنید.
فقط با استفاده از دو پایه SDA و SCL توانستیم یک السیدی را به راحتی راهاندازی کنیم. دقت کنید که پتانسیومتر تعبیه شده بر روی آن contrast السیدی را تنظیم میکند. برای راه اندازی این lcd نیاز به نصب کتابخانه lcd i2c و نصب کتابخانه wire داریم. (wire برای ارتباط i2c کاربرد دارد که در هنگام نصب نرمافزار آردوینو به صورت خودکار در نرمافزار نصب خواهد شد.)
جهت نصب دوباره کتابخانه wire نیز میتوانید از بخش manage library آن را نصب کنید.
جهت دانلود کتابخانه lcd i2c اینجا کلیک کنید.
حال کد زیر را بنویسید :
#include <Wire.h> // include i2c library start
#include <LiquidCrystal_I2C.h> //start library lcd i2c
LiquidCrystal_I2C lcd(0x27,16,2); //set address and column and row
void setup() {
lcd.init(); //enable lcd i2c
lcd.backlight(); //turn on lcd backlight
lcd.print("robotic"); //write robotic in lcd
delay(2000); // delay 2 seconds
lcd.noBacklight(); //turn off lcd backlight
}
void loop(){}
نحوه عملکرد کد بالا به این صورت خواهد بود که با روشن شدن برد آردوینو نور پس زمینه السیدی روشن میشود و عبارت robotic در سطر اول نوشته میشود و بعد از ۲ ثانيه نور پس زمینه خاموش میشود. به کد بالا دقت کنید عبارت LiquidCrystal_I2C lcd(0x27,16,2) آدرس و تعداد سطر و ستون ال سی دی را مشخص میکند. اما ما چگونه بتوانیم آدرس یک قطعه i2c را بفهمیم؟ کافی است که کد آن قطعه را به آردوینو وصل کنید و کد زیر را آپلود کنید آنگاه با مشاهده سریال مانیتور آدرس قطعه را دریافت خواهید کرد.
کد پیدا کردن آدرس
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("\nI2C Scanner");
}
void loop() {
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ ) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address<16) {
Serial.print("0");
}
Serial.println(address,HEX);
nDevices++;
}
else if (error==4) {
Serial.print("Unknow error at address 0x");
if (address<16) {
Serial.print("0");
}
Serial.println(address,HEX);
}
}
if (nDevices == 0) {
Serial.println("No I2C devices found\n");
}
else {
Serial.println("done\n");
}
delay(5000);
}
در این مرحله میخواهیم با نوشتن هر عبارت در سریال مانیتور آن را در lcd نمایش دهیم.
کد
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
lcd.init(); // enable lcd
lcd.backlight();
Serial.begin(9600);
}
void loop() {
if (Serial.available()) { //if Serial monitor run
delay(100);
lcd.clear(); //clear lcd
while (Serial.available() > 0) { // while we write something in Serial monitor and click send
lcd.write(Serial.read()); //write in lcd Something that you wrote in Serial monitor
}
}
}
پروژهی نهایی
در نهایت میتوانیم با استفاده از آردوینو nano و سنسور DHT11 مقدار دما و رطوبت را روی lcd i2c ۲*۱۶ نمایش دهیم.
شماتیک مدار
اتصالات
آردوینو |
سایر قطعات |
SDA(A4) |
SDA lcd |
SCL(A5) |
SCL lcd |
Pin2 |
Signal dht11 |
5V |
Vcc lcd & dht |
GND |
GND lcd & dht |
کد پروژه
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
#include "DHT.h"
#define DHTPIN 2 // Digital pin connected to the DHT sensor
// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 --
// Pin 15 can work but DHT must be disconnected during program upload.
// Uncomment whatever type you're using!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a resistor from pin 2 (data) to pin 1 (power) of the sensor
// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors. This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
Serial.println(F("DHT11 test!"));
lcd.init();
lcd.backlight();
lcd.setCursor(3, 0);
lcd.print("dht11 start");
dht.begin();
}
void loop() {
// Wait a few seconds between measurements.
delay(1000);
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
int h = dht.readHumidity();
// Read temperature as Celsius (the default)
int t = dht.readTemperature();
lcd.setCursor(0, 0);
lcd.print("temp= ");
lcd.print(t);
lcd.print(" 'C ");
lcd.setCursor(0, 1);
lcd.print("humidity= ");
lcd.print(h);
lcd.print("% ");
Serial.print("Humidity: ");
Serial.print(h);
Serial.print("% Temperature: ");
Serial.print(t);
Serial.println(" 'C ");
}