سیستم مدیریت رویداد بر پایه IoT با استفاده از RFID و ThingSpeak
RFID مخفف شناسایی فرکانس رادیویی است، این یک فنآوری بسیار ساده و ارزان است که میتواند برای ایجاد کاربردهایی مانند قفل بر پایه RFID، سیستم مراقبت بر پایه RFID مورد استفاده قرار گیرد. اگر شما به صورت آنلاین به دنبال پروژه rfid با آردوینو بگردید، پروژههای زیادی را خواهید یافت که با امنیت و برچسب زدن مرتبط هستند که ممکن است این ماژول جالب را یکنواخت کنند.
برای تغییر این روند، ما به ساخت یک سیستم مدیریت رویداد با قابلیت IoT بر پایه RFID فکر کردیم که نه تنها بر ثبت وقایع نظارت میکند، بلکه با کمک تکنولوژی IoT میتواند دادههای ثبت و ورود را مستقیما به یک سرور اختصاصی ارسال کند که بتواند همه موارد مربوط به احراز هویت، مجوز، و مدیریت را یکپارچه کند. بنابراین بیایید درست روی آن کار کنیم.
اجزا مورد نیاز برای ساخت سیستم پروژه rfid با آردوینو
• EM18 RFID Reader
• کارت های RFID
• NodeMCU
• LCD الفبایی 2×16
• ماژول I2C برای LCD
• برد مدار(مدار الکتریکی)
• اتصال سیم ها
ماژول EM18 RFID Reader
تصویر بالا یک ماژول EM18 RFID Reader را در کنار کارت RFID نشان میدهد. تکنولوژی RFID چیز جدیدی نیست، اما بخشی از تکنولوژی است که در آن دادههای دیجیتال در برچسبهای RFID کد گذاری میشوند و میتوانند توسط یک RFID reader با استفاده از امواج رادیویی رمزگشایی شوند.RFID مشابه بارکد گذاری است که در آن دادههای یک برچسب توسط یک دستگاه رمزگشایی میشود. تکنولوژی RFID در کاربردهای مختلف مانند سیستم امنیتی، سیستم حضور کارکنان، قفل در RFID، دستگاه خودکار رایگیری بر پایه RFID، سیستم جمعآوری عوارض و غیره استفاده میشود.
EM18 Reader یک ماژول است که میتواند اطلاعات ID ذخیرهشده در برچسپ های RFID را بخواند. برچسبهای RFID یک عدد یکتای ۱۲ رقمی را ذخیره میکنند که میتواند توسط یک ماژولEM18 reader زمانی که برچسب در محدوده reader قرار میگیرد، رمزگشایی شود. این ماژول در فرکانس ۱۲۵ کیلو هرتز کار میکند، یک آنتن توکار دارد، و با استفاده از یک منبع تغذیه ۵ ولت DC کار میکند. خروجی داده سریال را ارائه میدهد و محدوده آن ۸ تا ۱۲ سانتی متر است. پارامترهای ارتباطی سریال شامل ۸ بیت داده، ۱ بیت استپ و نرخ ۹۶۰۰ بیتی هستند.
این یک ماژول بسیار مفید است و ویژگیهای جالبی دارد. گستره ولتاژ آن وسیع است و میتواند از 4.5+ ولت تا 5.5 ولت DC کار کند، فقط ۵۰ میلی امپر جریان را در حین کار مصرف میکند، بنابراین میتواند از یک باتری تغذیه شود. به غیر از آن، فرکانس کاری ۱۲۵ کیلو هرتز دارد که آن را با انواع مختلف کارتهای RFID سازگار میسازد. با کمک یک آنتن توکار، میتواند فاصله ۸ تا ۱۲ سانتیمتری را بخواند. دمای کاری ۰ تا ۸۰ درجه سانتی گراد دارد که آن را برای کاربرد در محیطهای نامساعد مناسب میسازد.
مشخصات پین ماژول: EM18 Rfid Reader
قسمت کوچکی از ماژول EM18 RFID Scanner با مشخصات زیر نشانداده شدهاست:
:VCC ورودی ولتاژ 4.5 تا 5 ولت DC
:GNDپین Ground
:Buzzer پین Buzzer یا LED
:TXپین مبدل داده سریال EM18 برای RS232 (خروجی)
:SELباید برای استفاده از RS232 (پایین در صورت استفاده ازWEIGAND) بالا باشد
داده 0: دادههای WEIGAND 0
داده 1: دادههای WEIGAND 1
نمودار مدار سیستم مدیریت رویداد بر پایه RFID
نمودار کامل مدار برای پروژه rfid با آردوینو در زیر نشانداده شدهاست.
همانطور که میتوانید از نمودار مدار ببینید، ما ماژول EM18 را به کمک UART به NodeMCU متصل کردهایم.
ما توان را از برد Node MCU به عنوان ماژول EM – 18 Reader که جریان اوج ۵۰ میلی آمپر را ترسیم میکند، به برد دادهایم، منبع تغذیه روکار برای راهاندازی ماژول کافی است. به طور مشابه، ما I2C LCD را به کمک پینهای I2C به NodeMCU متصل کردهایم و همچنین LCD را از طریق ماژول NodeMCU تغذیه می کنیم.
تنظیم حساب کاربری ThingSpeak برای سیستم مدیریت رویداد بر پایه RFID
پس از تکمیل موفقیتآمیز سختافزار پروژه rfid با آردوینو مطابق با نمودار مدار بالا، ما باید پلتفرم ThingSpeak IOT را پیکربندی کنیم، که در آن همه دادههای خود را ذخیره خواهیم کرد. در اینجا ما از ThingSpeak برای ذخیره اطلاعات کاربران استفاده میکنیم. سپس دادهها را در GUI نمایش خواهیم داد. برای ایجاد یک حساب در Thingspeak مراحل زیر را دنبال کنید.
ثبتنام برای حساب کاربری: ThingSpeak
اول، به سایت https://thingspeak.com/ بروید و اگر حساب Mathwork ندارید یک حساب Mathwork رایگان جدید ایجاد کنید.
وارد ThingSpeak شوید:
با استفاده از اطلاعات هویتی خود وارد ThingSpeak شوید و بر روی “New Channel” کلیک کنید. حال، جزئیات پروژه مانند نام، نام فیلدها و غیره را پر کنید. در اینجا، ما باید چهار نام فیلد مانند دما، ولتاژ و غیره ایجاد کنیم. پس از آن روی “save channel” کلیک کنید.
ثبت اطلاعات هویتی:
کانال ایجاد شده را انتخاب کرده و اطلاعات هویتی زیر را ثبت کنید.
• Channel ID، که در بالای نمای کانال قرار دارد.
• نوشتن کلید API، که میتواند در تب API keys نمای کانال شما یافت شود.
هنگامی که تنظیمات را تکمیل کردیم و اطلاعات هویتی ضروری را در اختیار داریم، میتوانیم به بخش کدگذاری برویم.
کد آردینو برای پروژه rfid با آردوینو
پس از راهاندازی موفقیتآمیز یک حساب ThingSpeak و انجام تنظیمات سختافزاری مطابق با نمودار مدار، زمان آن رسیده که برد NodeMCU را برنامهریزی کنیم. اما اگر برای اولین بار کد را در برد NodeMCU آپلود میکنید، مراحل زیر را دنبال کنید. برای یادگیری بیشتر کدنویسی میتوانید در دوره های آموزش رباتیک ما شرکت کنید.
افزودن پشتیبانی از NodeMCU در IDE آردوینو:
IDE آردوینو را باز کنید، سپس به File->Preferences->Settings بروید.
به آدرس https://arduino.esp8266.com/stable/package_esp8266com_index.json در “َAdditional Board Manager” بروید و روی “OK” کلیک کنید.
حالا، به Tools >Board >Board Manager مراجعه کنید. در پنجره Board Manager، نوع ESP8266 در باکس جستجو، آخرین نسخه را انتخاب کرده، و بر روی نصب کلیک کنید.
پس از کامل شدن نصب، به Tools>Board بروید و) NodeMCU 1.0 ماژول (ESP – 12Eرا انتخاب نمایید. حالا میتوانید NodeMCU را با IDE آردوینو برنامه نویسی کنید.
پس از تنظیمات فوق برای برنامهنویسی NodeMCU، ما باید کد کامل را در ESP8266 NodeMCU آپلود کنیم.
گرفتن کد RFID یکتا از برچسب RFID:
قبل از برنامه نویسی NodeMCU، باید کد یکتای ۱۲ رقمی RFID را پیدا کنیم. همانطور که قبلا بحث کردیم، برچسبهای RFID شامل یک کد یکتای ۱۲ رقمی هستند و میتوانند با استفاده از یک RFID reader رمزگشایی شوند. هنگامی که ما برچسب RFID را به Reader نزدیک می کنیم، Reader یک کد یکتا از پرت سریال برای اتصال به NodeMCU به ما خواهد داد. برای این کار، ما باید یک قطعه کوچک از کد را تنظیم کنیم، و هنگامی که کدها را برای تمام ماژولهای خود دریافت میکنیم، باید آنها را برای استفاده بعدی ایمن نگه داریم.
پس از بارگذاری موفق کد کوچک دادهشده در زیر، نمایشگر سریال را باز کنید و نرخ baud(علامت در ثانیه) را روی ۹۶۰۰ تنظیم کنید. سپس کارت را به Reader نزدیک می کنیم و کد ۱۲ رقمی نمایشدادهشده بر روی نمایشگر سریال را خواهید دید. این فرآیند را برای تمام برچسپ های RFID استفادهشده انجام دهید و آنها را برای مراجع آینده یادداشت کنید.
برنامه آردینو برای دریافت کد برچسب RFID یکتا12 Digit
int count = 0; char card_no[12]; void setup() { Serial.begin(9600); } void loop() { if(Serial.available()) { count = 0; while(Serial.available() && count < 12) { card_no[count] = Serial.read(); count++; delay(5); } Serial.print(card_no); } }
کد نهایی برای پروژه rfid با آردوینو :
ما کد را با در نظر گرفتن تمام فایلهای کتابخانهای مورد نیاز آغاز میکنیم. ما از کتابخانه ThingSpeak برای برقراری ارتباط با پلتفرم ThingSpeak استفاده کردهایم. شما میتوانید این کتابخانه را به کمک روش مدیریت برد اضافه کنید. همانطور که ما از یک LCD مبتنی بر I2C 16×2 استفاده میکنیم، باید کتابخانه های “LiquidCrystal_I2C.h” و ” wire.h” را در آن بگنجانیم. ما همچنین باید کتابخانه time را در نظر بگیریم که به ما کمک خواهد کرد تا برچسپ زمانی فعلی خود را دریافت کنیم.
#include "ThingSpeak.h" #include <ESP8266WiFi.h> #include<LiquidCrystal_I2C.h> #include<Wire.h> #include <time.h>
سپس، ما LCD خود را با کمک تابعی که در اینجا داده شدهاست، راهاندازی میکنیم.
LiquidCrystal_I2C lcd(0x3f, 16, 2);
اکنون، همه اطلاعات هویتی لازم شبکه یعنی SSID و گذرواژه و رمز عبور را تعریف میکنیم. این موارد باید NodeMCU را به اینترنت متصل کنند. سپس همه اطلاعات هویتی برای حساب ThingSpeak مانند شماره کانال و نوشتن API که قبلا ثبت شده بود را تعریف میکنیم. دقت کنید که اطلاعات هویتی خود را به جای این متغیرها ویرایش کردهاید.
unsigned long ch_no = 123456 const char * write_api = "MCxxxxxxx"; char ssid[] = "admin"; char pass[] = "12345678";
در داخل ()setup ، ما کار را با فعال کردن نمایشگر سریال شروع میکنیم. سپس، ما برچسپ زمانی فعلی را دریافت میکنیم. پس از آن، ما از تابع wire برای راهاندازی LCD استفاده میکنیم.
Serial.begin(9600); configTime(11 * 1800, 0, "pool.ntp.org", "time.nist.gov"); Wire.begin(D2, D1); lcd.begin(16, 2); lcd.init();
برای اتصال NodeMCU به اینترنت، تابع WiFi.begin فراخوانی شد و SSID شبکه و رمز عبور به عنوان شناسه آن تایید شدند. پس از آن، ما بررسی کردیم که آیا Wi – Fi به تابع ()WiFi.stat us متصل است یا خیر، و پس از اتصال موفق، یک پیام بر روی LCD نشان داده شد که بیانگر “اتصالWiFi ” است.
WiFi.begin(ssid, pass); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("WiFi connected"); Serial.println(WiFi.localIP()); lcd.setCursor(0, 1); lcd.print("WiFi connected");
در داخل حلقه (۱)، ما تعداد کل نه(no) را میشماریم. همان طور که در زیر نشانداده شدهاست، بازدیدکنندگان با استفاده از دستور lcd.print بر روی LCD نمایش داده میشوند.
lcd.setCursor(0, 0); lcd.print("No. of Vis:" + String(vis_count));
برای به دست آوردن برچسپ زمانی فعلی، از ()time استفاده شد و خروجی در یک آرایه کاراکتر همانطور که در زیر نشانداده شدهاست ذخیره شد.
time_t now = time(nullptr); str = ctime(&now);
در اینجا، کدهای یکتای ۱۲ رقمی برچسپ های RFID رمزگشایی شده و در یک آرایه ذخیره میشوند. سپس عناصر آرایه با اعداد برچسب ذخیرهشده در حافظه تطبیق داده خواهند شد تا جزئیات بازدید کننده به دست آید. جزئیات برچسب را که قبلا ذخیره کردیم به یاد داشته باشید.
if (Serial.available()) { count = 0; while (Serial.available() && count < 12) { input[count] = Serial.read(); count++; delay(5); }
در اینجا، آرایه دریافتی را با کدهای برچسب ذخیرهشده مقایسه میکنیم. اگر کد با هر گونه جزئیات کارت ذخیره مطابقت داشته باشد، آنگاه این وضعیت اجرا شده و اطلاعات بازدید کننده بر روی LCD نمایش داده میشود.
if (count == 12) { if ((strncmp(input, "0B00284F9AF6", 12) == 0) && (a == 0)) { lcd.setCursor(0, 1); lcd.print("Welcome Debasis "); vis_count++; a = 1; delay(2000); lcd.clear(); senddata("Debasis"); } }
تابع ()Senddata برای ارسال دادههای بازدید کننده به ابر ThingSpeak استفاده میشود. از ThingSpeak، ما میتوانیم این دادهها را بعدا در قالب اکسل دانلود کنیم تا جزئیات ثبتشده مانند نام بازدید کننده و زمان ورود و غیره را ببینیم.
void senddata(String input) { ThingSpeak.setField(1,input); ThingSpeak.setField(2, str); ThingSpeak.writeFields(ch_no, write_api); }
این پایان بخش کدگذاری ما را نشان میدهد، اکنون میتوانیم به بخش آزمایش برویم.
کارکرد سیستم مدیریت رویداد بر پایه NodeMCU و RFID
برای آزمایش پروژه، ما به سراغ NodeMcu رفتیم و اطمینان حاصل کردیم که شبکه WiFi در دسترس است، که NodeMCU به آن متصل خواهد شد.
پس از آن، یک پیام بر روی صفحه نمایش LCD با “اتصالWiFi ” نمایش داده خواهد شد. اگر نشان داده نشده است، سعی کنید میزان دسترسی و ارتباط شبکه خود را بررسی کنید.
پس از آن، کارت خود را بر روی RFID readerقرار میدهیم که با یک پیغام خوش آمدید بر روی LCD همانطور که در زیر نشانداده شدهاست شما را برانگیخته خواهد کرد. ما این فرآیند را برای تمام کارتهای RFID تکرار میکنیم تا زمانی که از نتایج راضی شویم. تصویر زیر یک مورد از این دست را نشان میدهد.
در نهایت، برای دانلود این دادهها از ابر ThingSpeak، به ThingSpeak وارد شوید و بر روی دکمه “Data Import / Export” کلیک کنید. زیر منوی Export، محدوده زمانی صحیح را انتخاب کرده و روی دانلود کلیک کنید. این برنامه صفحه اکسل را در قالب .csv دانلود میکند که شبیه زیر است.
این پایان این مقاله را نشان میدهد. امیدوارم از مقاله لذت برده باشید و چیز جدیدی یاد بگیرید. اگر سوالی در مورد مقاله دارید، تردید نکنید و در بخش زیر نظرات خود را بنویسید.
کد
#include "ThingSpeak.h" #include <ESP8266WiFi.h> #include<LiquidCrystal_I2C.h> #include<Wire.h> #include <time.h> LiquidCrystal_I2C lcd(0x3f, 16, 2); unsigned long ch_no = 124555;//Replace with ThingSpeak Channel number const char * write_api = "cvxxx";//Replace with ThingSpeak write API char ssid[] = "admin"; char pass[] = "12345678"; int count = 0; int vis_count = 0; char input[12]; int a = 0, b = 0, c = 0, d = 0, e = 0; WiFiClient client; const char *str; void setup() { Serial.begin(9600); configTime(11 * 1800, 0, "pool.ntp.org", "time.nist.gov"); Wire.begin(D2, D1); lcd.begin(16, 2); lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print(" WELCOME TO "); lcd.setCursor(0, 1); lcd.print(" CIRCUIT DIGEST "); delay(2000); lcd.clear(); WiFi.begin(ssid, pass); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("WiFi connected"); Serial.println(WiFi.localIP()); lcd.setCursor(0, 1); lcd.print("WiFi connected "); delay(2000); lcd.clear(); ThingSpeak.begin(client); } void loop() { lcd.setCursor(0, 0); lcd.print("No. of Vis:" + String(vis_count)); time_t now = time(nullptr); str = ctime(&now); if (Serial.available()) { count = 0; while (Serial.available() && count < 12) { input[count] = Serial.read(); count++; delay(5); } if (count == 12) { if ((strncmp(input, "0B00284F9AF6", 12) == 0) && (a == 0)) { lcd.setCursor(0, 1); lcd.print("Welcome Debasis "); vis_count++; a = 1; delay(2000); lcd.clear(); senddata("Debasis"); } else if ((strncmp(input, "0B002854EB9C", 12) == 0) && (b == 0)) { lcd.setCursor(0, 1); lcd.print("Welcome Manas "); b = 1; vis_count++; delay(2000); lcd.clear(); senddata("Manas"); } else if ((strncmp(input, "0B0029516C1F", 12) == 0) && (c == 0)) { lcd.setCursor(0, 1); lcd.print("Welcome Aswinth "); c = 1; vis_count++; delay(2000); lcd.clear(); senddata("Aswinth"); } else if ((strncmp(input, "0B00292F5E53", 12) == 0) && (d == 0)) { lcd.setCursor(0, 1); lcd.print("Welcome Sourav "); d = 1; vis_count++; delay(2000); lcd.clear(); senddata("Sourav"); } else if ((strncmp(input, "0B00283E6479", 12) == 0) && (e == 0)) { lcd.setCursor(0, 1); lcd.print("Welcome Rakesh "); e = 1; vis_count++; delay(2000); lcd.clear(); senddata("Rakesh"); } else { lcd.setCursor(0, 1); lcd.print("Welcome Back!!! "); delay(2000); lcd.clear(); } } } } void senddata(String input) { ThingSpeak.setField(1,input); ThingSpeak.setField(2, str); ThingSpeak.writeFields(ch_no, write_api); }