فكرة المشروع:
في هذا المشروع سنصمّم قفلاً إلكترونياً بسيطاً باستخدام الأردوينو. يعتمد القفل على الجويستك لإدخال كلمة المرور، ويقوم السيرفو بفتح أو غلق القفل عند إدخال الكلمة الصحيحة. شاشة LCD تعرض رسائل توضيحية للمستخدم طوال العملية. يمكن تعديل كلمة المرور بسهولة. هذا المشروع عملي ومناسب للمبتدئين لفهم التفاعل بين الأردوينو والمكونات المحيطية.
الأدوات المستعملة و وظيفة كل أداة:
- Arduino Uno: العقل المدبر للمشروع، يتحكم في كل الأجهزة المتصلة.
- Joystick Module: يستخدم لإدخال كلمة المرور عن طريق الحركة في الاتجاهات المختلفة.
- Servo Motor: مسؤول عن فتح وإغلاق القفل فعلياً.
- 16x2 LCD Screen: لعرض الرسائل والإشعارات للمستخدم.
- أسلاك توصيل:
- Male to Male: لتوصيل المكونات على لوحة التجارب و الأردوينو.
- Male to Female: لتوصيل الأردوينو ولوحة التجارب بالمكونات الخارجية مثل الشاشة أو الجويستك.
- Laptop: يُستخدم كمصدر طاقة لتشغيل الأردوينو والمكونات الأخرى، وأيضاً لكتابة الكود وتحميله على الأردوينو.
- USB Cable (Type A to B): يربط اللابتوب بالأردوينو لتغذية الدائرة وبرمجة الأردوينو.
- لوحة تجارب (Breadboard): لتجميع الدائرة بدون لحام وتجربة الاتصالات.
مخطط المشروع:
الكود الأساسي للتشغيل على الأردوينو:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#define VRX_PIN A0
#define VRY_PIN A1
#define SW_PIN 2
#define LEFT_THRESHOLD 400
#define RIGHT_THRESHOLD 800
#define UP_THRESHOLD 400
#define DOWN_THRESHOLD 800
#define CMD_NONE 0
#define CMD_UP 1
#define CMD_DOWN 2
#define CMD_LEFT 3
#define CMD_RIGHT 4
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo servo;
String currentPassword = "ABCA";
String currentInput = "";
int inputCount = 0;
enum STATE {CLOSED, OPEN};
STATE currentState = CLOSED;
void setup() {
Serial.begin(9600);
pinMode(SW_PIN, INPUT_PULLUP);
servo.attach(9);
servo.write(0);
lcd.init();
lcd.backlight();
ShowStartScreen();
}
void loop() {
int command = ReadJoystick();
if (currentState == CLOSED) {
if (command == CMD_UP) AddInput('A');
if (command == CMD_LEFT) AddInput('B');
if (command == CMD_DOWN) AddInput('C');
if (command == CMD_RIGHT) AddInput('D');
if (inputCount == 4) {
delay(200);
if (currentInput == currentPassword) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Correct!");
servo.write(180);
currentState = OPEN;
currentInput = "";
inputCount = 0;
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Incorrect!");
delay(1000);
ShowStartScreen();
}
}
} else if (currentState == OPEN) {
if (digitalRead(SW_PIN) == LOW) {
delay(200);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Closing...");
servo.write(0);
delay(500);
ShowStartScreen();
currentState = CLOSED;
}
}
}
void ShowStartScreen() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Input Password:");
lcd.setCursor(0, 1);
currentInput = "";
inputCount = 0;
}
void AddInput(char ch) {
lcd.setCursor(inputCount, 1);
lcd.print(ch);
currentInput += ch;
inputCount++;
delay(300);
}
int ReadJoystick() {
int x = analogRead(VRX_PIN);
int y = analogRead(VRY_PIN);
if (y < UP_THRESHOLD) return CMD_UP;
if (x < LEFT_THRESHOLD) return CMD_LEFT;
if (y > DOWN_THRESHOLD) return CMD_DOWN;
if (x > RIGHT_THRESHOLD) return CMD_RIGHT;
return CMD_NONE;
}
تشغيل القفل الإلكتروني على الواقع:
إذا نفذتم المشروع أو عدلتم في الكود، شنو الميزة اللي حابين تضيفوها؟ 🤔💡 شاركونا تجاربكم أو ملاحظاتكم في التعليقات 💬




