Arduino Parmak İzi ile Yoklama Alma Projesi

Bu projede, Arduino©, parmak izi okuyucu sensör ve kart okuyucu modül kullanılarak girişçıkış kaydı yapabilen ve bu kayıtları saklama özelliğine sahip bir yoklama sistemi oluşturmak amaçlanmıştır. Projede, parmak izi okuyuculu ve bir kart okuma modülüne sahip bir prototip tasarımı ve imalatı yapılacaktır. Bu sayede mobil parmak izi kaydı yapabilen ve bu kayıtları tutabilen bir sistem oluşturulacaktır.


Bu sistem sayesinde; okullarda yoklama sistemlerinden kaynaklanan birbirinin yerine imza atma, önceden sonraki günlere imza atma, imza kâğıtlarının kaybolması, hocaların yoklama listelerini sisteme geçerken oluşan zaman kaybı ve iş yükünün ortadan kaldırılması sağlanmaya çalışılacaktır

Bu proje kapsamında okullarda ve özellikle üniversite bünyesinde bulunan ögrenciler ve öğretmenlerin yoklama ile ilgili yaşadıkları problemin önüne geçmek amaçlanmıştır. Aynı zamanda da yoklama işleminin düzenlenmesi, kayıt altına alınması gibi zaman kaybına sebep olan işlerin de önüne geçmek hedeflenmiştir. Bu çalışma sayesinde okullarda ve üniversitelerde öğrencilerin devam takibi verimli bir hale gelecek ve bu konu artık zaman ayrılması gereken bir şey olmayacaktır. İlgili şemadan da anlaşılacağı üzere parmak izi ile okunan veriler Arduino© vasıtası ile hem kayıt altına alınmakta hem de real time clock aparatı vesilesi ile okuma işlemi yapılırken tarihi ve saati SD kart modülüne kayıt edebilmektedir.

Günümüzde el ile yapılan uygulamaların pek çoğu artık bilgisayar kontrollü hale gelmektedir. Bu uygulamalardan birisi de yoklama veya takip sistemleridir. Takip sistemleri; personel girişçıkış saatlerinin kaydı, mal giriş-çıkış miktar kaydı, öğrenci ders giriş-çıkış kaydı, fabrika araç giriş-çıkış kaydı gibi pek çok uygulama alanlarında kullanılmaktadır. Bu projede yukarıda bahsedilen uygulamalardan öğrenci ders yoklama takibini parmak izi okuma yöntemi ile yapacak bir sistem tasarlamayı ve uygulamayı amaçladık. Günümüzde kâğıt üzerindeki tablolarda bulunan isimlerin karşısına el ile imza atmak suretiyle yoklama alınmaktadır. Bu uygulama birbirinin yerine imza atma, kâğıdın kaybolması gibi nedenlerle tam doğru sonuçlar alınamayabilmektedir veya ders hocasının yıl sonunda tek seferde birden fazla ders için oluşan birden fazla sayfalı yoklama kâğıtlarının tamamını tek seferde kontrol etmesi çok zaman almakta, hatta bazen okuma hataları da oluşmaktadır. Projemiz ile öğrenciler parmak izleri ile takip edilecektir. Bu durum birbirinin yerine imza atma ihtimalini ortadan kaldıracaktır. Hatta her dersiçin ayrı ayrı yoklama alınabilmesi mümkün hale gelecektir. İster yıl sonunda topluca isterse de haftalık olarak toplanan veriler, bilgisayardaki tabloda birleştirilerek, anında yoklama durumu listesi ortaya çıkartılabilecektir.

Projenin Arduino Kodu

// Leanordo ve micro işlemlerinde  arduinunon  tx ,rx pinlerini kullanınn.0 pin  yesil kablo, 1 pin ise beyaz kablo
// Bu tarz islemlerde asagidaki yorum satirini aciniz.
// #define mySerial Serial1
//Arduino unoda ise  donanımsal pinler degil softwareserial ile pinleri kendimiz olusturacağiz.
// 2.pine sensör girişini yani yesil kablo,tx girisini
// 3.pine sensör çıkışını  beyaz kablo,rx girisine
// Donanım kullanıyorsa serial satırlarını  yorum satırı haline getiriniz.

#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <SD.h>
#include <SPI.h>


int CS_PIN=10;
File file;
SoftwareSerial mySerial(2, 3);
LiquidCrystal_I2C lcd(0x27,16,2);
int index=1;
int buton_durum1=0,buton_durum2=0,buton_durum3=0;

Adafruit_Fingerprint parmak = Adafruit_Fingerprint(&mySerial,1396);//Burada  parmak izi okuyucumuzun rx ve tx kısmını belirledik.
uint8_t id;//8 bitlik id olusturuldu
void setup() {
  Serial.begin(9600);
  lcd.begin();
  lcd.backlight();
  lcd.setCursor(1,0);
  lcd.print("Yazilim Tuneli");
  delay(1000);
  pinMode(6,INPUT);
  pinMode(5,INPUT);
  pinMode(4,INPUT);
  pinMode(1,OUTPUT);
  pinMode(0,OUTPUT);
  pinMode(7,OUTPUT);
   
  while (!Serial);  // Burada eger   bu donanımları kullanıyorsak buna gör düzenlememiz gerekmektedir. Yun/Leo/Micro/Zero/...
  delay(100);
  //Serial.println("\t-----Parmak Izi Kayit-----\t");

  // Kullandigimiz parmak izi okuyucusunun  baund hızını belirliyoruz.Sabit şekilde hepsinin  band genisliği 57600 olarak gelmektedir.
  parmak.begin(57600);
  if (parmak.verifyPassword()) {
    Serial.println("Parmak izi sensörü bulundu!");
    lcd.setCursor(0,1);
    lcd.print("Parmak bulundu!");
  } else {
    Serial.println("Parmak izi sensörü bulunamadı!Baglantıları kontrol ediniz.");
    lcd.print("Parmak bulunamadı!");
    while (1) {
      delay(10); 
      }
  }
  parmak.getTemplateCount();
  Serial.print("Toplam kayit sayisi: \t"); Serial.println(parmak.templateCount);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Kayit Sayisi");
  lcd.setCursor(0,1);
  lcd.print(parmak.templateCount);
  index=1;
  //Serial.println("Bekleniyor..."); 
}
void loop() {
  buton_durum1=digitalRead(6);
  buton_durum2=digitalRead(5);
  buton_durum3=digitalRead(4);
  if(buton_durum1==HIGH){//Burada kayit islemi 
  Serial.println("Parmak izi okuyucu kayıt işlemine hazır!");
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Parmak izi kayit!");
  delay(1000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Parmak için id: 1-127");
  lcd.setCursor(0,1);
  
  if(buton_durum2==HIGH){
    delay(100);
    index++;
    lcd.print(index);
    if(buton_durum3==HIGH){
       id = index;
    }
  }
  
  if (id == 0) {// id degerini 0 giremezsiniz.Tekrar deneyiniz.
     return;//Loop kısmını bastan baslatmak icin kullanılmıstır.
  }
 /* Serial.println("Bu parmagı kaydetmek istediğiniz id degerini giriniz.(1'den 127'ye kadar id degeri seciniz.)");//Toplamda sensör üzerine 128 adet kayıt almaktadır.
  id = readnumber();//Yukarıdaki fonksiyon cagrildi.*/

  Serial.print("Kayıt Numarası:\t ");
  Serial.println(id);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Kayıt Numarası:");
  lcd.setCursor(0,1);
  lcd.print(id);
  while (!getFingerprintEnroll());//Burada asagıdaki method cagrılmıstir.
  }


}

uint8_t readnumber(void) {
  uint8_t num = 0;
  
  while (num == 0) {
    while (! Serial.available());//Serial ekrandan okunan deger,eger deger geldiyse bunu beklemektedir.
    num = Serial.parseInt();//Gelen veriyi string oldugu için  int sayı tipine cevirmektedir.
  }
  return num;
}

uint8_t getFingerprintID() {
  uint8_t p = parmak.getImage();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Parmak tespit edildi...");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println("Parmak tespit edilemedi...");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Iletisim hatasi");
      return p;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Parmak izi okunamadi");
      return p;
    default:
      Serial.println("Bilinmeyen Hata");
      return p;
  }

  //Tamam basarili!

  p = parmak.image2Tz();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Parmak okundu.");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Parmak okunamadi");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Iletisim Hatasi");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Parmak izi özellikleri bulunamadi");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Parmak  bulunamadi...");
      return p;
    default:
      Serial.println("Bilinmeyen Hata");
      return p;
  }
  
  // Tamam okundu
  p = parmak.fingerFastSearch();
  if (p == FINGERPRINT_OK) {
    Serial.println("Parmak izi eslesdi!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("İletisim Hatasi");
    return p;
  } else if (p == FINGERPRINT_NOTFOUND) {
    Serial.println("Parmak izi eslesmedi! ");
    return p;
  } else {
    Serial.println("Bilinmeyen Hata");
    return p;
  }   
  
  // Eslesen parmak 
  Serial.print("Eslesen parmak izi  ID si: \t"); Serial.print(parmak.fingerID); 
  Serial.print("Guvenlik kodu : \t"); Serial.println(parmak.confidence); 

  return parmak.fingerID;
}

// Eger okuyamaz ise -1  dondurur aksi taktirde id dondurur.
int getFingerprintIDez() {
  uint8_t p = parmak.getImage();
  if (p != FINGERPRINT_OK)  return -1;

  p = parmak.image2Tz();
  if (p != FINGERPRINT_OK)  return -1;

  p = parmak.fingerFastSearch();
  if (p != FINGERPRINT_OK)  return -1;
  
  // Parmak izi eşleşdigi taktirde
  Serial.print("Parmak izi bulundu ve idsi: \t"); Serial.print(parmak.fingerID); 
  Serial.print("\nGuvenlik kodu : \t"); Serial.println(parmak.confidence);
  return  parmak.fingerID; 
}

uint8_t getFingerprintEnroll() {
  int p = -1;
  Serial.print("Kaydetmek icin parmaginizi tutunuz..."); Serial.println(id);
  while (p != FINGERPRINT_OK) {
    p = parmak.getImage();
    switch (p) {
    case FINGERPRINT_OK://Parmak bulundugu zaman
      Serial.println("Parmak izi okundu...");
      break;
    case FINGERPRINT_NOFINGER://Parmak  bulunmadıgı zaman
      Serial.println("Bekleniyor...");//. koymaktadır.
      break;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("iletisim hatasi");
      break;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Parmak izi okuma hatası");
      break;
    default:
      Serial.println("Bilinmeyen Hata");
      break;
    }
  }

  // Basarili Sekilde olusturuldu

  p = parmak.image2Tz(1);
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Aynı parmagı tekrar okutunuz...");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Parmagınızı dogru sekilde tutunuz.");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("İletisim hatasi");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Parmak izi  bulunamadi");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Parmak izi özellikleri bulunamadi");
      return p;
    default:
      Serial.println("Bilinmeyen Hata");
      return p;
  }
  
  Serial.println("Parmağınızı kaldırın");
  delay(2000);
  p = 0;
  while (p != FINGERPRINT_NOFINGER) {
    p = parmak.getImage();
  }
  Serial.print("ID "); Serial.println(id);
  p = -1;
  Serial.println("Ayni parmagi tekrar yerlestirin.");
  while (p != FINGERPRINT_OK) {
    p = parmak.getImage();
    switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Parmak izi okundu.");
      break;
    case FINGERPRINT_NOFINGER://Parmak izi bulunamadi
      Serial.println("Bekleniyor");
      break;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("İletisim Hatasi");
      break;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Parmak izi okuma hatası");
      break;
    default:
      Serial.println("Bilinmeyen Hata");
      break;
    }
  }

  // Tamam basarili

  p = parmak.image2Tz(2);
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Parmak izi alındı...");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Parmaginizi düzgün yerlestirinniz.");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("İletisim hatasi");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Parmak izi bulunamadi");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Parmak izi özellikleri bulunamadi");
      return p;
    default:
      Serial.println("Bilinmeyen Hata");
      return p;
  }
  
  // Tamam
  Serial.print("Parmak izi olustur");  Serial.println(id);
  
  p = parmak.createModel();
  if (p == FINGERPRINT_OK) {
    Serial.println("Parmagınız eşleşti...");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("İletisim hatasi");
    return p;
  } else if (p == FINGERPRINT_ENROLLMISMATCH) {
    Serial.println("Parmak izi eslesmedi");
    return p;
  } else {
    Serial.println("Bilinmeyen Hata");
    return p;
  }   
  
  Serial.print("ID :\t"); Serial.println(id);
  p = parmak.storeModel(id);
  if (p == FINGERPRINT_OK) {
    Serial.println("Parmak izi kaydedildi!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("İletisim hatasi");
    return p;
  } else if (p == FINGERPRINT_BADLOCATION) {
    Serial.println("Bu id ile depolanamadi");
    return p;
  } else if (p == FINGERPRINT_FLASHERR) {
    Serial.println("Bellege yazilirken hata olustu.");
    return p;
  } else {
    Serial.println("Bilinmeyen Hata");
    return p;
  }   
}

void initializeSD()
{
  Serial.println("SD karti baslatiliyor...");
  pinMode(CS_PIN, OUTPUT);

  if (SD.begin())
  {
    Serial.println("SD kart kullanima hazir.");
  } else
  {
    Serial.println("SD kart başlatilamadi");
    return;
  }
}

int createFile(char filename[])
{
  file = SD.open(filename, FILE_WRITE);

  if (file)
  {
    Serial.println("Dosya olusturma basarili...");
    return 1;
  } else
  {
    Serial.println("Dosya olusturmada hata olustu.");
    return 0;
  }
}

int writeToFile(char text[])
{
  if (file)
  {
    file.println(text);
    Serial.println("Dosyaya yazildi.");
    Serial.println(text);
    return 1;
  } else
  {
    Serial.println("Dosyaya yazilamadi.");
    return 0;
  }
}

void closeFile()
{
  if (file)
  {
    file.close();
    Serial.println("Dosya kapatildi.");
  }
}

int openFile(char filename[])
{
  file = SD.open(filename);
  if (file)
  {
    Serial.println("Dosya okuma basarili!");
    return 1;
  } else
  {
    Serial.println("Dosya okuma islemi basarisiz!");
    return 0;
  }
}
uint8_t deleteFingerprint(uint8_t id) {
  uint8_t p = -1;
  
  p = parmak.deleteModel(id);

  if (p == FINGERPRINT_OK) {
    Serial.println("Silindi!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("İletisim Hatasi");
    return p;
  } else if (p == FINGERPRINT_BADLOCATION) {
    Serial.println("Bu konumda silme islemi gerceklesmedi...");
    return p;
  } else if (p == FINGERPRINT_FLASHERR) {
    Serial.println("Bellege yazilirken hata olustu.");
    return p;
  } else {
    Serial.print("Bilinmeyen Hata:0x"); Serial.println(p, HEX);
    return p;
  }   
}
String readLine()
{
  String received = "";
  char ch;
  while (file.available())
  {
    ch = file.read();
    received += ch;    
  }
  return String(received);

}


Yorum Gönder

0 Yorumlar