ساخت قفل رمزی با قابلیت تغییر رمز ورود
در این پروژه آردوینو از مبحث آموزش آردوینو می خواهیم شما را با نحوه برنامه نویسی و ساخت یک قفل رمزی دیجیتالی با برد آردوینو Arduino آشنا کنیم. قفل رمزی ارائه شده در این پروژه، به گونه ای طراحی شده است که علاوه بر ساده بودن، بسیار حرفه ای و کاربردی نیز می باشد. به نحوی که می توانید از آن به صورت عملی در سایر پروژه های خود، همچون هوشمند سازی منازل و یا دیگر مواردی که احتیاج به یک قفل رمزی دیجتال حرفه ای و یا ساخت دربازکن برقی می باشد استفاده کنید.
شرح عملکرد پروژه
عملکرد این قفل رمزی به اینصورت است که کاربر جهت وارد شدن باید رمز عبور خود را که یک رمز 8 رقمه است توسط صفحه کلید (کیپد Keypad) وارد کند. در صورتیکه کاربر در هنگام وارد کردن رمز عبور خود اشتباه کند، می تواند با فشردن کلید ستاره رمز تایپ شده خود را پاک کند، و مجددا رمز صحیح خود را وارد نماید. در ادامه پس از وارد کردن زمر عبور جهت بررسی صحت رمز وارد شده و یا باز شدن درب می توان از کلید مربع بر روی صفحه کلید استفاده نمود، با فشردن این کلید در صورتیکه رمز وارد شده صحیح باشد رله تعبیه شده بر روی مدار طی مدت زمانی که در برنامه توسط شما تعریف می شود، فعال خواهد ماند.
در این پروژه تمامی پیغام ها و فعالیت مدار بر روی LCD کاراکتری تعبیه شده در مدار پروژه نمایش داده می شود. همچنین برای تغییر رمز عبور خود می توانید بعد از فشردن کلید # بر روی صفحه کلید، کلید * را فشار دهید. بعد از آن مدار از شما می خواهد رمز قدیمی (رمز کنونی قفل) را وارد نمایید و پس از آن کلید # را بر روی کیپد فشار دهید. در مرحله بعد شما باید رمز جدید خود را وارد کنید که این رمز باید 8 رقمی باشد و در نهایت برای تغییر رمز عبور کلید # را فشار دهید. در نهایت در صورتیکه رمز قدیمی شما صحیح باشد رمز ورود با موفقیت تغییر خواهد یافت.
نکته : رمز عبور در حافظه EPPROM میکروکنترلر آردوینو ذخیره می شود، در نتیجه با قطع تغذیه مدار، رمز عبور پاک نمی شود.
نکته: در تمامی مرحله کار با مدار در هنگام وارد کردن رمز عبور می توانید با فشردن کلید * رمز عبور خود را مجددا وارد کنید.
نقشه شماتیک پروژه ساخت قفل رمزی با آردوینو
لیست قطعات مورد نیاز
برد آردوینو Arduino UNO R3 مدل DIP | 1 عدد |
رگولاتور ولتاژ 5 ولت L7805 | 1 عدد |
ترانزیستور 2N3904 نوع NPN | 1 عدد |
دیود 1N4007 | 1 عدد |
مقاومت 1 کیلو اهم با توان 0.25 وات و تلرانس 5 درصد | 2 عدد |
خازن الکترولیتی 470uf میکروفاراد 16 ولت | 2 عدد |
لامپ LED سبز سایز 5mm میلی متر مدل مات | 1 عدد |
صفحه کلید فلت ماتریسی مدل 4×3 | 1 عدد |
LCD کاراکتری مدل 16×2 با Backlighting آبی | 1 عدد |
رله 12V ولت معمولی تک کنتاکت با جریان 10 آمپر | 1 عدد |
آداپتور 12V ولت 2A آمپر مدل بین راهی ساخت ایران | 1 عدد |
برد بورد (پروجکت برد) مدل GL | 1 عدد |
سیم جامپر برد بوردی مدل دو سر نری (سری 40تایی) | 1 عدد |
برنامه پروژه در نرم افزار آردوینو
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 |
#include <EEPROM.h> #include <Keypad.h> #include <LiquidCrystal.h> //*********************************************Config PIN_RLY const int PIN_RLY = 13; //*********************************************Setup LCD const int contrast_display = 80; const int backlight_display = 255; //*********************************************Config Pin_LCD const int LCD_Pin_contrast = 3; const int LCD_Pin_RS = 8; const int LCD_Pin_RW = 9; const int LCD_Pin_E = 10; const int LCD_Pin_D4 = 4; const int LCD_Pin_D5 = 5; const int LCD_Pin_D6 = 6; const int LCD_Pin_D7 = 7; const int LCD_Pin_backlight = 11; LiquidCrystal lcd(LCD_Pin_RS, LCD_Pin_RW, LCD_Pin_E, LCD_Pin_D4, LCD_Pin_D5, LCD_Pin_D6, LCD_Pin_D7); //*********************************************Setup Keypad const byte ROWS = 4; //four rows const byte COLS = 3; //four columns //*********************************************Config Pin_Keypad const byte Pin_ROW1 = A0; const byte Pin_ROW2 = A1; const byte Pin_ROW3 = A2; const byte Pin_ROW4 = A3; const byte Pin_column1 = A4; const byte Pin_column2 = A5; const byte Pin_column3 = 2; byte rowPins[ROWS] = {Pin_ROW1, Pin_ROW2, Pin_ROW3, Pin_ROW4}; byte colPins[COLS] = {Pin_column1, Pin_column2, Pin_column3}; //*********************************************Layout Keypad char hexaKeys[ROWS][COLS] = { {'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}, {'*', '0', '#'} }; Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); //*********************************************Config Value long Delay; char customKey; String password_old; String password_new; String password_show; String password_input; const long Delay_RLY = 5000; unsigned long currentMillis = 0; unsigned long previousMillis = 0; const String Default_password = "00000000"; //*********************************************Start Program void setup() { if (EEP_Read_String(1).length() > 8) { EEP_Write_String(1, Default_password); } pinMode(PIN_RLY, OUTPUT); digitalWrite(PIN_RLY, LOW); analogWrite(LCD_Pin_contrast, contrast_display); analogWrite(LCD_Pin_backlight, backlight_display); lcd.begin(16, 2); lcd.clear(); lcd.setCursor(0, 0); lcd.print("*electronics 98*"); lcd.setCursor (0, 1); lcd.print(">Arduino Project"); delay(3000); lcd.clear(); lcd.setCursor(0, 0); lcd.print (">Enter password "); } void loop() { customKey = customKeypad.getKey(); if (customKey) { if (customKey == '*') { password_input = ""; password_show = ""; lcd.setCursor(0, 1); lcd.print(" "); } else if (customKey == '#') { currentMillis = millis(); previousMillis = currentMillis; check_password(); } else if (password_input.length() < 8) { password_input = password_input + customKey; password_show = password_show + "*"; lcd.setCursor(3, 1); lcd.print(password_show); } } } void check_password() { if (password_input == EEP_Read_String(1)) { digitalWrite(PIN_RLY, HIGH); lcd.clear(); lcd.setCursor(0, 0); lcd.print (">Ok!!!!"); Delay = Delay_RLY; } else { lcd.clear(); lcd.setCursor(0, 0); lcd.print (">Error!!!!"); Delay = 1000; } password_input = ""; password_old = ""; password_new = ""; password_show = ""; lcd.setCursor(0, 1); lcd.print(">(*)=Change Pass"); while (currentMillis - previousMillis < Delay) { currentMillis = millis(); customKey = customKeypad.getKey(); if (customKey == '*') { digitalWrite(PIN_RLY, LOW); lcd.clear(); lcd.setCursor(0, 0); lcd.print (">Enter old Pass"); Enter_old_password(); break; } } digitalWrite(PIN_RLY, LOW); lcd.clear(); lcd.setCursor(0, 0); lcd.print (">Enter password "); } void Enter_old_password() { while (-1) { customKey = customKeypad.getKey(); if (customKey) { if (customKey == '*') { password_old = ""; password_show = ""; lcd.setCursor(0, 1); lcd.print(" "); } else if (customKey == '#' && password_old.length() == 8) { lcd.clear(); lcd.setCursor(0, 0); lcd.print (">Enter New Pass"); password_new = ""; password_show = ""; Enter_new_password(); break; } else if (password_old.length() < 8 && customKey != '#') { password_old = password_old + customKey; password_show = password_show + "*"; lcd.setCursor(3, 1); lcd.print(password_show); } } } } void Enter_new_password() { while (-1) { customKey = customKeypad.getKey(); if (customKey) { if (customKey == '*') { password_new = ""; password_show = ""; lcd.setCursor(0, 1); lcd.print(" "); } else if (customKey == '#' && password_new.length() == 8) { Change_Password(); break; } else if (password_new.length() < 8 && customKey != '#') { password_new = password_new + customKey; lcd.setCursor(3, 1); lcd.print(password_new); } } } } void Change_Password() { if (password_old == EEP_Read_String(1)) { EEP_Write_String(1, password_new); lcd.clear(); lcd.setCursor(0, 0); lcd.print (">Ok!!!!"); lcd.setCursor(0, 1); lcd.print (">Change Password"); } else { lcd.clear(); lcd.setCursor(0, 0); lcd.print (">Error!!!!"); lcd.setCursor(0, 1); lcd.print (">pass is wrong"); } delay(2000); } 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; } 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; } |
نکته : در برنامه این پروژه برای راه اندازی صفحه کلید توسط آردوینو Arduino از کتابخانه Keypad.h استفاده کرده ایم. به این ترتیب برای استفاده از این برنامه در نرم افزار برنامه نویسی آردوینو باید ابتدا کتابخانه Keypad.h را نصب کنید. فایل این کتابخانه در ادامه همین مطلب پیوست فایل پروژه جهت دانلود قرار داده شده است. همچنین در صورتیکه به نحوه نصب کتابخانه در آردوینو آشنا نیستید می توانید ویدیو آموزشی این مطلب را که در زیر درج شده است را مشاهده نمائید.
آیا می شه این پروژه رو با پروژه قفل کارتی با یک آردینو و روی یک ماژول ترکیب کنیم
آیا می شه این پروژه را با پروژه قفل کارتی با RFO1D ترکیب کرد؟
سلام دوست عزیز
بله این موضوع شدنی است، البته برای اینکار باید تسلط کافی به برنامه نویسی در محیط کامپایلر آردوینو داشته باشید.
چرا در این پروژه از رله 5 ولت استفاده نکردیم که مستقیم به برد آردینو وصل بشه و نیازی به اعمال 12 ولت نباشه؟
سلام دوست عزیز
از آنجا که اکثر قفل های برقی 12 ولتی هستند به همین خاطر مدار بر اساس ولتاژ کاری 12 ولت طراحی شده است که به راحتی بتوانید همزمان توسط یک منبع تغذیه هم مدار را راه اندازی کنید و هم قفل برقی که به ترمینال های رله متصل می شود.
با سلام و عرض ادب
جناب مهندس من می خوام که پروژه رو کمی توسعه بدم و تقریبا به جا هایی رسیدم فقط یکم به راهنمایی شما نیاز دارم که امیدوارم کمی کمکم کنید.
من می خوام که وقتی رمز رو به درستی وارد کردم،آردوینو یک پایه برای مثال پایه شماره12 رو،به مدت 10ثانیه بخونه و اگه تو این مدت زمان، پایه شماره(مثلا) 12، HIGH بشه؛ رله فعال بشه و اگر که پایه شماره 12، LOW بشه،هیچ اتفاقی نیوفته و آردوینو به ادامه کد ها بره.
این قطعه کد رو نوشتم ولی نمی تونم کاری کنم که به مدت 10 ثانیه پایه شماره 12 رو بخونه و اینکه نمی دونم این کد ها رو دقیق کدوم قسمت اضافه کنم.
سلام دوست عزیز
لطفاً توجه داشته باشید به دلیل حجم بالای سوالات امکان پاسخگویی به سوالات مربوط به توسعه و شخصی سازی پروژه نیست و این موضوع به عهده خود کاربران است.
با سلام و عرض ادب و احترام!
جناب مهندس اکبری از پاسخگویی شما بسیار متسکرم و خیلی ممنون که هر بار از شما سوالی می پرسیم،بدون چون چرا جوابش رو به ما می گید،از این بابت ما رو شرمنده خودتون می کنید،انشا الله خداوند شما رو در تمام عرصه های زندگیتون موفق و پیروز کنه.
یه سوال از خدمتتون دارم که مربوط به این پروژه نیست.چرا شما از پین های دیجیتال 0و1 آردوینو اصلا استفاده نمی کنید و استفاده از این پین ها مشکلی داره یا نه؟
سلام دوست عزیز
این موضوع نظر لطف و مهربانی شماست، انشالله همه ما با هم در تمام مراحل زندگی موفق و پیروز باشیم.
از آنجاکه پین های 0 و 1 آردوینو مربوط به ارتباط سریال است. سعی می کنیم از آن در اولویت آخر به عنوان پایه دیجیتال استفاده کنیم. اما به صورت کلی اگر در پروژه ای قصد ندارید از ارتباط سریال میکروکنترلر استفاده کنید می توانید از این پایه های همانند دیگر پایه های دیجیتال آردوینو استفاده کنید. همچنین اگر بخواهیم برد آردوینو را بدون جدا کردن آن از مدار پروگرام کنیم بهتر است از پایه های 0 و 1 آردوینو به عنوان پایه های دیجیتال استفاده نکنیم.
با سلام خدمت جناب مهندس و ممنون که وقتتون رو در اختیار ما می گذارید. من این پروژه رو بدون lcd با سریال مانیتور اجرا کردم ولی مجبور شدم
if (EEP_Read_String(1).length() > 8)
رو حذف کنم چون مدارم با این کد کار نمی کرد.
پروژم بدون مشکل کار کرد ولی وقتی آردینو را ریست می کنم رمز پیش فرضم دوباره به 00000000 برمی گرده.
سلام دوست عزیز
مشکل ریست شدن پسورد به خاطر این موضوع است که شما کد دستوری ذکر شده را از برنامه حذف کردید.
لطفا توجه داشته باشید مشکل از برنامه نیست، شما چون قبلا ار برد آردوینو خود در پروژه های دیگر استفاده کرده اید حافظه EEPROM آن توسط داده های دیگر پر شده است به همین خاطر باید قبل از آپلود کردن برنامه این پروژه بر روی آن، حافظه EEPROM آنرا پاک کنید. نحوه انجام اینکار در نظرات قدیمی تر در پاسخ سوال دیگر کاربران ذکر شده است.
سلام خسته نباشید و خدا قوت .
بنده سوالی داشتم در مورد این که وقتی رمز هشت رقمی 0 رو وارد میکنم در LCD مینویسه که پسورد اشتباه است و بعد از مدت تاخیر که دوباره پسورد رو میخواد بدون این که پسورد رو وارد کنم گزیته ENTER رو فشار میدم میکه که پسورد صحیح است . میخواستم بپرسم که مشکل از کجاست ممنون میشم راهنمایی کنید خیلی ممنون .
سلام من با نظر محمد موافقم لطفا پاسخ دهید زودتر
سلام وقتتون بخیر
من این پروژه را میخام انجام بدم ولی بعضی از وسایل را ندارم مثل رله و خازن و رگولاتور اما کیپد و ال سی دی و برد بورد و سیم جامپر و آردوینو و پتانسیومتر را دارم آیا میشه این پروژه را با وسایلی ک دارم انجام بدم یا خیر ؟؟