Файл: 1 10 Разработка макета.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 06.11.2023

Просмотров: 15

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

1.4.10 Разработка макета



Для сборки данного макета необходимы следующие элементы:

– Дисплей 1602А.

– Модуль датчика отпечатков пальца.

– 2 резистора сопротивлением 1000Ом.

– Один потенциометр.

– Один сервопривод.

– Плата Arduino Uno.

– 4 тактовые кнопки.

Схема этого макета представлена на рисунке 1.



Рисунок 1 – Схема макета биометрической системы безопасности с использованием Arduino и датчика отпечатков пальцев

Поочерёдно фиксируем все тактовые кнопки в макетной плате, а также резисторы идущие к светодиодам (Рисунок 2).


Рисунок 2 – Установка тактовых кнопок и резисторов в макетной плате

Продолжаем установку компонентов, устанавливаем индикационные светодиоды в макетной плате. Это показано на рисунке 3.



Рисунок 3 – Установка светодиодов в макетной плате

Далее устанавливаем оставшиеся основные компоненты на макетную плату, такие как lcd – дисплей, сервопривод, датчик отпечатков пальцев и плата Arduino Uno (Рисунок 4).


Рисунок 4 – Установка оставшихся компонентов в макетную плату

После установки всех компонентов макета мы начинаем соединять их соединительными проводами. Блок кнопок подключается одним концом на выводы A0 – A3, а другим концом на вывод GND.

Резисторы, которые подключены к светодиодам соединяются с выводами D6, D7. Катод светодиодов подключаются на вывод GND.

Сервопривод подключается на выводы 5V, GND, D5. Потенциометр подключается на выводы 5V и GND.

Датчик отпечатков пальцев подключается на следующие выводы: 5V, GND, RX – D3, TX – D2 (Рисунок 5).

Последним элементом макета который необходимо подключить к плате Arduino Uno является lcd – дисплей. Он подключается на следующие выводы: выводы дисплея D7 – D4 на выводы платы Arduino Uno D7 – D11, E – D12, RS – D13, VSS – GND, VDD – 5V, V0 – третий вывод потенциометра.




Рисунок 5 – Обратная сторона макетной платы после соединения всех основных компонентов между собой

1.5 Разработка управляющей программы



1.5.1 Скетч


#include // библиотека для работы с ЖК дисплеем

LiquidCrystal lcd(13,12,11,10,9,8); // контакты к которым подключен ЖК дисплей

#include // библиотека чтобы организовать последовательную связь

SoftwareSerial fingerPrint(2, 3); // на контактах 2 и 3

#include // библиотека для работы с сервомотором

Servo myServo; // даем имя нашему сервомотору

#include // библиотека для работы с модулем датчика отпечатков пальцев

uint8_t id;

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&fingerPrint);

#define enroll 14

#define del 15

#define up 16

#define down 17

#define openLight 6

#define closeLight 7

#define servoPin 5

void setup()

{

    delay(1000);

    myServo.attach(servoPin);

    myServo.write(180);

    pinMode(enroll, INPUT_PULLUP);

    pinMode(up, INPUT_PULLUP);

    pinMode(down, INPUT_PULLUP);

    pinMode(del, INPUT_PULLUP);

    pinMode(openLight, OUTPUT);

    pinMode(closeLight, OUTPUT);

    lcd.begin(16,2);

    lcd.print("Security System");

    lcd.setCursor(0,1);

    lcd.print("by Finger Print");

    delay(2000);

    lcd.clear();

    lcd.print("Circuit Digest");

    lcd.setCursor(0,1);

    lcd.print("Saddam Khan");

    delay(2000);

    finger.begin(57600);

    Serial.begin(9600);

    lcd.clear();

    lcd.print("Finding Module");

    lcd.setCursor(0,1);

    delay(1000);

    if (finger.verifyPassword())

    {

      Serial.println("Found fingerprint sensor!"); // датчик отпечатков пальцев найден

      lcd.clear();

      lcd.print("Found Module ");

      delay(1000);

    }

    else

    {

    Serial.println("Did not find fingerprint sensor :("); // датчик отпечатков пальцев не найден

    lcd.clear();

    lcd.print("module not Found");

    lcd.setCursor(0,1);

    lcd.print("Check Connections");

    while (1);

    }

}

void loop()

{

lcd.setCursor(0,0);

lcd.print("Press UP/Down ");

lcd.setCursor(0,1);

lcd.print("to start System");

digitalWrite(closeLight, HIGH);

if(digitalRead(up)==0 || digitalRead(down)==0)

{

  for(int i=0;i<5;i++)

  {

    lcd.clear();

    lcd.print("Place Finger");

    delay(2000);

    int result=getFingerprintIDez();

    if(result>=0)

    {

        digitalWrite(openLight, HIGH);

        digitalWrite(closeLight, LOW);

        lcd.clear();

        lcd.print("Allowed");

        lcd.setCursor(0,1);

        lcd.print("Gete Opened   ");

        myServo.write(0);

        delay(5000);

        myServo.write(180);

        digitalWrite(closeLight, HIGH);

        digitalWrite(openLight, LOW);

        lcd.setCursor(0,1);

        lcd.print("Gate Closed   ");

        return;

     }

   }

}

checkKeys();

delay(1000);

}

void checkKeys()

{

   if(digitalRead(enroll) == 0)

   {

    lcd.clear();

    lcd.print("Please Wait");

    delay(1000);

    while(digitalRead(enroll) == 0);

    Enroll();

   }

   else if(digitalRead(del) == 0)

   {

    lcd.clear();

    lcd.print("Please Wait");

    delay(1000);

    delet();

   }  

}

void Enroll()

{

   int count=0;

   lcd.clear();

   lcd.print("Enroll Finger    ");

   lcd.setCursor(0,1);

   lcd.print("Location:");

   while(1)

   {

     lcd.setCursor(9,1);

     lcd.print(count);

     if(digitalRead(up) == 0)

     {

       count++;

       if(count>25)

       count=0;

       delay(500);

     }

     else if(digitalRead(down) == 0)

     {

       count--;

       if(count<0)

       count=25;

       delay(500);

     }

     else if(digitalRead(del) == 0)

     {

          id=count;

          getFingerprintEnroll();

          return;

     }

       else if(digitalRead(enroll) == 0)

     {        

          return;

     }

}

}

void delet()

{

   int count=0;

   lcd.clear();

   lcd.print("Delete Finger    ");

   lcd.setCursor(0,1);

   lcd.print("Location:");

   while(1)

   {

     lcd.setCursor(9,1);

     lcd.print(count);

     if(digitalRead(up) == 0)

     {

       count++;

       if(count>25)

       count=0;

       delay(500);

     }

     else if(digitalRead(down) == 0)

     {

       count--;

       if(count<0)

       count=25;

       delay(500);

     }

     else if(digitalRead(del) == 0)

     {

          id=count;

          deleteFingerprint(id);

          return;

     }

       else if(digitalRead(enroll) == 0)

     {        

          return;

     }

}

}

uint8_t getFingerprintEnroll()

{

  int p = -1;

  lcd.clear();

  lcd.print("finger ID:");

  lcd.print(id);

  lcd.setCursor(0,1);

  lcd.print("Place Finger");

  delay(2000);

  while (p != FINGERPRINT_OK)

  {

    p = finger.getImage();

    switch (p)

    {

    case FINGERPRINT_OK:

      Serial.println("Image taken"); // изображение захвачено

      lcd.clear();

      lcd.print("Image taken");

      break;

    case FINGERPRINT_NOFINGER:

      Serial.println("No Finger"); // нет пальца

      lcd.clear();

      lcd.print("No Finger");

      break;

    case FINGERPRINT_PACKETRECIEVEERR:

      Serial.println("Communication error"); // ошибка связи

      lcd.clear();

      lcd.print("Comm Error");

      break;

    case FINGERPRINT_IMAGEFAIL:

      Serial.println("Imaging error");

      lcd.clear();

      lcd.print("Imaging Error"); // ошибка изображения

      break;

    default:

      Serial.println("Unknown error");

       lcd.clear();

      lcd.print("Unknown Error"); // неизвестная ошибка

      break;

    }

  }

  // OK success!

  p = finger.image2Tz(1);

  switch (p) {

    case FINGERPRINT_OK:

      Serial.println("Image converted");

      lcd.clear();

      lcd.print("Image converted");

      break;

    case FINGERPRINT_IMAGEMESS:

      Serial.println("Image too messy"); // изображение слишком “грязное”

       lcd.clear();

       lcd.print("Image too messy");

      return p;

    case FINGERPRINT_PACKETRECIEVEERR:

      Serial.println("Communication error");

      lcd.clear();

      lcd.print("Comm Error");

      return p;

    case FINGERPRINT_FEATUREFAIL:

      Serial.println("Could not find fingerprint features");

      lcd.clear();

      lcd.print("Feature Not Found");

      return p;

    case FINGERPRINT_INVALIDIMAGE:

      Serial.println("Could not find fingerprint features");

      lcd.clear();

      lcd.print("Feature Not Found");

      return p;

    default:

      Serial.println("Unknown error");

      lcd.clear();

      lcd.print("Unknown Error");

      return p;

  }

  Serial.println("Remove finger");

  lcd.clear();

  lcd.print("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"); // поместите тот же самый палец

   lcd.clear();

      lcd.print("Place Finger");

      lcd.setCursor(0,1);

      lcd.print("   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");

      return;

    }

  }

  // 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!");

    lcd.clear();

    lcd.print("Stored!");

    delay(2000);

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

  }  

}

int getFingerprintIDez()

{

  uint8_t p = finger.getImage();

  if (p != FINGERPRINT_OK)  

  return -1;

  p = finger.image2Tz();

  if (p != FINGERPRINT_OK)  

  return -1;

  p = finger.fingerFastSearch();

  if (p != FINGERPRINT_OK)

  {

   lcd.clear();

   lcd.print("Finger Not Found");

   lcd.setCursor(0,1);

   lcd.print("Try Later");

   delay(2000);  

  return -1;

  }

  // found a match!

  Serial.print("Found ID #");

  Serial.print(finger.fingerID);

  return finger.fingerID;

}

uint8_t deleteFingerprint(uint8_t id)

{

  uint8_t p = -1;  

  lcd.clear();

  lcd.print("Please wait"); // пожалуйста подождите

  p = finger.deleteModel(id);

  if (p == FINGERPRINT_OK)

  {

    Serial.println("Deleted!");

    lcd.clear();

    lcd.print("Figer Deleted"); // палец удален

    lcd.setCursor(0,1);

    lcd.print("Successfully"); // успешно

    delay(1000);

  }

  else

  {

    Serial.print("Something Wrong");  // что то пошло не так

    lcd.clear();

    lcd.print("Something Wrong");

    lcd.setCursor(0,1);

    lcd.print("Try Again Later"); // попробуйте снова немного позже

    delay(2000);

    return p;

  }  

}

1.5.1 Демонстрация работы макета измерителя ЛКП на базе Arduino
Работа рассматриваемого макета достаточно проста. Его логика заключается в том, что дверца будет открыта, когда мы помещаем сохраненный отпечаток в одноименный модуль. Но перед этим пользователю необходимо зарегистрировать палец в системе. Для этого пользователю необходимо нажать клавишу ENROLL (Рисунок 6), а затем ЖК-дисплей запросит у него местоположение/ID (идентификатор), где будет храниться отпечаток пальца (Рисунок 7).



Рисунок 6 – Запуск системы для того, чтобы зарегистрировать отпечаток пальцев в системе



Рисунок 7 – Система запрашивает отпечаток пальцев, для того чтобы его запомнить

Теперь пользователь может открыть ворота, поместив тот же палец, который он зарегистрировал в системе(Рисунок 8).


Рисунок 8 – Система определила зарегистрированный отпечаток пальцев и открыла дверцу

1.6 Разработка руководства пользователя


Это устройство работает от любого источника питания с напряжением от 5 до 12 вольт и током не меньше 200Ма. Стандартное состояние при запуске системы это горящий жёлтый индикационный светодиод и надпись на дисплее «Press UP/Down to start system». Это видно на рисунке 9.



Рисунок 9 – Стандартное состояние системы после подключения к ней питания

Четыри тактовые кнопки несут следующий функционал:

1) Enroll/Back: активирует процедуру запоминания отпечатка пальца.

2) Up/Match: позволяет перемещать айди отпечатка пальца внутри системы запускать считывание отпечатка пальца, который уже есть в системе.

3) Down/Match: позволяет прервать цикл работы и начать процедуру записывания нового отпечатка незамедлительно.

4) OK/Del: сохраняет отпечаток, либо при двойном нажатии удаляет его. Нумерация кнопок показана на рисунке 10.

Для отключения устройства необходимо отключить от него тот источник питания, к которому он подключен



Рисунок 10 – Нумерация основных элементов управления