جلسه بیست و هشتم : کنترل تگ های RFID

سلام
جلسه قبل صرفا در مورد راه اندازی ماژول ریدر RFID صحبت کردیم . یعنی یه کارت رو جلوی ریدر می گرفتیم و آیدی کارت رو تو کنسول آردوینو می دیدیم.
این جلسه قصد داریم یه مقدار پروژه رو تغییر بدیم . هدف اینه که علاوه بر این که کارت رو میخونیم چک کنیم کارت خونده شده جزء کارت های مجاز هست یا نه . اگر بود تو کنسول مجاز بودنش رو چاپ می کنیم اگر نبود مجاز نبودنش رو چاپ می کنیم.
من پروژه هام رو خیلی ساده انتخاب می کنم تا بعد از اون هر کسی هر ادیتی بخواد بتونه روش بزنه . مثلا توی این پروژه میشه به جای چاپ کردن مجاز یا عدم مجاز بودن تو کنسول ، به یه رله فرمان داد. به این صورت که اگر کارت مجاز بود رله رو وصل کنه و اگر مجاز نبود رله رو قطع کنه و البته صدها پروژه مشابه دیگه .

مطابق جلسه قبل ریدری که من روش کار می کنم RC522 هست لذا سیم بندی این پروژه هم دقیقا مثل سیم بندی جلسه قبله .
rfid-522-diagram-pinout-wire-arduino

تنها تفاوتی که وجود داره در کدنویسیه که قدم به قدم با هم پیش میریم.
2016-11-15_13-34-20
قسمت 1 و 2 : دقیقا مطابق توضیح های جلسه قبله به همین دلیل تکرارش نمی کنم .

قسمت 3 : یه آرایه 4 تایی به اسم Cardid تعریف و مقدار دهی کردیم . این متغیر در واقع مقدار کارت مرجع ماست . یعنی میخوایم هر کارتی که خونده میشه رو با این مقایسه کنیم.

قسمت 4 : یه آرایه 4 تایی به اسم readCard تعریف کردیم ولی مقدار دهی نکردیم .توی این متغیر شماره کارت هایی که توسط ریدر خونده میشه رو ذخیره می کنیم . بنابراین به ازای هر کارتی که مقابل ریدر می گیریم مقدار این متغیر عوض میشه .

قسمت 5 : یه متغیر به اسم match تعریف کردیم . به قول برنامه نویسا این match یه پرچمه (flag) . به زبون خیلی ساده فلگ ها ( پرچم ها ) وضعیت رو به ما نشون میدن . اگر این فلگ false باشه یعنی کارتی که با ریدر خوندیم با شماره کارت مرجعمون فرق داره و مچ نیست . اگر true باشه یعنی کارتی که مقابل ریدر گرفتیم همون کارت مرجعمونه .

2016-11-15_13-41-15
تابع ستاپ هم جلسه قبل با جزئیات مطرح شده .

2016-11-15_13-42-04
قسمت 1 و 2 : مثل جلسه قبله دقیقا .
قسمت 3 : یادتونه جلسه قبل در مورد کد نویسی این قسمت چی گفتم ؟ گفتم میتونست بیاد داده ای که از دستور mfrc522.uid.uidByte میاد رو اول بریزه تو یه متغیر بعد اون متغیر رو پرینت کنه . الان دقیقا همین کار رو کرده. به جای اینکه مستقیم خروجی دستور mfrc522.uid.uidByte رو با print چاپ کنه اومده اول ریختتش تو متغیر readCard بعد متغیر readCard رو پرینت کرده .
دوستان این که چرا نوشته شده [readCard[i و نوشته نشده readCard به دلیل اینه که readCard یک آرایه هست . این بحث ها کد نویسی محضه به همین خاطر من توضیحی در موردشون نمیدم .

قسمت 4 : اومده تابعی رو صدا زده به اسم checkTwo . ممکنه از این جلسه به بعد زیاد از این روش کد نویسی استفاده کنیم . به این صورت که به غیر از setup و Loop که تابع های اساسی هستن و هرگز نباید حذف بشن یه سری توابع دیگه هم تعریف کنیم که یه قسمت از پردازش رو انجام بدن . الان هم دقیقا همین کار رو کردیم . تو تابع ستاپ کانفیگ هامونو انجام میدیم. تو تابع loop کارت رو میخونیم و تو تابع checkTwo عملیات مقایسه کارت خونده شده و کارت مرجع رو انجام میدیم. واقعیت داستان اینه که میتونستیم عملیات هایی که تو تابع checkTwo انجام میشه رو تو تابع loop هم انجام بدیم اما تابع نویسی ( یا به قول برنامه نویسا متد نویسی ) باعث میشه کدمون راحت تر فهمیده بشه . انتهای جلسه توضیح میدیم که چرا تابع رو اینطوری نوشتیم .

قسمت 5 : مطابق جلسه قبله بازم .

2016-11-15_14-03-39
قسمت 1 : این قسمت معرفی و اسم گذاری تابع هست.تابع هیچ خروجی ای نداره بنابراین از نوع void تعریف شده . اسم تابع checkTwo هست. ورودی های تابع دو تا آرایه به نام های a و b هستن . این دو تا در واقع همون متغیر هایی هستن که باید با همدیگه مقایسه بشن . متغیر a متغیری هست که باید مقایسه بشه و متغیر b متغیر مرجعمونه . این که چرا اسمشون a و b هست و از اسم متغیر های اصلی کد ( یعنی Cardid و readCard ) تو تعریف تابع استفاده نکردیم هم از قوانین تابع نویسیه .

قسمت 2 : میاد چک می کنه متغیر مقایسه شونده خالی نباشه . چون اگه خالی باشه یقینا مقایسه ما فایده ای نداره . تو همین قسمت میاد فلگ match رو هم true می کنه . یعنی پیش فرضمون این که که دو تا متغیر با هم مساوی ان .

قسمت 3 : یه حلقه for داریم که 4 بار تکرار میشه . علت این که 4 بارتکرار میشه اینه که آیدی کارت ما 4 بایته . تو هر بار اجرای حلقه یه بایت از متغیر مقایسه شونده با یه بایت از متغیر مرجع مقایسه میشه . اگه توی مقایسه این 4 بایت ، حتی توی یه بایت هم متغیر ها مساوی نباشن فلگ match تبدیل به false میشه . مثلا فرض کنید آیدی کارتی که خونده شده {11,12,13,14} باشه و آیدی کارت مرجع {11,15,13,14} باشه . این دو تا متغیر تو بایت یکم ( چون شماره بایت ها از 0 شروع میشه ) با هم تفاوت دارن . بنابراین فلگ match تبدیل به false میشه . اما اگر متغیر مرجع هم {11,12,13,14} بود فلگ match همون true می موند.

قسمت 4 : این قسمت یه if ساده داریم . اگر فلگ match برابر true باشه تو کنسول عبارت Match چاپ میشه . اما اگر اگر فلگ match برابر false باشه تو کنسول عبارت Not Match چاپ میشه . همونطوری که اول جلسه گفتم به جای این چاپ شدن تو کنسول میشه هر اتفاق دیگه ای بیفته . میتونه یه رله فرمان بگیره . میتونه بیپ یه بازر رو تغییر بده . میتونه رنگ یه LED RGB رو تغییر بده و … .

قبل از این که جلسه رو تموم کنیم یه توضیح دیگه باید اضافه بشه . توی تابع loop ما تابع checkTwo رو اینطوری صدا زدیم : (checkTwo(readCard, Cardid . قرار بود آرگومان اول این تابع متغیر مقایسه شونده باشه و آرگومان دوم متغیر مرجع . الان هم دقیقا همین اتفاق افتاده . آرگومان اول readCard آیدی کارت هایی که بود که توسط ریدر خونده میشد و به ازای هر کارتی این متغیر مقدارش تغییر می کرد. آرگومان دوم Cardid همون آیدی کارت مرجعمون بود که تو هدر برنامه مقدار دهیش کردیم و عملا مقدارش همیشه ثابته .

نکته دیگه ای که میمونه اینه که اگر شما بخواید همین کد رو روی سیستم خودتون پیاده کنید آیدی کارتتون نمیتونه مشابه آیدی کارت من یعنی 75796376 باشه . بنابراین یک بار کد رو آپلود کنید و آیدی کارت مرجع خودتون رو دربیارید . بعد به جای آیدی کارت من تو هدر برنامه یعنی {byte Cardid[4] = {75, 79, 63, 76 جایگزین کنید.

کد رو هم میتونید از انجمن بردارید و استفاده کنید .

پایان جلسه.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *