آردوینو, پروژه آردوینو

پروژه ساخت قفل رمزی با آردوینو

پروژه آموزش ساخت قفل رمزی با آردوینو

در این پروژه می‌آموزیم که چگونه اقدام به ساخت قفل رمزی با آردوینو بکنیم. با توجه به افزایش روزافزون سرقت‌ها، تأمین امنیت بیش از پیش اهمیت پیدا می‌کند بنابراین داشتن یک قفل با رمز دیجیتالی جهت فراهم کردن ایمنی منزل یا محل کار، امری ضروری به نظر می‌رسد. در واقع با این قفل، تنها زمانی درب باز خواهد شد که رمز به‌درستی وارد شود.

مدار این پروژه الکترونیکی بسیار ساده است زیرا تنها برد آردوینو، ماژول کی‌پد، بازر، سروو موتور و یک LCD دارد. آردوینو برای کنترل تمامی فرآیندها نظیر دریافت پسورد از ماژول کی‌پد، مقایسه آنها، راه‌اندازی بازر، چرخاندن سروو موتور و ارسال وضعیت به LCD به کار می‌رود. خودِ کی‌پد نیز جهت وارد کردن پسورد استفاده می‌شود. بازر هم برای بررسی وضعیت و سروو موتور برای باز کردن درب در زمان چرخیدن به کار خواهد رفت. در نهایت LCD هم وظیفه نمایش پیام‌ها را بر عهده دارد.

فهرست مطالب

لوازم مورد نیاز برای ساخت قفل رمزی با آردوینو

در ادامه لیست لوازم مورد نیاز برای ساخت قفل رمزی با آردوینو را مشاهده می‌کنید که با کلیک روی نام هر کدام از آنها، امکان خرید را خواهید داشت.

شماتیک و نمای فیبر مدار چاپی پروژه ساخت قفل رمزی با آردوینو

اتصالات و دیاگرام مدار پروژه ساخت قفل رمزی با آردوینو
اتصالات و دیاگرام مدار پروژه ساخت قفل رمزی با آردوینو

مدار یا شماتیک برد این پروژه بسیار ساده است. شما برای راه‌اندازی آن می‌توانید از نرم‌افزار Fritzing استفاده کنید.

در مرحله اول باید به کی‌پد 4×3 اتصالی را برقرار کنیم. برای متصل کردن این ماژول به آردوینو، از پین‌های دیجیتالی D1 تا D7 استفاده خواهیم کرد. تمامی هفت پین کی‌پد را به پین‌های D1 تا D7 آردوینو متصل نمایید.

برای وصل کردن سروو موتور به آردوینو، از پین دیجیتالی D9 روی آردوینو بهره ببرید تا پین PWM سروو موتور خروجی دهد. حالا سیم مثبت بازر را به پین D10 آردوینو و سیم منفی را به زمین وصل کنید.

حالا سراغ متصل کردن صفحه نمایش LCD دارای ابعاد 2×16 به آردوینو می‌رویم:

1) پین‌های 1، 3، 5 و 16 نمایشگر LCD را به پین زمین یا GND وصل کنید.

2) پین‌های 2 و 15 نمایشگر LCD را به پین VCC یا 5 ولت آردوینو وصل کنید.

3) پین 4 نمایشگر LCD را به پین A0 آردوینو وصل کنید.

4) پین 6 نمایشگر LCD را به پین A1 آردوینو وصل کنید.

5) پین 11 نمایشگر LCD را به پین A2 آردوینو وصل کنید.

6) پین 12 نمایشگر LCD را به پین A3 آردوینو وصل کنید.

7) پین 13 نمایشگر LCD را به پین A4 آردوینو وصل کنید.

8) پین 14 نمایشگر LCD را به پین A5 آردوینو وصل کنید.

در ادامه می‌توانید تصویری از نوعی دیگر از شماتیک پروژه ساخت قفل رمزی با آردوینو را مشاهده نمایید که با نرم‌افزار EasyEDA طراحی شده است. در اینجا برد آردوینو Nano به جای آردوینو Uno به کار رفته است.

اتصالات و دیاگرام مدار پروژه ساخت قفل رمزی با برد آردوینو نانو
اتصالات و دیاگرام مدار پروژه ساخت قفل رمزی با برد آردوینو نانو

شماتیک و نمای فیبر مدار چاپی پروژه ساخت قفل رمزی با آردوینو

اگر نمی‌خواهید مدار این پروژه را روی برد بورد راه‌اندازی کنید، می‌بایست PCB خود را شبیه چیزی مانند تصاویر درآورید.

فیبر مدار چاپی برد قفل رمزی با آردوینو
تصویر بالا: روی برد | تصویر پایین: زیر برد

نحوه کار کردن پسورد پروژه ساخت قفل رمزی با آردوینو

در پروژه‌ای که در این مطلب به شما آموزش داده‌ایم، رمز پیش‌فرض در آردوینو 4567 است. البته شما می‌توانید آن را با کدنویسی تغییر دهید. وقتی کلمه عبوری را وارد می‌کنید، به صورت اتوماتیک با پسورد ذخیره شده در آردوینو مطابقت داده می‌شود. در ادامه اگر درست بود، عبارت Access Granted, Welcome به معنی “دسترسی داده شد، خوش آمدید” نوشته و سروو موتور درب را به اندازه 180 درجه می‌چرخاند و درب باز خواهد شد. سپس 5 ثانیه وقت خواهید داشت تا وارد شوید. زمانی که 5 ثانیه به اتمام رسید، درب باز هم به صورت خودکار بسته خواهد شد.

در سمت دیگر، اگر پسورد اشتباه بود، عبارت Code Incorrect, Go Away به معنای “رمز اشتباه است، دور شوید” نمایش داده خواهد شد. در ادامه اگر کلیدی فشار داده شد، بازر صدای بیپ خواهد داد.

برد قفل رمزی با آردوینو در زمان فعالیت
برد قفل رمزی با آردوینو در زمان فعالیت

منبع کد و برنامه‌نویسی پروژه ساخت قفل رمزی با آردوینو

کدهای مورد نیاز برای ساخت قفل رمزی با آردوینو در ادامه آورده شده است. شما می‌توانید با استفاده از برنامه Arduino IDE آنها را به سادگی هر چه تمام‌تر کپی و پیست کنید. سپس آنها را وارد برنامه و در نهایت در میکروکنترلر ATmega328 آپلود نمایید. ضمناً، می‌توانید کتابخانه مربوط به Keypad.h را نیز از لینک زیر دانلود کنید.

				
					#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Servo.h>
Servo myservo;
int pos=0; // LCD Connections
LiquidCrystal lcd(A0,A1,A2,A3,A4,A5);
const byte rows=4;
const byte cols=3;
 
char key[rows][cols]={
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins[rows]={1,2,3,4};
byte colPins[cols]={5,6,7};
Keypad keypad= Keypad(makeKeymap(key),rowPins,colPins,rows,cols);
char* password="4567";
int currentposition=0;
int redled=10;
int greenled=11;
int buzz=8;
int invalidcount=12;
 
 
 
void setup()
{
 
displayscreen();
Serial.begin(9600);
pinMode(redled, OUTPUT);
pinMode(greenled, OUTPUT);
pinMode(buzz, OUTPUT);
myservo.attach(9); //SERVO ATTACHED//
 
lcd.begin(16,2);
 
}
 
void loop()
{
if( currentposition==0)
{
displayscreen();
 
}
int l ;
char code=keypad.getKey();
if(code!=NO_KEY)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("PASSWORD:");
lcd.setCursor(7,1);
lcd.print(" ");
lcd.setCursor(7,1);
for(l=0;l<=currentposition;++l)
{
 
lcd.print("*");
keypress();
}
 
if (code==password[currentposition])
{
++currentposition;
if(currentposition==4)
{
 
unlockdoor();
currentposition=0;
 
}
 
}
 
else
{
++invalidcount;
incorrect();
currentposition=0;
 
}
if(invalidcount==5)
{
 
++invalidcount;
torture1();
 
}
if(invalidcount==8)
{
torture2();
}
 
}
// LOOP ENDS!!!//
}
 
//********OPEN THE DOOR FUNCTION!!!!***********//
 
void unlockdoor()
{
delay(900);
 
lcd.setCursor(0,0);
lcd.println(" ");
lcd.setCursor(1,0);
lcd.print("Access Granted");
lcd.setCursor(4,1);
lcd.println("WELCOME!!");
lcd.setCursor(15,1);
lcd.println(" ");
lcd.setCursor(16,1);
lcd.println(" ");
lcd.setCursor(14,1);
lcd.println(" ");
lcd.setCursor(13,1);
lcd.println(" ");
unlockbuzz();
 
for(pos = 180; pos>=0; pos-=5) // goes from 180 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(5); // waits 15ms for the servo to reach the position
}
delay(2000);
 
 
 
delay(1000);
counterbeep();
 
delay(1000);
 
for(pos = 0; pos <= 180; pos +=5) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15);
 
 
currentposition=0;
 
lcd.clear();
displayscreen();
 
}
}
 
//************WRONG CODE FUNCTION********//
 
void incorrect()
{
delay(500);
lcd.clear();
lcd.setCursor(1,0);
lcd.print("CODE");
lcd.setCursor(6,0);
lcd.print("INCORRECT");
lcd.setCursor(15,1);
lcd.println(" ");
lcd.setCursor(4,1);
lcd.println("GET AWAY!!!");
 
lcd.setCursor(13,1);
lcd.println(" ");
Serial.println("CODE INCORRECT YOU ARE UNAUTHORIZED");
digitalWrite(redled, HIGH);
digitalWrite(buzz, HIGH);
delay(3000);
lcd.clear();
digitalWrite(redled, LOW);
digitalWrite(buzz,LOW);
displayscreen();
}
//************** CLEAR THE SCREEN!!!*************//
void clearscreen()
{
lcd.setCursor(0,0);
lcd.println(" ");
lcd.setCursor(0,1);
lcd.println(" ");
lcd.setCursor(0,2);
lcd.println(" ");
lcd.setCursor(0,3);
lcd.println(" ");
}
//**************KEYPRESS********************//
void keypress()
{
 
 
 
digitalWrite(buzz, HIGH);
delay(50);
digitalWrite(buzz, LOW);
}
//********DISPALAY FUNCTION!!!*************//
void displayscreen()
{
 
lcd.setCursor(0,0);
lcd.println("*ENTER THE CODE*");
lcd.setCursor(1 ,1);
 
lcd.println("TO _/_ (OPEN)!!");
}
//*************** ARM SERVO***********//
void armservo()
{
 
for (pos=180;pos<=180;pos+=50)
{
myservo.write(pos);
delay(5);
}
delay(5000);
 
for(pos=180;pos>=0;pos-=50)
{
myservo.write(pos);
}
 
}
//**********UNLOCK BUZZ*************//
void unlockbuzz()
{
 
digitalWrite(buzz, HIGH);
delay(80);
digitalWrite(buzz, LOW);
delay(80);
digitalWrite(buzz, HIGH);
delay(80);
digitalWrite(buzz, LOW);
delay(200);
digitalWrite(buzz, HIGH);
delay(80);
digitalWrite(buzz, LOW);
delay(80);
digitalWrite(buzz, HIGH);
delay(80);
digitalWrite(buzz, LOW);
delay(80);
}
 
//**********COUNTER BEEP**********//
void counterbeep()
{
delay(1200);
 
 
lcd.clear();
digitalWrite(buzz, HIGH);
 
lcd.setCursor(2,15);
lcd.println(" ");
lcd.setCursor(2,14);
lcd.println(" ");
lcd.setCursor(2,0);
delay(200);
lcd.println("GET IN WITHIN:::");
 
lcd.setCursor(4,1);
lcd.print("5");
delay(200);
lcd.clear();
lcd.setCursor(2,0);
lcd.println("GET IN WITHIN:");
digitalWrite(buzz,LOW);
delay(1000);
//2
digitalWrite(buzz, HIGH);
lcd.setCursor(2,0);
lcd.println("GET IN WITHIN:");
lcd.setCursor(4,1); //2
lcd.print("4");
delay(100);
lcd.clear();
lcd.setCursor(2,0);
lcd.println("GET IN WITHIN:");
digitalWrite(buzz,LOW);
delay(1000);
//3
digitalWrite(buzz, HIGH);
lcd.setCursor(2,0);
lcd.println("GET IN WITHIN:");
lcd.setCursor(4,1); //3
lcd.print("3");
delay(100);
lcd.clear();
lcd.setCursor(2,0);
lcd.println("GET IN WITHIN:");
digitalWrite(buzz,LOW);
delay(1000);
//4
digitalWrite(buzz, HIGH);
lcd.setCursor(2,0);
lcd.println("GET IN WITHIN:");
lcd.setCursor(4,1); //4
lcd.print("2");
delay(100);
lcd.clear();
lcd.setCursor(2,0);
lcd.println("GET IN WITHIN:");
digitalWrite(buzz,LOW);
delay(1000);
//
digitalWrite(buzz, HIGH);
lcd.setCursor(4,1);
lcd.print("1");
delay(100);
lcd.clear();
lcd.setCursor(2,0);
lcd.println("GET IN WITHIN::");
digitalWrite(buzz,LOW);
delay(1000);
//5
digitalWrite(buzz, HIGH);
delay(40);
digitalWrite(buzz,LOW);
delay(40);
digitalWrite(buzz, HIGH);
delay(40);
digitalWrite(buzz,LOW);
delay(40);
digitalWrite(buzz, HIGH);
delay(40);
digitalWrite(buzz,LOW);
delay(40);
digitalWrite(buzz, HIGH);
delay(40);
digitalWrite(buzz,LOW);
lcd.clear();
lcd.setCursor(2,0);
lcd.print("RE-LOCKING");
delay(500);
lcd.setCursor(12,0);
lcd.print(".");
delay(500);
lcd.setCursor(13,0);
lcd.print(".");
delay(500);
lcd.setCursor(14,0);
lcd.print(".");
delay(400);
lcd.clear();
lcd.setCursor(4,0);
lcd.print("LOCKED!");
delay(440);
}
//*********TORTURE1***********//
void torture1()
{
delay(1000);
lcd.clear();
lcd.setCursor(2,0);
lcd.print("WAIT FOR ");
lcd.setCursor(5,1);
lcd.print("15 SECONDS");
digitalWrite(buzz, HIGH);
delay(15000);
digitalWrite(buzz, LOW);
lcd.clear();
lcd.setCursor(2,0);
lcd.print("LOL..");
lcd.setCursor(1,1);
lcd.print(" HOW WAS THAT??");
delay(3500);
lcd.clear();
 
}
//*****TORTURE2*****//
void torture2()
{
delay(1000);
lcd.setCursor(1,0);
lcd.print(" ");
lcd.setCursor(2,0);
lcd.print("EAR DRUMS ARE");
lcd.setCursor(0,1);
lcd.print(" PRECIOUS!! ");
delay(1500);
lcd.clear();
lcd.setCursor(1,0);
lcd.print(" WAIT FOR");
lcd.setCursor(4,1);
lcd.print(" 1 MINUTE");
digitalWrite(buzz, HIGH);
delay(55000);
counterbeep();
lcd.clear();
digitalWrite(buzz, LOW);
lcd.setCursor(2,0);
lcd.print("WANT ME TO");
lcd.setCursor(1,1);
lcd.print("REDICULE MORE??");
delay(2500);
lcd.clear();
lcd.setCursor(2,0);
lcd.print("Ha Ha Ha Ha");
delay(1700);
lcd.clear();
}
				
			

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *