iamjuras
Published © GPL3+

RFID & Biometric PC Log In/Out Interface

This project is an all-in-one plug-and-play DIY PC unlock interface, that uses RFID card or fingerprint scan to log in/out your Windows PC.

IntermediateFull instructions provided5,483
RFID & Biometric PC Log In/Out Interface

Things used in this project

Hardware components

Arduino Leonardo
Arduino Leonardo
Only Arduino with ATmega 32U4
×1
RC522 RFID reader
×1
Z70 fingerprint scanner
×1
Breadboard (generic)
Breadboard (generic)
82,5 x 53 cm if to use with my 3D printed case
×1
Trimmer Potentiometer, 10 kohm
Trimmer Potentiometer, 10 kohm
×1
Standard LCD - 16x2 White on Blue
Adafruit Standard LCD - 16x2 White on Blue
×1
Arduino Leonardo Enclosure 78 x 59 x 21 mm
Optional - to use with 3D printed case
×1
Pushbutton Switch, Push-Pull
Pushbutton Switch, Push-Pull
×1
Tiny furniture screws
×4

Software apps and online services

Arduino IDE
Arduino IDE

Hand tools and fabrication machines

3D Printer (generic)
3D Printer (generic)
Optional, to print case
Hot glue gun (generic)
Hot glue gun (generic)
Zip tie

Story

Read more

Schematics

Wiring

Code

Code

C/C++
#include <Keyboard.h>
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#include <Adafruit_Fingerprint.h>
#define SS_PIN 10
#define RST_PIN 9
#define lcdLight 8
#define Lock_Btn 11
#define mySerial Serial1

LiquidCrystal lcd(2,3,4,5,6,7);

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
 
MFRC522 rfid(SS_PIN, RST_PIN);  //stworzenie instancji czytnika RFID, pin NSS - 10, "fałszywy" pin RST - 9
char Enter = KEY_RETURN;  //deklaracja przycisków klawiatury dla wygody
char Escape = KEY_ESC;    //
char Win = KEY_LEFT_GUI;  //
char logKey = 'l';        //
String readId;  //id odczytanego chipu rfid zapisywane do stringa
String logCard = ""; //id chipu, który odblokowuje komputer
String password = ""; //twoje haslo
bool loginFlag;
int timeCount = 0;
int fingerIDint;

void temp(byte *buffer, byte bufferSize)  //funkcja do przepisywania odczytanego id chipu RFID z rejestru czytnika do formy stringa
{
  readId = "";
  for(byte i = 0; i < bufferSize; i++)
  {
    readId = readId + String(buffer[i], HEX);
  }
}

int fingerID() {
  uint8_t p = finger.getImage();
  if (p != FINGERPRINT_OK)  return 0;

  p = finger.image2Tz();
  if (p != FINGERPRINT_OK)  return 0;

  p = finger.fingerFastSearch();
  if (p != FINGERPRINT_OK)  return 0;

  //Serial.print("Found ID #"); Serial.print(finger.fingerID);
  //Serial.print(" with confidence of "); Serial.println(finger.confidence);
  return finger.fingerID;
}

void passwd() //funkcja do wpisywania hasła
{
  Keyboard.press(Escape);
  delay(1000);
  Keyboard.releaseAll();
  Keyboard.print(password); //modyfikowalne, tutaj jest hasło do komputera
  Keyboard.press(Enter);
  Keyboard.releaseAll();
}

void logOut()
{
  Keyboard.press(Win);
  delay(10);
  Keyboard.press(logKey);
  Keyboard.releaseAll();
  digitalWrite(lcdLight, HIGH);
  lcd.setCursor(0,0);
  lcd.print("Logging out...");
  loginFlag = false;
  timeCount = 0;      
  delay(1000);
}

void clearLCD() //funkcja do czyszczenia wyswietlacza lcd
{
  lcd.setCursor(0,0);
  lcd.print("                ");
  lcd.setCursor(0,1);
  lcd.print("                ");
}
 
void setup( ) 
{
  //inicjalizacja pinów
  pinMode(lcdLight, OUTPUT);
  pinMode(Lock_Btn, INPUT_PULLUP);

  //inicjalizacja elementów zewnętrznych bibliotek
  lcd.begin(16,2);
  Keyboard.begin();
  Serial.begin(9600);
  SPI.begin(); //inicjalizacja szyny SPI płytki
  rfid.PCD_Init(); //inicjalizacja instancji czytnika RFID
  delay(4);

  finger.begin(57600);
  delay(5);
  if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
  } else {
    Serial.println("Did not find fingerprint sensor :(");
    while (1) { delay(1); }
  }

  //wstępne ustawienia zmiennych i pinów
  loginFlag = false;  //użytkownik nie zalogowany

  delay(2000);
  digitalWrite(lcdLight, HIGH); //podswietlenie lcd wlaczone
  lcd.setCursor(0,0);
  lcd.print("System booting");
  lcd.setCursor(0,1);
  lcd.print("Please wait...");
  delay(5000);
  clearLCD();
}

void loop()
{
  if(loginFlag == true) //przejscie w tryb uspienia, jezeli uzytkownik jest zalogowany - wylaczenie wyswietlacza lcd i pominięcie całej reszty petli loop
  {
    digitalWrite(lcdLight, LOW);
    
    if(digitalRead(Lock_Btn) == LOW) //jezeli wcisniety przycisk wylogowania wcisnij kombinacje Win+L, wlacz wyswietlacz lcd i ustaw flage logowania na false - niezalogowany
    {
      logOut();
      return;
    }
    else
    {
      return;
    }
  }
  
  else
  {
    
    if(rfid.PICC_IsNewCardPresent() == false) //funkcja wbudowana w biblioteke - sprawdza czy do czytnika jest przylozona jakakolwiek karta, jezeli nie ma karty funkcja zwraca false, co wypisuje na wyswietlacz tekst i pomija dalsza czesc petli loop
    {
      if(digitalRead(Lock_Btn) == LOW) // wicsniecie przycisku sluzy do podswietlenia ekranu lcd
      {
        digitalWrite(lcdLight, HIGH);
        timeCount = 0;
      }
      if(timeCount == 90)  //po 15 sekundach bezczynnosci podswietlenie ekranu lcd zostaje wylaczone
      {
        digitalWrite(lcdLight, LOW);
        return;
      }
      else
      {
       fingerIDint = fingerID();
       clearLCD();
       lcd.setCursor(0,0);
       lcd.print("Insert card");
       lcd.setCursor(0,1);
       lcd.print("or place finger");
       //lcd.print(timeCount);  //funkcja debugujaca, wyswietlajaca zawartosc zmiennej timeCount
       timeCount++;
      }
      if(fingerIDint == 0)
      {
        return;
      }
    }

    if(rfid.PICC_ReadCardSerial() == false and fingerIDint == 0) //funkcja wbudowana w biblioteke - zapisuje UID wprowadzonej karty do wewnetrznego rejestru, jezeli nie ma karty funkcja zwraca false i pomija dalsza czesc petli loop (moze sie zdarzyc, ze czytnik wykryje wprowadzona karte, ale nie bedzie ona kompatybilna i nie bedzie mozna odczytac jej UID)
    {
     return;
    }

    digitalWrite(lcdLight, HIGH);
    clearLCD();
    switch(fingerIDint)
    {
      case 0:
      {
        lcd.setCursor(0,0);
        lcd.print("Card detected!");
        temp(rfid.uid.uidByte, rfid.uid.size);  //wykorzystanie funkcji przepisania ID z rejestru do Stringa

        //Serial.println(readid); //funkcja debugujaca, wyrzucajaca ID karty do portu szeregowego

        if(readId == logCard) //porownanie ID odczytanej karty z "wzorcem", jezeli karta sie zgadza nastepuje wykonanie funkcji wpisujacej haslo i ustawienie flagi logowania na true - zalogowany
        {
         lcd.setCursor(0,1);
         lcd.print("Card match!");
         passwd();
         delay(1000);
         clearLCD();
         lcd.setCursor(0,0);
         lcd.print("Welcome!");
         delay(1000);
         clearLCD();
         loginFlag = true;
         return;
        }
        else  //jezeli karta sie nie zgadza uklad wypisuje na ekran monit i wraca do poczatku petli loop
        {
         lcd.setCursor(0,1);
         lcd.print("Wrong card!");
         delay(1000);
         clearLCD();
         return;
        }
      }
      default:
      {
        lcd.setCursor(0,0);
        lcd.print("                ");
        lcd.setCursor(0,0);
        lcd.print("Finger detected!");
        lcd.setCursor(0,1);
        lcd.print("Biometric match!");
        passwd();
        delay(1000);
        clearLCD();
        lcd.setCursor(0,0);
        lcd.print("Welcome!");
        delay(1000);
        clearLCD();
        loginFlag = true;
      }
    }
  }
}

Credits

iamjuras

iamjuras

1 project • 1 follower

Comments