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();
}
}
}
