Ders – 26 Keypad ile Şifreli giriş sistemi

Arkadaşlar merhaba ;

bu günki uygulamamızda keypad ile şifre girerek servo ile kapı kilit veya herhangi başka bir işlem yapmasını sağlayacağız bunun için ilk olarak yapmanız gereken IDE üzerinden keypad kütüphanesini aratıp bulup kurmak olacaktır bu işlemi yaptıktan sonra aşşağıdaki şema ya bakarak bağlantımızı yapıyoruz

bağlantımızı yaptıktan sonra kod aşamasına geçmeden kodun içerisindeki şifre kısmına belirleyeceğiniz şifreyi tanımlamanız gerekmektedir

#include <Keypad.h>
#include <MD_Parola.h>
#include <MD_MAX72XX.h>
#include <Servo.h>

// MAX7219 ayarları (Software SPI - Analog pinler)
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define DIN_PIN A0
#define CS_PIN  A1
#define CLK_PIN A2

MD_Parola display = MD_Parola(HARDWARE_TYPE, DIN_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

// Servo
Servo kapiServo;
#define SERVO_PIN 11
#define KAPI_ACIK  90
#define KAPI_KAPALI 0

// Keypad
const byte ROWS = 4;
const byte 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 keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

// Kullanıcı sistemi - MAX 30 kişi
#define MAX_KULLANICI 30
#define SIFRE_UZUNLUK 6

struct Kullanici {
  char sifre[SIFRE_UZUNLUK + 1];
  char isim[16];
};

// Kullanıcı listesi - buraya ekleyebilirsin (max 30)
Kullanici kullanicilar[] = {
  {"1234",   "Mesut"},
  {"5678",   "Ahmet"},
  // Buraya yeni kullanıcı ekle:
  // {"SIFRE", "ISIM"},
};
int kullaniciSayisi = sizeof(kullanicilar) / sizeof(kullanicilar[0]);

// Şifre giriş değişkenleri
char girilenSifre[SIFRE_UZUNLUK + 1] = "";
int sifireUzunluk = 0;
char yildizlar[SIFRE_UZUNLUK + 2] = "";

// Durum
bool kapiAcik = false;
unsigned long kapiZamani = 0;
#define KAPI_SURE 3000 // 3 saniye açık kalır

void setup() {
  Serial.begin(9600);

  // Servo
  kapiServo.attach(SERVO_PIN);
  kapiServo.write(KAPI_KAPALI);

  // Dot Matrix
  display.begin();
  display.setIntensity(8);
  display.displayClear();
  display.setTextAlignment(PA_CENTER);
  display.print("SIFRE:");

  Serial.println("Sistem hazir!");
  Serial.print("Tanimli kullanici sayisi: ");
  Serial.println(kullaniciSayisi);
}

// Kullanıcı ara, bulursa isim döndür
char* kullaniciBul(char* sifre) {
  for (int i = 0; i < kullaniciSayisi; i++) {
    if (strcmp(kullanicilar[i].sifre, sifre) == 0) {
      return kullanicilar[i].isim;
    }
  }
  return NULL;
}

// Yıldız güncelle
void yildizGuncelle() {
  for (int i = 0; i < sifireUzunluk; i++) {
    yildizlar[i] = '*';
  }
  yildizlar[sifireUzunluk] = '\0';

  if (sifireUzunluk == 0) {
    display.print("SIFRE:");
  } else {
    display.print(yildizlar);
  }
}

// Kapıyı aç
void kapiAc(char* isim) {
  char mesaj[32];
  sprintf(mesaj, "Hos geldin %s !", isim);

  Serial.println(mesaj);

  display.setTextAlignment(PA_LEFT);
  display.displayScroll(mesaj, PA_LEFT, PA_SCROLL_LEFT, 80);

  kapiServo.write(KAPI_ACIK);
  kapiAcik = true;
  kapiZamani = millis();
}

// Hata göster
void hataGoster() {
  Serial.println("Tanimsiz sifre!");

  display.setTextAlignment(PA_LEFT);
  display.displayScroll("Tanimsiz Sifre !", PA_LEFT, PA_SCROLL_LEFT, 80);

  // Servo açılmıyor
}

// Sıfırla
void sifirla() {
  girilenSifre[0] = '\0';
  sifireUzunluk = 0;
  yildizlar[0] = '\0';
  display.setTextAlignment(PA_CENTER);
  display.displayClear();
  display.print("SIFRE:");
}

void loop() {
  // Kapı süre kontrolü
  if (kapiAcik && millis() - kapiZamani >= KAPI_SURE) {
    kapiServo.write(KAPI_KAPALI);
    kapiAcik = false;
    delay(500);
    sifirla();
  }

  // Scrolling animasyon güncelle
  if (display.displayAnimate()) {
    if (kapiAcik || !kapiAcik) {
      // animasyon bitti, sıfırla bekliyorsa
    }
  }

  // Kapı açıksa keypad okuma
  if (kapiAcik) return;

  char tus = keypad.getKey();
  if (!tus) return;

  Serial.print("Tus: "); Serial.println(tus);

  if (tus == '#') {
    // Onayla
    if (sifireUzunluk > 0) {
      girilenSifre[sifireUzunluk] = '\0';
      char* bulunanIsim = kullaniciBul(girilenSifre);
      if (bulunanIsim != NULL) {
        kapiAc(bulunanIsim);
      } else {
        hataGoster();
        delay(2000);
        sifirla();
      }
    }
  } else if (tus == '*') {
    // Sil
    if (sifireUzunluk > 0) {
      sifireUzunluk--;
      girilenSifre[sifireUzunluk] = '\0';
      yildizGuncelle();
    }
  } else {
    // Rakam veya harf ekle
    if (sifireUzunluk < SIFRE_UZUNLUK) {
      girilenSifre[sifireUzunluk] = tus;
      sifireUzunluk++;
      yildizGuncelle();
    }
  }
}