ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 06.11.2023
Просмотров: 16
Скачиваний: 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 – Нумерация основных элементов управления