 |
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
|
|
نشاط [ F.Abdelaziz ]
قوة السمعة:333
|
|
03-03-2020, 05:50 PM
المشاركة 2
|
|
تفاصيل البرنامج :
أولا : مقدمة (رأس) البرنامج :
1- يتم تضمين #include ملفات الرأس للمكتبات Keypad.h و LiquidCrystal.h و EEPROM.h .
2- إنشاء الكائن lcd من الفئة LiquidCrystal مع تحديد أطراف توصيل LCD بالاردوينو (9,8,7,6,5,4) .
3- تعريفات لوحة المفاتيح وتشمل : عدد الصفوف ROWS ، وعدد الأعمدة COLS ، والأحرف المستخدمة hexaKeys ، وأطراف توصيل الصفوف rowPins ، وأطراف توصيل الأعمدة colPins ، وأخيرا إنشاء الكائن customKeypad من الفئة Keypad بالوسائط hexaKeys و rowPins و colPins و ROWS و COLS .
4- إعلان المتغيرات العمومية Global المستخدمة فى البرنامج .
كود:
#include <Keypad.h>
#include<LiquidCrystal.h>
#include<EEPROM.h>
LiquidCrystal lcd(A0,A1,A2,A3,A4,A5);//RS,E,D4,D5,D6,D7
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
char hexaKeys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {2,3,4,5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {6,7,8,9}; //connect to the column pinouts of the keypad
//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
char password[4];// Input password
char pass[4],pass1[4];
char customKey=0;
int i=0;// password characters counter
int led=12;//Green LED connected to pin 12
int buzzer = 10;//Buzzer connected to pin 10
int relay = 11; //relay connected to pin 11
ثانيا : دالة الإعداد setup :
1- تهيئة شاشة LCD بالدالة lcd.begin .
2- تحديد وضع الأطراف relay و led و buzzer كمخارج OUTPUT .
3- طباعة رسالة افتتاحية : Electronic فى السطر الأول من الشاشة و Keypad Lock فى السطر الثانى مع تأخير 2 ثانية ومسح الشاشة .
4- طباعة العبارة Enter Ur Passkey: فى السطر الأول ، ثم وضع المؤشر على أول السطر الثانى (0,1) تمهيدا لطباعة كلمة المرور المدخلة من لوحة المفاتيح .
5- سوف نستخدم EEPROM الخاص بالاردوينو لحفظ كلمة المرور ، لذلك عندما نقوم بتشغيل هذه الدائرة لأول مرة ، يقرأ البرنامج البيانات النفايات garbage من EEPROM الخاص بالاردوينو ومقارنتها بكلمة مرور الإدخال وإعطاء رسالة على شاشة LCD تم رفض الوصول Access Denied بسبب عدم مطابقة كلمة المرور. لحل هذه المشكلة ، نحتاج إلى تعيين كلمة مرور افتراضية لأول مرة باستخدام البرمجة الواردة أدناه:
كود:
for(int j=0;j<4;j++)
EEPROM.write(j, j+49); //49 = character ‘1’
for(int j=0;j<4;j++)
pass[j]=EEPROM.read(j);
سيؤدي هذا إلى ضبط كلمة المرور على "1234" على EEPROM للاردوينو وتخزينها فى المصفوفة pass .
بعد تشغيل البرنامج لأول مرة ، نحتاج إلى إزالة هذا الجزء من البرنامج ثم كتابة الكود مرة أخرى فى الاردوينو وتشغيله. الآن سوف يعمل نظامك بشكل جيد. كلمة المرور المستخدمة الآن هى "1234". يمكنك الآن تغييرها عن طريق الضغط على الزر # ثم إدخال كلمة المرور الحالية ثم إدخال كلمة المرور الجديدة.
كود:
void setup()
{
lcd.begin(16,2);
pinMode(relay, OUTPUT);//Relay output
pinMode(led, OUTPUT);
pinMode(buzzer, OUTPUT);
lcd.print(" Electronic ");
lcd.setCursor(0,1);
lcd.print(" Keypad Lock ");
delay(2000);
lcd.clear();
lcd.print("Enter Ur Passkey:");
lcd.setCursor(0,1);
//This part must remove after first run
for(int j=0;j<4;j++)
EEPROM.write(j, j+49); //49 = character ‘1’
for(int j=0;j<4;j++)
pass[j]=EEPROM.read(j);
}
ثالثا : الدالة loop :
1- فى البداية يتم تشغيل relay ليقوم بالغلق .
2- باستخدام الدالة getKey نحصل على الحرف المقابل للزر الذى تم الضغط عليه وتخزينه فى المتغير customKey
3- إذا كان الزر هو المقابل للحرف '#' يتم إستدعاء الدالة change المذكورة بعد الدالة loop .
4- إذا كان الزر أى زر آخر تكون customKey بالقيمة true ويتم تخزين الحرف فى المصفوفة password ثم بعد ذلك زيادة متغير العداد i بواحد مع طباعة الحرف على الشاشة print(customKey) ، واستدعاء الدالة beep لإصدار صفارة عند الضغط على الزر .
5- عندما يصل عداد أحرف كلمة المرور i إلى 4 أى if(i==4) ، بعد تأخير قليل يتم قراءة أحرف كلمة المرور المخزنة فى eeprom وحفظها فى المصفوفة pass >
6- تستخدم الدالة strncmp(password, pass,4) لمقارنة السلسلة password مع السلسلة pass فى مدى الأربع حروف الأولى . إذا حدث تطابق بينهما يكون عائد الدالة “0” ويكون المعكوس بالقيمة true ويتم تنفيذ ما يلى :
أ- تشغيل الليد الأخضر لبيان صحة كلمة المرور والتأهل لفتح القفل .
ب- إستدعاء الدالة beep لإطلاق صفارة .
ت- مسح الشاشة clear .
ث- طباعة Passkey Accepted .
ج- فصل الريلاى (relay, LOW) مما يؤدى لفتح القفل .
ح- التأخير 2 ثانية للسماح بقتح القفل .
خ- فى السطر الثانى يتم طباعة #.Change Passkey .
د- التأخير 2 ثانية للسماح بتغيير كلمة المرور عند الرغبة .
ذ- مسح الشاشة .
ر- طباعة Enter Passkey: مرة أخرى ووضع المؤشر على بداية السطر الثانى .
ز- تصفير متغير عداد أحرف كلمة المرور i .
س- فصل الليد الأخضر لبيان .
إذا لم else تتطابق سلسلة كلمة المرور المدخلة مع سلسلة كلمة المرور المخزنة فى eeprom يتم تنفيذ ما يلى :
أ- تأكيد تشغيل الريلاى (الغلق) (relay, HIGH) .
ب- تشغيل الصفارة (buzzer, HIGH) .
ت- مسح الشاشة clear .
ث- طباعة Access Denied... فى السطر الأول .
ج- وضع المؤشر على بداية السطر الثانى (0,1) .
ح- طباعة #.Change Passkey .
خ- التأخير 2 ثانية .
د- مسح الشاشة .
ذ- كتابة Enter Passkey: فى السطر الأول .
ر- وضع المؤشر على بداية السطر الثانى .
ز- تصفير متغير عداد أحرف كلمة المرور المدخلة i .
س- فصل الصفارة (buzzer, LOW) .
كود:
void loop()
{
digitalWrite(relay, HIGH);//Key locked
customKey = customKeypad.getKey();
if(customKey=='#')
change();
if (customKey)
{
password[i++]=customKey;// Input password
lcd.print(customKey);
beep();
}
if(i==4)//No. of input characters
{
delay(200);
for(int j=0;j<4;j++)
pass[j]=EEPROM.read(j);//Saved password
if(!(strncmp(password, pass,4)))// compare password with pass only the first four characters. returns 0, if both are equal
{ //if match
digitalWrite(led, HIGH);//Open indication
beep();
lcd.clear();
lcd.print("Passkey Accepted");
digitalWrite(relay, LOW);//Relay off , lock open
delay(2000);
lcd.setCursor(0,1);
lcd.print("#.Change Passkey");
delay(2000);
lcd.clear();
lcd.print("Enter Passkey:");
lcd.setCursor(0,1);
i=0;
digitalWrite(led, LOW);
}
else // if not match
{
digitalWrite(relay, HIGH);
digitalWrite(buzzer, HIGH);
lcd.clear();
lcd.print("Access Denied...");
lcd.setCursor(0,1);
lcd.print("#.Change Passkey");
delay(2000);
lcd.clear();
lcd.print("Enter Passkey:");
lcd.setCursor(0,1);
i=0;
digitalWrite(buzzer, LOW);
}//end of if…else
}//end of if(i==4)
}// end of loop
رابعا : الدالة change :
والتى تستدعى عند الضغط على الزر # وفيها يتم :
1- إعلان متغير محلى j كعداد لأحرف كلمة المرور المعدلة مع تعيينه بالقيمة صفر .
2- مسح الشاشة وتبعا لها وضع المؤشر فى بداية السطر الأول .
3- طباعة الرسالة UR Current Passk .
4- وضع المؤشر عند بداية السطر الثانى .
5- إنشاء حلقة while بالشرط j<4 للتكرار 4 مرات ، وفى كل مرة :
أ- الحصول على الحرف المقابل للزر المضغوط getKey وحفظه فى المتغير key .
ب- التحقق من الحرف if(key) ، وإذا كانت النتيجة true يتم :
• نسخ محتويات المتغير key إلى المصفوفة pass1 ثم زيادة العداد j بواحد .
• طباعة الحرف المقابل للمفتاح key .
• إصدار صفارة عند كل ضغطة على زر.
6- تصفير المتغير key للإعداد للحرف التالى حتى يتم الحصول على 4 أحرف .
7- التأخير 500 مللى ثانية .
8- المقارنة بين السلسلة pass1 (التعديل) والسلسلة pass (المخزنة فى eeprom ) . إذا كان هناك عدم تطابق يتم :
• مسح الشاشة .
• طباعة الرسالة Wrong Passkey... .
• وضع المؤشر عند بداية السطر الثانى .
• طباعة الرسالة Better Luck Again .
• التأخير 1 ثانية .
إما إذا كان هناك تطابق فيتم الآتى (بعد أن تم التأكيد من تطابق كلمة المرور مع كلمة المرور المحفوظة سابقا) :
• إعادة تصفير العداد j .
• مسح الشاشة .
• طباعة الرسالة Enter New Passk: .
• وضع المؤشر عند بداية السطر الثانى .
• إنشاء حلقة while بالشرط j<4 للتكرار 4 مرات وفى كل مرة يتم :
1- الحصول على الحرف المقابل للزر المضغوط وحفظه فى المتغير key .
2- اختبار حالة المتغير key فإذا كانت النتيجة true يتم :
• نسخ محتويات المتغير key إلى المصفوفة pass .
• طباعة الحرف key .
• كتابة write(j,key) الحرف (البايت) key عند العنوان j فى ذاكرة eeprom .
• زيادة متغير العداد j بواحد .
• إصدار صوت الصفارة (بيب) beep عند كل ضغطة على زر .
• التكرار 4 مرات للحصول على كلمة المرور pass المكونة من أربع أحرف .
• طباعة الرسالة Done...... .
• التأخير 1 ثانية .
• مسح الشاشة .
• طباعة الرسالة Enter Ur Passk: .
• وضع المؤشر عند بداية السطر الثانى .
• تصفير المتغير customKey والذى تغير فى loop .
كود:
void change()
{
int j=0;
lcd.clear();
lcd.print("UR Current Passk");
lcd.setCursor(0,1);
while(j<4)
{
char key=customKeypad.getKey();
if(key)
{
pass1[j++]=key;
lcd.print(key);
beep();
}//end if
key=0;
}//end while
delay(500);
if((strncmp(pass1, pass, 4)))
{
lcd.clear();
lcd.print("Wrong Passkey...");
lcd.setCursor(0,1);
lcd.print("Better Luck Again");
delay(1000);
}
else
{
j=0;
lcd.clear();
lcd.print("Enter New Passk:");
lcd.setCursor(0,1);
while(j<4)
{
char key=customKeypad.getKey();
if(key)
{
pass[j]=key;
lcd.print(key);
EEPROM.write(j,key);
j++;
beep();
}//end if
}//end while
lcd.print(" Done......");
delay(1000);
}//end else
lcd.clear();
lcd.print("Enter Ur Passk:");
lcd.setCursor(0,1);
customKey=0;
} // end of void change
خامسا : الدالة beep
وفيها يتم تشغيل الصفارة ، والتأخير 20 مللى ثانية ، ثم فصل الصفارة .
كود:
void beep()
{
digitalWrite(buzzer, HIGH);
delay(20);
digitalWrite(buzzer, LOW);
}
|