🚨 درس 96: سیستم امنیتی کامل

کی‌پد، PIR، بوق و LCD — با رمز ماندگار در EEPROM و سه حالت.

سطح: پیشرفته · زمان: حدود 24 دقیقه · مفاهیم: EEPROM، PIR، کی‌پد، ماشین حالت

قدم‌های این درس

  1. چرا؟ دزدگیر واقعی چطور فکر می‌کند
  2. قدم ۱ — مدار
  3. قدم ۲ — کد: سه حالت و رمز
  4. قدم ۳ — EEPROM: رمز ماندگار
  5. اشتباه رایج: آژیر فوری هنگام خروج
  6. چالش: تأخیر خروج و سه بار اشتباه

نمونه‌ای از کد این درس

// سیستم امنیتی: A = مسلح، رمز + # = خاموش، C = رمز جدید (در EEPROM)
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <EEPROM.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);
char DIGITS[10] = {'0','1','2','3','4','5','6','7','8','9'};
const int PIR = 10, BUZZ = 12, LED = 13;
const int DISARMED = 0, ARMED = 1, ALARM = 2;
int state = DISARMED;
int pin[4] = {1, 2, 3, 4};
int typed[4];
int count = 0;
bool changing = false;

void show() {
  lcd.clear();
  if (state == DISARMED) lcd.print("Khamoush  A=on");
  if (state == ARMED) lcd.print("Mosalah");
  if (state == ALARM) lcd.print("!!! DOZD !!!");
  lcd.setCursor(0, 1);
  lcd.print(changing ? "Ramz jadid:" : "Ramz:");
  for (int i = 0; i < count; i++) lcd.print("*");
}

void setup() {
  pinMode(PIR, INPUT);
  pinMode(LED, OUTPUT);
  lcd.init(); lcd.backlight();
  if (EEPROM.read(10) == 42) {              // a PIN was saved before
    for (int i = 0; i < 4; i++) pin[i] = EEPROM.read(i);
  }
  show();
}

void loop() {
  if (state == ARMED && digitalRead(PIR) == HIGH) { state = ALARM; show(); }
  bool blink = millis() % 500 < 250;
  if (state == ALARM) { tone(BUZZ, blink ? 2000 : 1500); digitalWrite(LED, blink); }
  else { noTone(BUZZ); digitalWrite(LED, state == ARMED); }

  char k = pad.getKey();
  if (!k) return;
  for (int d = 0; d < 10; d++) {
    if (k == DIGITS[d] && count < 4) { typed[count] = d; count++; }
  }
  if (k == 'A' && state == DISARMED) state = ARMED;
  if (k == 'C' && state == DISARMED) { changing = true; count = 0; }
  if (k == '*') { count = 0; changing = false; }
  if (k == '#' && count == 4) {
    bool same = true;
    for (int i = 0; i < 4; i++) if (typed[i] != pin[i]) same = false;
    if (changing) {
      for (int i = 0; i < 4; i++) { pin[i] = typed[i]; EEPROM.update(i, typed[i]); }
      EEPROM.update(10, 42);
      changing = false;
    } else if (same) state = DISARMED;
    count = 0;
  }
  show();
}

چرا این درس؟

دوره‌ی تینکرکد فارسی تعاملی است: هر قدم را خودت داخل شبیه‌ساز انجام می‌دهی — مدار واقعی می‌چینی، کد واقعی اجرا می‌کنی و نتیجه را همان لحظه می‌بینی. این درس روی درس‌های قبلی ساخته شده، پس اگر تازه شروع کرده‌ای از درس ۱ بیا!

این درس را رایگان در شبیه‌ساز شروع کن 🎓

درس‌های دیگر دوره

🥤

درس 95: دستگاه فروش خودکار

🐍

درس 97: بازی مار روی ماتریس LED