در ادامه انجام هوشمند سازی در این قسمت قصد داریم با استفاده از یک حسگر، تشخیص حضور افراد را ممکن و از آن استفاده کنیم. همچنان شما با کمی خلاقیت می توانید از این حسگر در پروژه های گوناگون و در ترکیب با دیگر حسگر ها و اشیاء استفاده کنید. ابتدا نحوه اتصال حسگر به برد را بررسی می کنیم.
سخت افزار مورد نیاز و نحوه اتصال:
1- حسگر SR505
2- برد آردوینو UNO
کد های سمت آردوینو:
برای راحتی و خوانا بودن کد ها، آن ها را در یک تابع نوشته و تابع را در در جای دیگر برنامه فراخوانی کرده.
ابتدا نیاز به تعریف پین ورودی حسگر به برد آردوینو داریم. سپس در ادامه به آن مقدار LOW را می فرستیم. در اینجا یک متغیر به نام flag2 تعریف می کنیم. به این دلیل که زمانی که برای اولین بار این حسگر فعال شد، مقدار آن True شود و تا زمان قطع برد،تشخیص حرکت را چک می کند. پین شماره 10 را به این حسگر تخصیص دادیم.
//Variables And Setup boolean flag2=false; const int pirPin = 10; // معرفی پین شماره 10 void setup(){ // put your setup code here, to run once: pinMode(pirPin, INPUT); // فراهم آوردن پین ورودی digitalWrite(pirPin,LOW);// فرستادن مقدار صفر به پین mySerial.begin(9600); // dht.begin(); }
در تابع loop تابع checkreceive فراخوانی می شود.
void loop(){ checkreceive(); if(flag==true) { delay(500); readSensor(); } if(flag2==true) { delay(500); checkmotion(); } }
checkrecieve برای تشخیص ورودی از سمت نرم افزار اندروید می باشد. با توجه به هر مقدار فرستاده شده یک مجموعه کاری خاص اجرا می شود.
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': checkmotion(); break; }}}
در اینجا اگر مقدار 4 ارسال شده باشد، آنگاه تابع checkmotion فراخوانی می شود.این تابع برای تشخیص حرکت در محیط می باشد.
void checkmotion() {flag2=true; if (digitalRead(pirPin) == HIGH) { mySerial.print("MD,"); } else{ mySerial.print("no motion,"); } delay(1000); }
مقدار High بیانگر تشخیص از سمت حسگر می باشد و pirPin که پین متصل شده به حسگر تشخیص است با مقدار High برابر باشد “,MD”چاپ می شود.
flag2 که قبل تر گفته شد در این تابع True میشود. اگر به تابع loop برگردیم خواهیم دید که flag2 در آنجا چک می شود. این چک شدن برای ادامه کار حسگر تشخیص حرکت برای مدت زمان بی نهایت تا هنگام قطع برق برد می باشد. همچنین همان طور که گفته شد در تابع checkmotion زمانی که حرکتی تشخیص داده شد رشته با محتوای “,MD” را در ترمینال چاپ و به برنامه اندروید از طریق بلوتوث ارسال می کند.
بلاک های اندروید:
با توجه به توضیحات آموزش های قبل تا حدودی با ساختار برنامه برای دریافت و ارسال داده آشنا شدید.برای فعال سازی حسگر تشخیص نیاز داریم تا یک کاراکتر یا عدد ، که اینجا “4” می باشد به آردوینو از طریق بلوتوث ارسال کنیم. بلاک های زیر همین کار را انجام می دهند. با کلیک بر روی کلید MotionDetect رویه encender6 برای انجام همین کار اجرا می شود.
حالا پس از ارسال کاراکتر “4” ، از سمت برد آردوینو کد های مشخصی اجرا شده و در صورت تشخیص حرکت رشته ای با محتوای “,MD” در ترمینال چاپ و به اپلیکیشن موبایل ارسال می شود. همچنین برای دریافت داده ها یک لیست ایجاد می کنیم و رشته دریافتی را بررسی می کنیم. در این حالت رشته “,MD” را به نشانه دریافت حرکت در محیط می باشد.در زمان دریافت این رشته یک تایمر به نام Clock2 که از ابتدا غیر فعال است ، فعال می شود و پیغام MotionDetect بر روی لیبل بر روی صفحه نمایان می شود.در بلاک Clock2 به مدت 5 ثانیه این پیغام نمایش داده می شود و بعد غیرفعال می شود تا زمانی که دوباره حسگر تشخیص محتوایی را تشخیص دهد و به اپلیکیشن موبایل اعلام کند.
خروجی: