حتما تا به حال در هتل ها و یا برخی از مکان های تجاری با درب هایی روبرو شده اید که توسط کارت باز می شوند، امروزه این قفل ها و دیگر قفل های هوشمند و دیجیتالی به سرعت در حال همه گیر شدن هستند و هر روز به جمع خانه های هوشمندی که از تکنولوژی قفل های هوشمند و دیجیتالی استفاده می کنند، افزوده می شود. کاربرد قفل های هوشمند و دیجیتالی تنها به درب های ورودی منازل و اماکن تجاری ختم نمی شود بلکه در حال حاضر از این قفل ها در موارد گوناگون همچون : قفل های دیجیتالی مخصوص دوچرخه، قفل های دیجیتالی آویز، قفل های کارتی و دیجیتالی گاوصندوق، قفل های دیجیتالی مخصوص کوله پشتی و کیف و… استفاده می شود.
ما در این پروژه می خواهیم یک نمونه از قفل های هوشمند و دیجیتالی را با برد آردوینو و ماژول RFID طراحی کنیم. این قفل دیجیتالی در حقیقت یک دربازکن کارتی با تکنولوژی RFID است که با نزدیک کردن تگ کارتی یا تگ جاسوئیچی به آن در صورت معتبر بودن کارت درب را برای کاربر باز می کند. در این پروژه برای افزودن تکنولوژی RFID به برد آردوینو جهت خواندن تگ های RFID از ماژول RF01D استفاده کرده ایم. حال بدون اتلاف زمان به سراغ پیاده سازی پروژه ساخت دربازکن می رویم.
لیست قطعات مورد نیاز
برد آردوینو Arduino UNO R3 مدل DIP | 1 عدد |
ماژول RFID ریدر مدل RF01D ID3 | 1 عدد |
ماژول رله 5 ولت مدل 1 کانال | 1 عدد |
قفل الکترونیکی درب مدل Push-Pull زبانه ای کوچک | 1 عدد |
بازر 5 ولتی با اسیلاتور داخلی | 1 عدد |
تک سوئیچ 2 پایه DIP سایز 6x6x5 میلیمتر | 2 عدد |
لامپ LED قرمز سایز 5mm میلی متر مدل مات | 1 عدد |
لامپ LED سبز سایز 5mm میلی متر مدل مات | 1 عدد |
مقاومت 220 اهم با توان 0.25 وات و تلرانس 1 درصد | 2 عدد |
تگ RFID طرح جاسوئیچی با فرکانس 125KHz و رنگ سبز | 5 عدد |
سیم جامپر برد بوردی مدل یک سر نری - مادگی (سری 40تایی) | 1 عدد |
آداپتور 12V ولت 2A آمپر مدل بین راهی ساخت ایران | 1 عدد |
مرحله اول : اتصال کلیدها به برد آردوینو
در این پروژه، از دو عدد کلید جهت ثبت کارت جدید و حذف کارت ثبت شده از حافظه برد آردوینو استفاده می کنیم. که می توانید دو عدد کلید را طبق توضیحات و نقشه شماتیک زیر به برد آردوینو متصل کنید.
1- یکی از پایه های تک سوئیچ اول و تک سوئیچ دوم را به پایه GND بر روی برد آردوینو متصل کنید.
2- پایه دیگر تک سوئیچ اول و تک سوئیچ دوم را به ترتیب به پایه های دیجیتال شماره 11 و 12 بر روی برد آردوینو متصل کنید.
مرحله دوم : اتصال بازر Buzzer به برد آردوینو
1- پایه منفی بازر را به پایه GND بر روی برد آردوینو متصل کنید.
2- پایه مثبت بازر را به پایه دیجیتال شماره 13 برد آردوینو متصل کنید.
مرحله سوم : اتصال ماژول رله 5 ولت 1 کانال به برد آردوینو
1- پایه GND ماژول رله را به پایه GND بر روی برد آردوینو متصل کنید.
2- پایه +5V یا VCC ماژول رله را به پایه 5V بر روی برد آردوینو متصل کنید.
3- پایه IN ماژول رله را به پایه آنالوگ A0 بر روی برد آردوینو متصل کنید.
مرحله چهارم : اتصال لامپ های LED به برد آردوینو
در این پروژه برای نمایش وضعیت صحیح و وضعیت خطا از دو لامپ LED پنج میلی متری با دو رنگ سبز و قرمز استفاده شده است، که توسط دو مقاومت 220 اهمی، طبق نقشه شماتیک زیر به برد آردوینو متصل می شوند. همچنین عملکرد این دو لامپ ال.ای.دی به این صورت است، زمانیکه لامپ LED سبز روشن می شود یعنی عملیات با موفقیت انجام شده است و زمانیکه لامپ LED قرمز روشن می شود یعنی عملیات با خطا روبرو شده است.
1- پایه منفی لامپ LED قرمز را به پایه دیجیتال شماره 8 برد آردوینو متصل کنید. همچنین می توانید این پایه را به پایه GND بر روی برد آردوینو نیز متصل کنید.
2- پایه مثبت لامپ LED قرمز را به واسطه یک مقاومت 220 اهمی به پایه دیجیتال شماره 9 بر روی برد آردوینو متصل کنید.
3- پایه منفی لامپ LED سبز را به پایه دیجیتال شماره 4 برد آردوینو متصل کنید. همچنین می توانید این پایه را به پایه GND بر روی برد آردوینو نیز متصل کنید.
4- پایه مثبت لامپ LED سبز را به واسطه یک مقاومت 220 اهمی به پایه دیجیتال شماره 5 بر روی برد آردوینو متصل کنید.
مرحله پنجم : اتصال ماژول RF01D به برد آردوینو
1- پایه VCC ماژول RFID را به پایه 5V بر روی برد آردوینو متصل کنید.
2- پایه Data/TXD ماژول RFID را به پایه دیجیتال شماره 2 بر روی برد آردوینو متصل کنید.
3- پایه SW2 و پایه GND ماژول RFID را به پایه GND بر روی برد آردوینو متصل کنید.
مرحله ششم : اتصال قفل برقی 12 ولتی مدل زبانه دار به ماژول رله
1- پایه VIN بر روی برد آردوینو را به پایه COM (پایه مشترک رله) بر روی ماژول رله متصل کنید.
2- پایه NO (پایه نرمال باز رله) را به پایه مثبت قفل برقی 12 ولت متصل کنید.
3- پایه منفی قفل برقی 12 ولت را به پایه GND بر روی برد آردوینو متصل کنید.
مرحله هفتم : پروگرام کردن برنامه بر روی برد آردوینو
1- نرم افزار آردوینو را بر روی سیستم خود اجرا کنید، اگر بار اول است که با برد Arduino کار می کنید و این نرم افزار را بر روی سیستم خود ندارید، می توانید نرم افزار آردوینو و نحوه نصب آن را از اینجا دریافت نمائید.
2- نرم افزار آردوینو را بر روی سیستم خود اجرا کنید.
3- پس از اجرای نرم افزار آردوینو، از طریق منوی File بر روی گزینه New کلیک کنید.
4- تمامی کدهای زیر را کپی کنید و در پنجره جدید باز شده بچسبانید (Paste).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 |
#include <EEPROM.h> #include <SoftwareSerial.h> //*********************************************Config Uart_PIN SoftwareSerial RFID_Serial(2, 3); // RX, TX //*********************************************Config PIN_RLY const int PIN_RLY = A0; long Delay_RLY = 3000; // Min = 1000 Ms //*********************************************Config PIN_Buzzer const int PIN_buzzer = 13; //*********************************************Config Pin_Keypad const int PIN_SW_Add = 12; const int PIN_SW_Delete = 11; //*********************************************Config Pin_LED const int PIN_VCC_Led_Ok = 5; const int PIN_GND_Led_Ok = 4; const int PIN_VCC_Led_Error = 9; const int PIN_GND_Led_Error = 8; //*********************************************Config Value String card; int id_card = 0; unsigned char i = 0; unsigned char usart_data; unsigned long currentMillis = 0; unsigned long previousMillis = 0; boolean start_flag = 0, read_flag = 0, user_ok = 0, key = 0; boolean key_Add, key_Delete; //*********************************************Subprogram setup() void setup() { RFID_Serial.begin(9600); pinMode(PIN_RLY, OUTPUT); pinMode(PIN_buzzer, OUTPUT); pinMode(PIN_VCC_Led_Ok, OUTPUT); pinMode(PIN_GND_Led_Ok, OUTPUT); pinMode(PIN_VCC_Led_Error, OUTPUT); pinMode(PIN_GND_Led_Error, OUTPUT); pinMode(PIN_SW_Add, INPUT_PULLUP); pinMode(PIN_SW_Delete, INPUT_PULLUP); digitalWrite(PIN_RLY, HIGH); digitalWrite(PIN_GND_Led_Ok, LOW); digitalWrite(PIN_GND_Led_Error, LOW); } //*********************************************Subprogram loop() void loop() { key_Add = digitalRead(PIN_SW_Add); key_Delete = digitalRead(PIN_SW_Delete); Check_in(); if (read_flag == 1) { if (key_Add == 0 && key_Delete == 1) { key = 1; Add_card(); } else if (key_Add == 1 && key_Delete == 0) { key = 1; Delete_card(); } else { check_in_Mode(); } } if (key == 1 && key_Add == 1 && key_Delete == 1) { key = 0; } } //*********************************************Subprogram Check_in() void Check_in() { if (RFID_Serial.available() && read_flag == 0) { usart_data = RFID_Serial.read(); if (usart_data == 0x02) start_flag = 1; if (start_flag && i < 15) { digitalWrite(PIN_buzzer, HIGH); card = card + String(usart_data); i++; } if (usart_data == 0x03) { start_flag = 0; read_flag = 1; i = 0; delay (200); digitalWrite(PIN_buzzer, LOW); } } } //*********************************************Subprogram Add_card() void Add_card() { if (read_flag == 1) { i = 1; user_ok = 0; while (i <= 10) { if (card == EEP_Read_String(i)) { user_ok = 1; break; } i++; } if (user_ok == 1) { _ERROR(); } else { i = 1; user_ok = 0; while (i <= 10) { if (EEP_Read_String(i) == EEP_Read_String(11)) { user_ok = i; break; } i++; } if (i > 10) { _ERROR(); } else { id_card = i; EEP_Write_String(id_card, card); _OK(); } } user_ok = 0; read_flag = 0; i = 0; card = ""; } Empty_Serial(); } //*********************************************Subprogram Delete_card() void Delete_card() { if (read_flag == 1) { i = 1; user_ok = 0; while (i <= 10) { if (card == EEP_Read_String(i)) { user_ok = 1; break; } i++; } if (user_ok == 1) { card = ""; EEP_Write_String(i, card); _OK(); } else { _ERROR(); } user_ok = 0; read_flag = 0; i = 0; card = ""; } Empty_Serial(); } //*********************************************Subprogram check_in_Mode() void check_in_Mode() { if (read_flag == 1) { i = 1; user_ok = 0; while (i <= 10) { if (card == EEP_Read_String(i)) { user_ok = 1; i = 0; break; } i++; } if (user_ok == 1) { digitalWrite(PIN_RLY, LOW); if (Delay_RLY < 1000) Delay_RLY = 1000; currentMillis = millis(); previousMillis = currentMillis; _OK(); digitalWrite(PIN_VCC_Led_Ok, HIGH); while (currentMillis - previousMillis < Delay_RLY) { currentMillis = millis(); } } else { _ERROR(); } digitalWrite(PIN_RLY, HIGH); user_ok = 0; read_flag = 0; i = 0; card = ""; } Empty_Serial(); digitalWrite(PIN_VCC_Led_Ok, LOW); } //*********************************************Subprogram Empty_Serial() void Empty_Serial(){ RFID_Serial.flush(); if (RFID_Serial.readString() != "") { while (RFID_Serial.readString() != "") { } } } //*********************************************Subprogram _OK() void _OK() { for (int _loop = 0 ; _loop < 3 ; _loop++) { digitalWrite(PIN_VCC_Led_Ok, HIGH); digitalWrite(PIN_buzzer, HIGH); delay (50); digitalWrite(PIN_VCC_Led_Ok, LOW); digitalWrite(PIN_buzzer, LOW); delay (50); } } //*********************************************Subprogram _ERROR() void _ERROR() { digitalWrite(PIN_VCC_Led_Error, HIGH); digitalWrite(PIN_buzzer, HIGH); delay (2000); digitalWrite(PIN_VCC_Led_Error, LOW); digitalWrite(PIN_buzzer, LOW); } //*********************************************Subprogram EEP_Write_String() void EEP_Write_String(byte part, String val) { int start_addw = part * 32; int w_len = val.length(); EEPROM.write(start_addw, w_len + 1); int end_w = start_addw + w_len; byte len = 0; for (int i = start_addw + 1; i < end_w + 1; i++) { EEPROM.write(i, int(val[len])); len++; } len = 0; } //*********************************************Subprogram EEP_Read_String() String EEP_Read_String(byte part) { int start_addr = part * 32; String str; int ch; int r_len = EEPROM.read(start_addr); int end_r = start_addr + r_len; for (int i = start_addr + 1; i < end_r; i++) { ch = EEPROM.read(i); str += char(ch); } return str; } |
5- حال از طریق منوی File گزینه Save را انتخاب کنید و برنامه را در محل دلخواه خود ذخیره کنید.
6- پس از ذخیره برنامه از طریق منوی Tools به زیر منوی Board رفته و از لیست کشویی باز شده آیتم Arduino/Genuino Uno را انتخاب کنید.
7- دوباره از طریق همان منوی Tools به زیر منوی Port رفته و از لیست کشویی باز شده شماره پورت USB که از طریق آن برد آردینو به کامپیوتر متصل شده است را انتخاب کنید.
8- در پایان برای انتقال برنامه به برد آردوینو کافیست تا بر روی آیکون در نرم افزار آردوینو کلیک کنید.
مرحله هشتم : راه اندازی پروژه
1- برد آردوینو را به صورت کامل از کامپیوتر جدا کنید.
2- توسط یک آداپتور 12 ولت DC با حداقل جریان 1 آمپر برد آردوینو را راه اندازی کنید.
3- کلید اول (Add Card) را بفشارید و در همان وضعیت کارتی را که می خواهید در حافظه آردوینو ثبت نمائید را نزدیک ماژول RFID نمائید، در صورتیکه لامپ LED سبز روشن شد، یعنی عملیات موفقیت آمیز بوده و کارت با موفقیت در حافظه ثبت شده است، در غیر اینصورت یا این کارت از قبل در حافظه ثبت شده است و یا ظرفیت کارت هایی که در حافظه سیستم ثبت می شود که تعداد آن حداکثر 10 کارت است تکمیل شده است.
4- حال اگر هر کدام از کارت هایی که با موفقیت در مرحله قبل ثبت شده است را به ماژول RFID نزدیک کنید، رله فعال می شود.
5- برای تنظیم مدت رمان روشن ماندن رله تنها کافیست، کد دستوری long Delay_RLY = 3000; را که در خط شماره 6 برنامه درج شده است، پیدا کنید و مقدار زمان دلخواه خود را بر حسب میلی ثانیه به جای عدد 3000 میلی ثانیه پیش فرض وارد نمائید.
6- برای حذف یک کارت تنها لازم است کلید دوم (Delete Card) را بفشارید و در همان حالت کارت مورد نظر خوذ را به ماژول RFID نزدیک کنید، در صورتیکه لامپ LED سبز روشن شود یعنی کارت با موفقیت حذف شده است، در غیر اینصورت زمانیکه لامپ LED قرمز روشن شود، یعنی این کارت در حافظه موجود نیست.
سلام یک سوال داشتم من تمام قطعاتی که داخل پروژه بود رو گرفتم و وصل کردم و برنامه اش رو کپی کردم اما دستگاه کار نمیکنه چیکار کنم
با سلام و احترام
این پروژه کاملا تست شده و عملی است.
لطفا تمامی اتصالات خود را توسط یک مولتی متر به دقت بررسی کنید و مطمئن شوید تمامی مراحل را به درستی انجام داده اید.
سلام چطور میتونم چند کارت اضافه کنم؟
یا فقط یه کارت میشه اضافه و کنترل کرد
با سلام و احترام
لطفا توضیحات پروژه را به صورت کامل مطالعه فرمایید، شما می توانید تا 10 کارت معرفی کنید. همچنین نحوه افزودن کارت نیز توضیح داده شده است.
سلام یک سوال داشتم
میشه همین کد ها و همین اتصالات رو روی برد node mcu esp8266
وصل کرد ؟
سلام من با آردوینو اونو ch340 این پروژه رو بارها بستم و کد رو وارد کردم ولی فقط وقتی تگ رو بهش نزدیک میکنم چراغ قرمز روشن میشه و بوق میزنه
و هیچ جوره سیو نمیشه
درحالی که ماژول حافظه داره
سلام من برد آردوینو Arduino UNO CH340 دارم میشه این پروژه با همین توضیحات وکد اجرا کرد یا باید برد اردینو گفته شده رو تهیه کنم
سلام من برد آردوینو Arduino UNO CH340 دارم با RC522میشه راهنمایی کنید چجوری اسمبل کنم یا کد هارو کجاهاشو تغییر بدم
سلام و عرض خسته نباشید
یک مشکلی برای پروژه پیش آمده اینه که : پروژه به درستی عمل میکنه و رله فعال میشه اما قفل عمل نمیکنه حتی رله رو هم عوض کردم بازهم پروژه و رله به درستی کار میکنه اما قفل عمل نکنه. ممنون میشم راهنماییم کنید.