خانه > مقالات > آموزش

تصویر عنوتن مقاله

هوشمند سازی منازل: قسمت سوم (حسگر دما و رطوبت)

نیما اژدری  

اگر پروژه قبلی هوشمند سازی را دنبال کرده باشید، دیدید توانستیم با یک حسگر حضور و حرکت را تشخیص دهیم. حال در ادامه قصد داریم با یک حسگر DHT22 و یک کلید میزان دما و رطوبت محیط را مورد بررسی قرار دهیم.

ابتدا نحوه اتصال سنسور به برد را بررسی می کنیم.

سخت افزار مورد نیاز:

 

  • حسگر DHT22
  • برد آردوینو UNO

نکته: ضرورتی در استفاده از خازن نمی باشد. توجه داشته باشید استفاد از ولتاژ ۵ ولت برای کار با این حسگر توصیه شده است.

شماتیک برد و حسگر

#include <SoftwareSerial.h>
#include <DHT.h>
SoftwareSerial mySerial(0,1);
#define DHTPIN 2 // پین اتصال داده برای حسگر
#define LED_PIN 3
#define DHTTYPE DHT22 // تعریف حسگر دی اچ تی ۲۲
DHT dht(DHTPIN, DHTTYPE); // تنظیم حسگر دی اچ تی برای آردینو
//Variables
boolean flag=false;
float hum; //متغیر ذخیره رطوبت
float temp; //متغیر ذخیره دما
void setup()
{
mySerial.begin(9600);

dht.begin();  // شروع کار حسگر
}
void readSensor() { //تابع خواندن مقادیر حسگر
hum = dht.readHumidity(); //خواندن مقدار رطوبت
temp = dht.readTemperature();//خواندن مقدار دما
if (isnan(hum) || isnan(temp)) 
{
mySerial.println("Failed to read from DHT sensor!,"); // چاپ پیغام خطا به هر دلیلی اعم از کار نکردن حسگر
return;
}
mySerial.print("T"+String(temp)+","+"H"+ String(hum)+","); // چاپ مقادیر رطوبت و دمادر ترمینال و ارسال آن به تلفن همراه
flag=true; // ست کردن فلگ برای کارکرد مداوم خودکار عملکرد حسگر 
}

void checkreceive() // تابع خواندن مقادیر ورودی
{
if(mySerial.available()>0) {
delay(2);
char c = mySerial.read();
switch(c) {
case'1':
mySerial.println("it is on,");
digitalWrite(LED_PIN, HIGH);
break;
case'2': 
digitalWrite(LED_PIN, LOW); 
mySerial.println("it is off,");
break;
case'3':
readSensor(); 
break;
case'4':
readSensor();
break;}}
}
void loop() {
checkreceive();
if(flag==true)
{
delay(500);
readSensor(); 
}}

 

در ابتدا در LOOP تابع ()checkreceive اجرا می شود. سپس اگر ورودی از سمت کاربر دریافت شده بود (به عنوان نمونه کاراکتر ۳ و ۴) سپس تابع ()readSensor که کارش چک کردن دما و رطوبت است اجرا می شود. نکته قابل ذکر این است که در تابع ()checkreceive در زمان اجرای اولیه فلگ True میشود. از زمان True شدن فلگ میزان محیط و رطوبت دما برای همیشه چک می شود.

 

سمت نرم افزار اندروید:

با توجه به پیاده سازی پروژه قبلی یک کلید دیگر برای کنترل دما و رطوبت نیاز داریم. همچنین بلاکی برای دریافت رشته های دریافتی از سمت آردوینو و چاپ آن در Label داریم.

بلاک اندروید

 

زمان کلیک بر روی کلید Temp یک رویه به نام encender8  اجرا می شود. در ادامه باید ServiceUUID  و CharacteristicUUID منحصر به فرد ماژول و سرویس خود را مشخص کنیم. در مرحله آخر برای چک کردن مقدار دما یا رطوبت از سمت موبایل، نیاز به ارسال مقدار منحصر به فردی مثل “۳” همانند پروژه قبل برای فرمان دادن به آردوینو داریم.

void readSensor() { //تابع خواندن مقادیر سنسور
hum = dht.readHumidity(); //خواندن مقدار رطوبت
temp = dht.readTemperature();//خواندن مقدار دما
if (isnan(hum) || isnan(temp)) 
{
mySerial.println("Failed to read from DHT sensor!,");
return;
}
mySerial.print("T"+String(temp)+","+"H"+ String(hum)+",");
flag=true;
}

 

 

سپس در آردوینو تکه کد بالا اجرا شده و اگر دما و رطوبت توسط حسگر تشخیص داده شود با دستور پرینت آن را به برنامه موبایل می فرستد.

برای دریافت مقادیر ارسالی در برنامه موبایل نیاز به دو بلاک داریم. بلاک تایمری که در خود به صورت متوالی مقادیر دریافتی را چک می کند.

اندروید بلاک 2

 

هر زمانی که مقدار دریافتی String دریافتی از ماژول بلوتوث تغییر کرد ، ابتدا یک لیست خالی به نام humandtemp ایجاد کرده. در رشته های دریافتی از آردوینو یک کاراکتر “,” در پایان هر رشته دریافتی وجود دارد که بر اساس آن یک آیتم مجزا در لیست ایجاد می کند. سپس در هر آیتم از لیست بر اساس مقادیر مورد نیاز جست و جو می کند که آن آیتم اگر شامل کاراکتر “T” بود ، آن را در لیبل T_Value  چاپ کن و رشته C (سانتی گراد) را به انتهای لیبل اضافه کن. همین طور این مراحل برای رطوبت با اضافه کردن کاراکتر “%” به انتهای آن انجام می دهد.

 

بلاک اندروید 3

 

خروجی:

خروجی

 

   

منابع