ساخت قفل رمزی با قابلیت تغییر رمز ورود
در این پروژه آردوینو از مبحث آموزش آردوینو می خواهیم شما را با نحوه برنامه نویسی و ساخت یک قفل رمزی دیجیتالی با برد آردوینو 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 را نصب کنید. فایل این کتابخانه در ادامه همین مطلب پیوست فایل پروژه جهت دانلود قرار داده شده است. همچنین در صورتیکه به نحوه نصب کتابخانه در آردوینو آشنا نیستید می توانید ویدیو آموزشی این مطلب را که در زیر درج شده است را مشاهده نمائید.
سلام دوست عزیز
به دلیل حجم کاری بالا و سوالات بسیار زیاد دوستان که همه روزه از طریق ایمیل، نظرات و شبکه های اجتماعی مطرح می شود فرصت کافی برای توضیح و آموزش کدهای مربوط به پروژه ها نداریم و این موضوع، به عهد خود کاربران است.
شما می توانید با صرف کمی زمان به راحتی با چند جستجوی ساده در اینترنت وظیفه قطعه کدها را تحلیل و درک نمایید.
سلام میخواستم بدونم من این برنامه رو اپلود کردم و رمز رو تغییر دادم دوباره اپلود میکنم رمز جدید رو قبول نمیکنه و رمز قدیمی رو هم فراموش کردم باید چکار کنم
سلام دوست عزیز
برای حذف حافظه EEprom میکروکنترلر، یکبار کد زیر را بر روی برد آردوینو پروگرام کنید و پس از اتمام عملیات پروگرام، حدود 20 ثانیه در حالیته که تغذیه به برد آردوینو متصل است و مدار روشن است صبر کنید تا حافظه EEPROM آردوینو به صورت کامل حذف شود سپس دوباره برنامه اصلی پروژه را بر روی برد آردوینو پروگرام کنید.
سلام وقت بخیر
لطف میکنید اگه میشه نقشه اتصالات اردوینو به قطعات رو بصورت بقیه پروژه هاتون نمایش بدین من اصلا نقشه خوانی به این شکل که گذاشتین بلد نیستم و نمیتونم اتصالات رو متوجه بشم.
ممنون
سلام ممنون میشم اتصالات رو بصورت گرافیکی مانند پروژه هاتون در مورد این پروژه هم اعمال کنید.
باتشکر
عرض سلام وادب
آقا واقعا خسته نباشد مثل همیشه عالی بود
شاد وسربلند وپیروز باشید
سلام دوست عزیز
ممنون از لطف و محبت شما
سلام جناب مهندس اکبری
من این پروژه روکامل انجام دادم فقط تنهامشکلی که دارم این که بدن صفر okمیزنه وتغییر پسورد هم نمیتونم انجام بدم
زمانی که واسه تغییر پسوروارد میشم هشتا صفر میزنم بعد میگه پسورد جدید بده ولی هر چی که میزنم ارورمیده
فقط من بجای اون کیپدی که شما گذاشتید از گیپدفلتی استفاده کردم
اگه راهنمایی کنید ممنون میشم
سلام دوست عزیز
مشکل شما در ترتیب پایه های صفحه کلید است که با صفحه کلید مورد استفاده ما متفاوت است و به همین دلیل اعداد به صورت جابجا وارد می شوند. برای رفع این موضوع باید ترتیب پایه های صفحه کلید که به برد آردوینو متصل شده اند را مطابق با نحوه اتصالات کلیدهای صفحه کلید خود تغییر دهید.
عرض سلام وادب جناب مهندس
من متاسفانه اول نظرات رو کامل چک نکرد وپیام دادم که بابت این موضوع معذرت خواهی میکنم واینکه مشکل من با اضافه کردن دستوری که گذاشته بودید به خط 53مشکلم حل شد یعنی فقط کافی بود حافظه ایپرام رو برگردونم به حالت پیش فرض
درضمن این مشکل زمانی پیش اومد که دستور پاک کردن حافظه رو اجراءکردم چیزی که من دیدم چنتا از دوستان دیگه هم که این کارروکرده بودن دچار همین مشکل شده بودن که با زدن کلید مربع بدون شماره فقل باز میشه
بهرحال ازتون صمصمانه متشکرم جناب مهندس خیلی عالیه من که لذت میبرم وازشمتا کمال تشکر رودارم
سلام دوست عزیز
بسیار خوشحالیم که توانسته اید پروژه را با موفقیت راه اندازی کنید.
با سپاس فراوان از لطف و محبت شما
با سلام و خسته نباشید من این مدار رو با نرم افزار پروتیوس اجرا کردم همه قسمت ها ی مدار درست کار می کنه و در آخر هم پسورد جدید رو می خواد ولی وقتی می خوام پسورد رو وارد کنم کیبوردم اصلا کار نمی کنه و غیر فعاله
سلام دوست عزیز
شاید صفحه کلید مورد استفاده شما در نرم افزار پروتئوس غیرفعال است و امکان شبیه سازی ندارد. بهتر است خودتان با تک سوئیچ در محیط نرم افزار یک صفحه کلید بسازید.
خیلی ممنونم حل شد اتصالاتم ایراد داشت الان مدارم درست کار می کنه فقط led که برای تست اتصال رله گذاشتم از اول تا آخر روشن می مونه
خواهش می کنم
اگر رله شما به صورت مداوم روشن است باید اتصالات مربوط به ترانزیستور و رله را به صورت دقیق با یک مولتی متر بررسی کنید.