Untitled

 avatar
unknown
plain_text
2 years ago
13 kB
7
Indexable
#include <Servo.h>
#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Adafruit_Fingerprint.h>

// fingerprint setup
#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__)
// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino  (WHITE wire)
// Set up the serial port to use softwareserial..
SoftwareSerial mySerial(2, 3);

#else
// On Leonardo/M0/etc, others with hardware serial, use hardware serial!
// #0 is green wire, #1 is white
#define mySerial Serial1

#endif

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

uint8_t id = 0;

// servo
Servo servo;

// lcd
int row = 0;
int col = 0;
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

// keypad
int step = 0;
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 pin_rows[ROWS] = {A0, A1, A2, A3};
byte pin_cols[COLS] = {13, 12, 11, 10};

Keypad keypad = Keypad(makeKeymap(keys), pin_rows, pin_cols, ROWS, COLS);

// button A,B states
int a = 0;
int b = 0;

// store password
int password = 0;
int correctPassword = 12345;

// door state
int doorOpen = 0;

void setup()
{
  Serial.begin(9600);
  servo.attach(A4);
  lcd.begin(16, 2);
  Serial.println("Start");
  servo.write(0);
  finger.begin(57600);

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

void loop()
{
  // variables
  char key = keypad.getKey();

  // start
  if (doorOpen == 1)
  {
    servo.write(135);
  }

  if (key == '*')
  {
    doorOpen = 0;
    step = 0;
    password = 0;
    servo.write(0);
  }

  // start
  if (step == 0)
  {
    lcd.setCursor(row, col);
    lcd.print("Start            ");
    lcd.setCursor(row, col + 1);
    lcd.print("press D to continue");
    if (key == 'D')
    {
      Serial.println("----------------------------------------------------------------");
      Serial.println("A: Password");
      Serial.println("B: Fingerprint");
      Serial.println("----------------------------------------------------------------");

      Serial.println("Fingerprint ");
      Serial.println("----------------------------------------------------------------");
      Serial.println("Press A to create a new fingerprint");
      Serial.println("Press B to save a fingerprint");
      Serial.println("Press C to open by fingerprinting");
      Serial.println("Press D to delete a fingerprint");
      step = 1;
    }
  }

  // select password or fingerprint
  if (step == 1)
  {
    lcd.setCursor(row, col);
    lcd.println("A: Password                    ");
    lcd.setCursor(row, col + 1);
    lcd.println("B: Fingerprint                  ");
    if (key)
    {
      switch (key)
      {
      case 'A': // set dieu kien de nhap password
        a = 1;
        step = 2;
        break;
      case 'B': // dieu kien de chay fingerprints
        b = 1;
        step = 2;
        break;
      default:
        break;
      }
    }
  }

  // password
  if (a == 1)
  {
    lcd.setCursor(row, col);
    lcd.print("Enter Password   ");
    lcd.setCursor(row, col + 1);
    lcd.print("                    ");
    password = getPassword();
    doorOpen = checkPassword(password, correctPassword);
    step = 1;
    a = 0;
  }

  // fingerprint
  if (b == 1)
  {
    lcd.setCursor(row, col);
    lcd.println("Fingerprint          ");
    lcd.setCursor(row, col + 1);
    lcd.println("Functions: A,C,D                  ");
    // press keypad
    if (key)
    {
      switch (key)
      {
      case 'A':
        lcd.setCursor(row, col);
        lcd.println("Enroll fingerprint");
        lcd.setCursor(row, col + 1);
        lcd.println("              ");
        delay(3000);
        // code them van tay
        getFingerprintEnroll();

        break;
      case 'C':
        lcd.setCursor(row, col);
        lcd.println("Check finger");
        lcd.setCursor(row, col + 1);
        lcd.println("                      ");
        delay(3000);
        // code nhan van tay
        getFingerprintID();

        break;
      case 'D':
        lcd.setCursor(row, col);
        lcd.println("Delete              ");
        lcd.setCursor(row, col + 1);
        lcd.print("Finger id ");lcd.print(id);lcd.print("                      ");
        delay(3000);
        // code xoa van tay
        deleteFingerprint(id);
        break;
      case '*':
        b = 0;
        break;
      default:
        break;
      }
    }
  }

} // end loop

// functions
int getPassword()
{
  String enteredPassword = "";
  char key;
  int i = 0;

  while (true)
  {
    key = keypad.getKey();
    if (key)
    {
      lcd.setCursor(row + i, col + 1);
      lcd.println("*");
      i++;
      // Check if the entered password is complete
      if (key == 'D')
      {
        break;
      }
      else if (key == '*')
      {
        // Clear the entered password if the asterisk key is pressed
        enteredPassword = "";
      }
      else
      {
        // Append the entered digit to the password
        enteredPassword += key;
      }
    }
  }

  // Convert the entered password from String to integer
  int password = enteredPassword.toInt();
  return password;
}

int checkPassword(int password, int correctPassword)
{

  if (password == correctPassword)
  {
    lcd.setCursor(row, col);
    lcd.print("Password Correct  ");
    lcd.setCursor(row, col + 1);
    lcd.print("                    ");
    delay(1000);
    return 1; // Password is correct
  }
  else
  {
    lcd.setCursor(row, col);
    lcd.print("Password Incorrect");
    lcd.setCursor(row, col + 1);
    lcd.print("                    ");

    delay(1000);

    return 0; // Password is incorrect
  }
}

uint8_t getFingerprintEnroll()
{

  int p = -1;
  Serial.print("Waiting for valid finger to enroll as #");
  Serial.println(id);
  while (p != FINGERPRINT_OK)
  {
    p = finger.getImage();
    switch (p)
    {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println(".");
      break;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      break;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      break;
    default:
      Serial.println("Unknown error");
      break;
    }
  }

  // OK success!

  p = finger.image2Tz(1);
  switch (p)
  {
  case FINGERPRINT_OK:
    Serial.println("Image converted");
    break;
  case FINGERPRINT_IMAGEMESS:
    Serial.println("Image too messy");
    return p;
  case FINGERPRINT_PACKETRECIEVEERR:
    Serial.println("Communication error");
    return p;
  case FINGERPRINT_FEATUREFAIL:
    Serial.println("Could not find fingerprint features");
    return p;
  case FINGERPRINT_INVALIDIMAGE:
    Serial.println("Could not find fingerprint features");
    return p;
  default:
    Serial.println("Unknown error");
    return p;
  }

  Serial.println("Remove finger");
  delay(2000);
  p = 0;
  while (p != FINGERPRINT_NOFINGER)
  {
    p = finger.getImage();
  }
  Serial.print("ID ");
  Serial.println(id);
  p = -1;
  Serial.println("Place same finger again");
  while (p != FINGERPRINT_OK)
  {
    p = finger.getImage();
    switch (p)
    {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.print(".");
      break;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      break;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      break;
    default:
      Serial.println("Unknown error");
      break;
    }
  }

  // OK success!

  p = finger.image2Tz(2);
  switch (p)
  {
  case FINGERPRINT_OK:
    Serial.println("Image converted");
    break;
  case FINGERPRINT_IMAGEMESS:
    Serial.println("Image too messy");
    return p;
  case FINGERPRINT_PACKETRECIEVEERR:
    Serial.println("Communication error");
    return p;
  case FINGERPRINT_FEATUREFAIL:
    Serial.println("Could not find fingerprint features");
    return p;
  case FINGERPRINT_INVALIDIMAGE:
    Serial.println("Could not find fingerprint features");
    return p;
  default:
    Serial.println("Unknown error");
    return p;
  }

  // OK converted!
  Serial.print("Creating model for #");
  Serial.println(id);

  p = finger.createModel();
  if (p == FINGERPRINT_OK)
  {
    Serial.println("Prints matched!");
  }
  else if (p == FINGERPRINT_PACKETRECIEVEERR)
  {
    Serial.println("Communication error");
    return p;
  }
  else if (p == FINGERPRINT_ENROLLMISMATCH)
  {
    Serial.println("Fingerprints did not match");
    return p;
  }
  else
  {
    Serial.println("Unknown error");
    return p;
  }

  Serial.print("ID ");
  Serial.println(id);
  p = finger.storeModel(id);
  if (p == FINGERPRINT_OK)
  {
    Serial.println("Stored!");
  }
  else if (p == FINGERPRINT_PACKETRECIEVEERR)
  {
    Serial.println("Communication error");
    return p;
  }
  else if (p == FINGERPRINT_BADLOCATION)
  {
    Serial.println("Could not store in that location");
    return p;
  }
  else if (p == FINGERPRINT_FLASHERR)
  {
    Serial.println("Error writing to flash");
    return p;
  }
  else
  {
    Serial.println("Unknown error");
    return p;
  }
  lcd.setCursor(row, col);
  lcd.print("Fingerprint Enrolled");
  lcd.setCursor(row, col + 1);
  lcd.print("Finger id ");
  lcd.print(id);
  delay(1000);
  id++;

  return true;
}

uint8_t deleteFingerprint(uint8_t id)
{
  uint8_t p = -1;

  p = finger.deleteModel(id);

  if (p == FINGERPRINT_OK)
  {
    Serial.println("Deleted!");
  }
  else if (p == FINGERPRINT_PACKETRECIEVEERR)
  {
    Serial.println("Communication error");
  }
  else if (p == FINGERPRINT_BADLOCATION)
  {
    Serial.println("Could not delete in that location");
  }
  else if (p == FINGERPRINT_FLASHERR)
  {
    Serial.println("Error writing to flash");
  }
  else
  {
    Serial.print("Unknown error: 0x");
    Serial.println(p, HEX);
  }
  lcd.setCursor(row, col);
  lcd.print("Fingerprint deleted         ");
  lcd.setCursor(row, col + 1);
  lcd.print("Finger id ");
  lcd.print(id);lcd.print("            ");
  delay(1000);
  if (id > 0)
  {
    id--;
  }

  return p;
}

uint8_t getFingerprintID()
{
  uint8_t p = finger.getImage();
  while (p != FINGERPRINT_OK)
  {
    p = finger.getImage();
    switch (p)
    {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println(".");
      break;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      break;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      break;
    default:
      Serial.println("Unknown error");
      break;
    }
  }

  // OK success!

  p = finger.image2Tz();
  switch (p)
  {
  case FINGERPRINT_OK:
    Serial.println("Image converted");
    break;
  case FINGERPRINT_IMAGEMESS:
    Serial.println("Image too messy");
    return p;
  case FINGERPRINT_PACKETRECIEVEERR:
    Serial.println("Communication error");
    return p;
  case FINGERPRINT_FEATUREFAIL:
    Serial.println("Could not find fingerprint features");
    return p;
  case FINGERPRINT_INVALIDIMAGE:
    Serial.println("Could not find fingerprint features");
    return p;
  default:
    Serial.println("Unknown error");
    return p;
  }

  // OK converted!
  p = finger.fingerSearch();
  if (p == FINGERPRINT_OK)
  {
    Serial.println("Found a print match!");
  }
  else if (p == FINGERPRINT_PACKETRECIEVEERR)
  {
    Serial.println("Communication error");
    return p;
  }
  else if (p == FINGERPRINT_NOTFOUND)
  {
    lcd.setCursor(row, col);
    lcd.print("Fingerprint not found");
    lcd.setCursor(row, col + 1);
    lcd.print("                       ");
    Serial.println("Did not find a match");
    delay(1000);
    return p;
  }
  else
  {
    Serial.println("Unknown error");
    return p;
  }

  // found a match!
  Serial.print("Found ID #");
  Serial.print(finger.fingerID);
  Serial.print(" with confidence of ");
  Serial.println(finger.confidence);
  lcd.setCursor(row, col);
  lcd.print("Door is opened");
  lcd.setCursor(row, col + 1);
  lcd.print("                   ");
  lcd.print(id);
  servo.write(135);
  delay(1000);

  return finger.fingerID;
}
Editor is loading...