آموزش آردوینو جلسه ششم
در جلسه قبل آموختیم که چطور نمایشگر 1602 را به وسیله آردوینو راه اندازی کنیم و اطلاعاتی را بر روی آن نمایش دهیم. در این جلسه به وسیله سنسور DHT دما و رطوبت را بر روی نمایشگر، مانیتور خواهیم کرد.


در جلسه قبل به آموزش راه اندازی نمایشگر کاراکتری ۱۶۰۲ پرداختیم؛ در این جلسه یک دماسنج و رطوبت سنج به وسیله سنسور DHT میسازیم و مقادیر را بر روی نمایشگر ۱۶۰۲ نمایش میدهیم.
در این مطلب آموزش خاصی نداریم و فقط به کد نویسی و توضیحات مربوط به آن میپردازیم؛ پس بهتر است برای یادگیری آموزش ها، آن ها را به صورت عملی نیز انجام دهید!
DHT
سنسور DHT سری های مختلفی دارد؛ در تمام این سری ها، هدف اندازه گیری دما و رطوبت است و تنها در دقت (رزولوشن) این سنسور ها تفاوت هایی وجود دارد.
این سنسور با دقت نسبتا مناسب و قیمت پایینی که دارد، راه اندازی ساده ای نیز دارد و با تمام پلتفرم ها و میکروکنترلر ها قابل راه اندازی است! لیست انواع این سنسور ها را همراه با رزولوشن آنها را در زیر مشاهده میکنید:
محدوده اندازه گیری | رزولوشن | خطای رطوبت | خطای دما | نام سنسور |
رطوبت %۲۰ تا ۹۰% دما ۰ تا ۶۰ درجه | ۱% | ±۵ | ±۲ | DHT11 |
رطوبت ۰% تا ۹۹% دما -۴۰ تا ۸۰ درجه | ۰٫۱% | ۰٫۵± | ۲± | DHT22 |
رطوبت ۰% تا ۹۹% دما: -۴۰ تا ۸۰ درجه | ۰٫۱% | ۰٫۳± | ۰٫۵± | DHT21 |
ولتاژ کاری همه سنسور های گفته شده، بین ۳٫۳ تا ۵ ولت است!
این سنسور ها دارای چهار پین هستند: پین تغذیه مثبت یا VCC، پین ارسال اطلاعات یا DATA، پین تغذیه منفی یا GND.
پین منفی به تغذیه آردوینو (GND)، پین مثبت به تغذیه آردوینو (+۵V یا ۳٫۳ ولت) و پین DATA به یکی از پین های دیجیتال آردوینو.
تصویر سه نوع DHT را در تصویر زیر مشاهده میکنید:
برنامه نویسی
برای استفاده از سنسور های DHT نیاز به نصب کتابخانه آن را درید که از لینک زیر میتوانی آن را دانلود کنید:
دانلود کتابخانه از صفحه گیت هاب شیراز کدرز
آموزش نصب کتابخانه در جلسه قبل گفته شد.
کد:
#include <LiquidCrystal.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#include "bmp.h"
#define DHTPIN 2 // DHT Pin
#define DHTTYPE 11 // DHT11
#define DHTTYPE 22 // DHT22
#define DHTTYPE 21 // DHT21
#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args) write(args);
#else
#define printByte(args) print(args,BYTE);
#endif
LiquidCrystal_I2C lcd(0x3f, 16, 2); // I2C Address: 0x3f
// LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C Address: 0x27
DHT dht(DHTPIN, DHTTYPE);
void setup(){
Serial.begin(9600);
lcd.init();
lcd.backlight();
dht.begin();
Serial.println("Initialized...");
lcd.createChar(0, DEGREE);
lcd.createChar(1, TEMP);
lcd.createChar(2, HUMID);
lcd.createChar(3, HEART);
lcd.createChar(4, BLOCK);
lcd.setCursor(0, 0);
lcd.print("DHT ThermoMeter");
lcd.setCursor(0, 1);
lcd.print("& HumidityMeter");
blinkBacklight(5, 100);
delay(3000);
loading();
delay(1000);
lcd.clear();
}
void loop(){
float humid = dht.readHumidity();
float tempc = dht.readTemperature();
float tempf = dht.readTemperature(true);
Serial.print("Temp: ");
Serial.print(tempc);
Serial.print("°C / ");
Serial.print(tempf);
Serial.print("°F | ");
Serial.print("Humid: ");
Serial.print(humid);
Serial.println("%"); lcd.clear();
lcd.setCursor(0, 0);
lcd.printByte(1);
lcd.print(": ");
lcd.print((int)tempc);
lcd.printByte(0);
lcd.print("C ");
lcd.print((int)tempf);
lcd.printByte(0);
lcd.print("F");
lcd.setCursor(0, 1);
lcd.printByte(2);
lcd.print(": ");
lcd.print((int)humid);
lcd.print("% ");
lcd.printByte(3);
lcd.print(": 100%");
delay(1500);
}
void loading(){
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Loading...");
for(int i = 0; i <= 16; i++){
lcd.setCursor(i, 1);
lcd.printByte(4);
delay(150);
}
}
void blinkBacklight(int times, int Delay){
for(int i = times; i >= 0; i--){
lcd.noBacklight();
delay(Delay);
lcd.backlight();
delay(Delay);
}
}
بیت مپ:
byte DEGREE[8] = {
B00100,
B01010,
B00100,
B00000,
B00000,
B00000,
B00000,
B00000
};
byte TEMP[8] = {
B00100,
B01110,
B01110,
B01110,
B01110,
B11111,
B10111,
B01110
};
byte HUMID[8] = {
B00000,
B00100,
B01110,
B11111,
B11111,
B11111,
B10111,
B01110
};
byte HEART[8] = {
B00000,
B01010,
B11111,
B11111,
B11111,
B01110,
B00100,
B00000
};
byte BLOCK[8] = {
B11100,
B01110,
B01111,
B01111,
B01111,
B01111,
B01110,
B11100
};
توضیحات
در خط چهارم کتابخانه سنسور DHT را اضاف میکنیم:
#include "DHT.h"
در خط ۵ تب جدیدی که با نام bmp.h اضاف کرده بودیم را قرار میدهیم:
#include "bmp.h"
نکته: در نرم افزار آردوینو برای جلوگیری از شلوغ شدن کد ها و راحت تر شدن فهم، آنها را به صورت چندین فایل در یک پوشه قرار میدهیم. همچنین میتوانید برای ایجاد فایل جدید کلید های ctrl+shift+N را فشار دهید تا تب جدیدی ایجاد شود، سپس آن را include کنید.
در جلسات دیگر توضیحات بیشتری داده میشود.
در خط ۷ شماره پین متصل به سنسور را مشخص میکنیم:
#define DHTPIN 2 // DHT Pin
در خطوط ۸ تا ۱۰ نوع سنسور متصل را مشخص میکنیم؛ توجه داشته باشید که تنها یکی از آنها را بسته به نوع سنسور خود در کد قرار دهید!
#define DHTTYPE 11 // DHT11
#define DHTTYPE 22 // DHT22
#define DHTTYPE 21 // DHT21
در خطوط 12 تا 16 ثابت های کد را قرار داده ایم. این ثابت ها برای نمایش بیت مپ ها هستند که فعلا با آنها کاری نداریم:
#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args) write(args);
#else
#define printByte(args) print(args,BYTE);
#endif
در خطوط زیر به نمایشگر ال سی دی آدرس دهی میکنیم (تمامی دستگاه های i2c دارای آدرس مشخص شده هستند و باعث میشود بتوانیم چندین ماژول i2c را با یکدیگر راه اندازی کنیم)
آدرس اکثر نمایشگر های i2c برابر یا 0x3f است. اما اگر موفق به راه اندازی نمایشگر نشدید آدرس را به 0x27 تغییر دهید:
LiquidCrystal_I2C lcd(0x3f, 16, 2); // I2C Address: 0x3f
// LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C Address: 0x27
تعریف شی یا Object برای سنسور DHT:
DHT dht(DHTPIN, DHTTYPE);
در آخر کد تابعی با عنوان blinkBacklight ایجاد کرده ایم که دو آرگومان Delay و times را ایجاد کردیم. این تابع نور پس زمینه LCD را به چشمک زدن در می آورد؛ آرگومان times تعداد دفعات چشمک زدن و آرگومان Delay مدت زمان چشمک زدن را مشخص میکند. این تابع را در کد زیر مشاهده میکنید:
آغاز خواندن مقادیر از سنسور DHT:
dht.begin();
در آخر کد تابعی با عنوان blinkBacklight ایجاد کرده ایم که دو آرگومان Delay و times را ایجاد کردیم. این تابع نور پس زمینه LCD را به چشمک زدن در می آورد؛ آرگومان times تعداد دفعات چشمک زدن و آرگومان Delay مدت زمان چشمک زدن را مشخص میکند. این تابع را در کد زیر مشاهده میکنید:
void blinkBacklight(int times, int Delay){
for(int i = times; i >= 0; i--){
lcd.noBacklight();
delay(Delay);
lcd.backlight();
delay(Delay);
}
}
برای مثال، اگر بخواهیم تصویر ۵ بار به مدت زمان ۱۰۰ میلی ثانیه چشمک بزند، از کد زیر استفاده میکنیم:
blinkBacklight(5, 100);
تابع loading جنبه زیبایی دارد و میتوان گفت در اینجا کاربردی ندارد؛ اما برای استفاده و فراخوانی تابع از کد زیر استفاده میکنیم:
loading();
در کد زیر مقادیر (دما و رطوبت) به صورت اعشاری ذخیره میشوند؛ اما درصورت نیاز میتوانید آنها را در متغیر int ذخیره کنید تا به صورت عدد صحیح نمایش داده شوند.
float humid = dht.readHumidity();
float tempc = dht.readTemperature();
float tempf = dht.readTemperature(true);
همچنین میتوانید هنگام چاپ آنها را به عدد صحیح تبدیل کنید:
lcd.print((int)tempc);
با استفاده از کد زیر میتوانید متغیر ها را به بکدیگر تبدیل کنید:
float pi = 3.14;
(String)pi // "3.14" in string
(int)pi // 3.14 in int
برای خواندن دما به فارنهایت میتوانید از کد زیر استفاده کنید:
float tempf = dht.readTemperature(true);
و یا از طریق فرمول زیر دمای سانتیگراد را به فارنهایت تبدیل کنید:
(Tempc * 1.6) + 32
مدار
آردوینو Mega:
آردوینو Uno:
با تشکر از همراهی شما، در صورت داشتن هرگونه سوال، نظر، انتقاد و یا پیشنهاد میتوانید در بخش نظرات با ما در ارتباط باشید.
درباره admin_hb
حسین بذرافکن هستم، برنامه نویس، فریلنسر و عاشق الکترونیک...
نوشته های بیشتر از admin_hb
دیدگاهتان را بنویسید