🔐 قفل رمزی با کیپد و LCD
پروژهای که همهی چیزهایی که یاد گرفتهای را کنار هم میگذارد: ورودی، نمایشگر، منطق و یک عملگر.
قطعات
- کیپد ماتریسی ۴×۴
- نمایشگر LCD (ترجیحاً I2C)
- سروو یا LED سبز و قرمز
منطق
کلیدها را در یک رشته جمع کن. با # تأیید بگیر و با * پاک کن. روی نمایشگر بهجای خود رقمها ستاره نشان بده — همان کاری که هر صفحهی ورود واقعی میکند.
کد
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
const byte ROWS = 4, COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'}, {'4','5','6','B'},
{'7','8','9','C'}, {'*','0','#','D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};
Keypad pad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo lock;
String entered = "";
const String PASSWORD = "1234";
int tries = 0;
void setup() {
lcd.init(); lcd.backlight();
lock.attach(11);
lock.write(0);
lcd.print("Ramz ra bezan:");
}
void loop() {
char k = pad.getKey();
if (!k) return;
if (k == '*') { // پاک کردن
entered = "";
lcd.setCursor(0, 1); lcd.print(" ");
} else if (k == '#') { // تأیید
lcd.clear();
if (entered == PASSWORD) {
lcd.print("Baz shod :)");
lock.write(90);
delay(4000);
lock.write(0);
tries = 0;
} else {
tries++;
lcd.print("Eshtebah!");
if (tries >= 3) {
lcd.setCursor(0, 1); lcd.print("Sabr kon 10s");
delay(10000);
tries = 0;
}
delay(1500);
}
entered = "";
lcd.clear(); lcd.print("Ramz ra bezan:");
} else {
entered += k;
lcd.setCursor(entered.length() - 1, 1);
lcd.print("*"); // ستاره بهجای رقم
}
}
چرا تلاشها را محدود میکنیم؟
بدون آن، کسی میتواند همهی ۱۰۰۰۰ حالت را امتحان کند. یک تأخیر ۱۰ ثانیهای بعد از سه اشتباه، این کار را عملاً غیرممکن میکند. همین ایده پشت قفل شدن گوشی بعد از چند رمز اشتباه است.
یک هشدار صادقانه
این یک پروژهی آموزشی است، نه یک قفل امنیتی واقعی — رمز داخل کد است و هر کسی به برد دسترسی داشته باشد میتواند بخواندش.
قفل رمزی را بساز 🔐