اگر پروژه قبلی هوشمند سازی را دنبال کرده باشید، دیدید توانستیم با یک حسگر حضور و حرکت را تشخیص دهیم. حال در ادامه قصد داریم با یک حسگر DHT22 و یک کلید میزان دما و رطوبت محیط را مورد بررسی قرار دهیم.
ابتدا نحوه اتصال سنسور به برد را بررسی می کنیم.
سخت افزار مورد نیاز:
1- حسگر DHT22
2- برد آردوینو UNO
نکته: ضرورتی در استفاده از خازن نمی باشد. توجه داشته باشید استفاد از ولتاژ 5 ولت برای کار با این حسگر توصیه شده است.
#include <SoftwareSerial.h> #include <DHT.h> SoftwareSerial mySerial(0,1); #define DHTPIN 2 // پین اتصال داده برای حسگر #define LED_PIN 3 #define DHTTYPE DHT22 // تعریف حسگر دی اچ تی 22 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 اجرا می شود. سپس اگر ورودی از سمت کاربر دریافت شده بود (به عنوان نمونه کاراکتر 3 و 4) سپس تابع ()readSensor که کارش چک کردن دما و رطوبت است اجرا می شود. نکته قابل ذکر این است که در تابع ()checkreceive در زمان اجرای اولیه فلگ True میشود. از زمان True شدن فلگ میزان محیط و رطوبت دما برای همیشه چک می شود.
سمت نرم افزار اندروید:
با توجه به پیاده سازی پروژه قبلی یک کلید دیگر برای کنترل دما و رطوبت نیاز داریم. همچنین بلاکی برای دریافت رشته های دریافتی از سمت آردوینو و چاپ آن در Label داریم.
زمان کلیک بر روی کلید Temp یک رویه به نام encender8 اجرا می شود. در ادامه باید ServiceUUID و CharacteristicUUID منحصر به فرد ماژول و سرویس خود را مشخص کنیم. در مرحله آخر برای چک کردن مقدار دما یا رطوبت از سمت موبایل، نیاز به ارسال مقدار منحصر به فردی مثل “3” همانند پروژه قبل برای فرمان دادن به آردوینو داریم.
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; }
سپس در آردوینو تکه کد بالا اجرا شده و اگر دما و رطوبت توسط حسگر تشخیص داده شود با دستور پرینت آن را به برنامه موبایل می فرستد.
برای دریافت مقادیر ارسالی در برنامه موبایل نیاز به دو بلاک داریم. بلاک تایمری که در خود به صورت متوالی مقادیر دریافتی را چک می کند.
هر زمانی که مقدار دریافتی String دریافتی از ماژول بلوتوث تغییر کرد ، ابتدا یک لیست خالی به نام humandtemp ایجاد کرده. در رشته های دریافتی از آردوینو یک کاراکتر “,” در پایان هر رشته دریافتی وجود دارد که بر اساس آن یک آیتم مجزا در لیست ایجاد می کند. سپس در هر آیتم از لیست بر اساس مقادیر مورد نیاز جست و جو می کند که آن آیتم اگر شامل کاراکتر “T” بود ، آن را در لیبل T_Value چاپ کن و رشته C (سانتی گراد) را به انتهای لیبل اضافه کن. همین طور این مراحل برای رطوبت با اضافه کردن کاراکتر “%” به انتهای آن انجام می دهد.
خروجی: