ساخت قفل رمزی با قابلیت تغییر رمز ورود
در این پروژه آردوینو از مبحث آموزش آردوینو می خواهیم شما را با نحوه برنامه نویسی و ساخت یک قفل رمزی دیجیتالی با برد آردوینو 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 را نصب کنید. فایل این کتابخانه در ادامه همین مطلب پیوست فایل پروژه جهت دانلود قرار داده شده است. همچنین در صورتیکه به نحوه نصب کتابخانه در آردوینو آشنا نیستید می توانید ویدیو آموزشی این مطلب را که در زیر درج شده است را مشاهده نمائید.
سلام دوست عزیز
این بخش از برنامه بسیار ساده است، تابع نوشتن (EEP_Write_String)، حافظه EEprom میکروکنترلر را به پارت هایی با 32 خانه تقسیم می کند، این به این معنا است که شما می توانید یک رشته با طول حداکثر 32 کاراکتر را درون هر پارت ذخیره کنید. و زمانیکه شما تابع نوشتن را صدا می زنید باید شماره پارتی که می خواهید در آن بنویسید و متغیر مورد نظر خود را برای این تابع ارسال کنید. و در تابع خواندن (EEP_Read_String) نیز تنها شماره پارتی که متغیر خود را در آن ذخیره کرده اید را برای تابع ارسال می کنید و در نهایت تابع به شما مقدار متغیر ذخیره شده را بر می گرداند.
سلام ردیفc2 کی پد کار نمی کنه اغداد 2 5 8 0 کار نمی کنه
سلام دوست عزیز
بهتر است درستی اتصالات کیپد به برد آردوینو را بررسی نمائید، همچنین با یک مولتی متر آزمایش کنید که آیا اتصال تمامی پایه های کیپد به برد آردوینو که توسط سیم انجام شده برقرار است یا خیر.
سلام.خسته نباشید آقای اکبری.در پاسخ به سوال آقای عرفان(در سوالات بالا) که با فشار دادن یک کلید در کیپد رله غیر فعال بشود.تمام کار هایی را که گفته بودید را انجام دادم واین حلقه شرطی را اضافه کردم.اما در خط 54 برنامه ERROR میدهد.لطفا راهنمایی ام کنید.با تشکر!
سلام دوست عزیز
در برنامه اصلی پروژه خط 113 الی 124 برنامه را پیدا کنید. (یعنی قطع کد زیر):
و آنرا به شکل زیر تغییر دهید:
در کد بالا بعد از فعال شدن رله و باز شدن درب تا زمانیکه شما کلید 0 را فشار ندهید رله غیر فعال نمی شود.
با سلام و خسته نباشید به آقای اکبری.ببخشید من این پروژه با موفقیت راه اندازی کردم اما ناگهان ناخواسته یک اتصال کوتاه در حین کارکردن با پروژه رخ داد.از آن به بعد هر چه قدر رمز را وارد می کنم قفل باز نمی شود(تمام اجزای پروژه تا آنجایی که می دانم سالم هستند)سپس به پاسخ آقای امیر(در سوالات بالا)مراجعه کردم و دستوراتی که فرموده بودید(درمورد پاک کردن حافظه EEPROM) مو به مو انجام دادم ولی الآن بدون اینکه رمز را وارد کنم بافشردن کلید (مربع) قفل بار می شود لطفا راهنمایی کنید.باتشکر از شما استاد گرامی!!
سلام دوست عزیز
به احتمال بسیار زیاد پایه خروجی برد آردوینو که توسط آن رله قفل برقی را راه اندازی می شود آسیب دیده است. برای رفع این مشکل می توانید پایه خروجی رله را در برنامه آردوینو با یک پایه دیگر عوض کنید.
باسلام.خیلی ممنون بابت راهنمایی شما استاد گرامی!!
سلام خسته نباشید ببخشید میتونم از برد i2cاستفاده کنم در این پروژه و باید چه کد هایی رو تغییر بدم ممنون
سلام دوست عزیز
منظورتون از برد i2c چه بردی است؟ لطفا سوال خود را کاملتر بیان کنید.
(EEP_Read_String(1).length() > 8) { سلام خسته نباشید یک سوال داشتم که تابعlengthرو چرا استفاده میکنید کاردبردن چی هست میشه یک توضیح در مورد این تایع بهم بدین
سلام دوست عزیز
در این پروژه رمز پیش فرض برای اولین بار که از مدار استفاده می کنید “00000000” است، دستور فوق در زمان شروع به کار مدار، حافظه EEprom میکروکنترلر را بررسی می کند تا اگر، هنوز هیچ رمز عبوری بر روی حافظه میکروکنترلر تنظیم نشده باشد، رمز پیش فرض را بر روی حافظه EEprom میکروکنترلر اعمال کند.
الان تابهlengthکارش اینه کا در حافضه میکروکنترلر ذخیره سازه کنه نوشتیدlengthبزرگ تر از 8 یعنی همون عدد رمزون که هشت رقمیه بروه یک خونه از eepromرو بخون منظورتون اینه
سلام دوست عزیز
با استفاده از دستور length طول رشته ای که در خانه حافظه شماره یک، که مربوط به ذخیره سازی رمز عبور است را برمیگردانیم و در صورتیکه طول رشته بیشتر از 8 کاراکتر باشد، یعنی هیچ رمز عبوری در خانه شماره یک حافظه میکروکنترلر ذخیره نشده است.
سلام زخسته نباشید دستورbreakو اونجایی رو که نوشتین1-رو توضیح بدین