2 сканера отпечатков пальцев с помощью 1 ардуино
У меня есть проблема с использованием сканера отпечатков пальцев 2 в arduino mega, каждый раз, когда мне нужно зарегистрироваться, мне нужно пойти и зарегистрировать свой отпечаток пальца на каждом модуле отпечатков пальцев,
то, что я планирую сделать, это когда я зарегистрировался на 1 сканере отпечатков пальцев, то другой модуль отпечатков пальцев автоматически зарегистрировал отпечаток пальца и наоборот.
Кто-нибудь может помочь мне с моим проектом спасибо. кстати, мой проект уже работал, но у меня возникли проблемы с регистрацией биометрик.
вот мой код для проверки зарегистрированного отпечатка пальца
#include <Adafruit_Fingerprint.h>
int door1 = 8;
int door2 = 11;
Adafruit_Fingerprint finger1 = Adafruit_Fingerprint(&Serial2);
//fplabas
Adafruit_Fingerprint finger2 = Adafruit_Fingerprint(&Serial3);
void setup() {
Serial.begin(9600);
pinMode(door2, OUTPUT);
pinMode(door1, OUTPUT);
// pinMode(Buzzer, OUTPUT);
//
digitalWrite(door2, HIGH);
digitalWrite(door1, HIGH);
finger1.begin(57600);
finger2.begin(57600);
if (finger1.verifyPassword() || finger2.verifyPassword()) {
Serial.println("Found fingerprint sensors!");
} else {
Serial.println("Did not find any fingerprint sensors :(");
while (1) { delay(1); }
}
finger1.getTemplateCount();
finger2.getTemplateCount();
Serial.print("Fingerprint Sensor1 contains "); Serial.print(finger1.templateCount); Serial.println(" templates");
Serial.print("Fingerprint Sensor2 contains "); Serial.print(finger2.templateCount); Serial.println(" templates");
Serial.println("Waiting for valid finger...");
}
void loop () {
getFingerprintdoor2();
delay(50);
//Fingerprint Sensor Labas
getFingerprintdoor1();
delay(50);
}
uint8_t getFingerprintdoor2() {
uint8_t p = finger1.getImage();
switch (p) {
case FINGERPRINT_OK:
//Serial.println("Image taken");
break;
case FINGERPRINT_NOFINGER:
// Serial.println("No finger detected");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
// Serial.println("Communication error");
return p;
case FINGERPRINT_IMAGEFAIL:
//Serial.println("Imaging error");
return p;
default:
//Serial.println("Unknown error");
return p;
}
// OK success!
p = finger1.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 = finger1.fingerFastSearch();
if (p == FINGERPRINT_OK) {
Serial.println("Found a print match!");
digitalWrite(door2, LOW);
// sendsms(textForSMS + " Noah", f1001);
// Serial.println(textForSMS);
// Serial.println("message sent.");
delay(3000);
digitalWrite(door2, HIGH);
delay(1000);
// Serial.print(finger1.fingerID);
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
//Serial.println("Communication error");
return p;
} else if (p == FINGERPRINT_NOTFOUND) {
// Serial.println("Did not find a match");
// digitalWrite(Buzzer,LOW);
// delay(1000);
// digitalWrite(Buzzer,HIGH);
return p;
} else {
//Serial.println("Unknown error");
return p;
}
return finger1.fingerID;
}
uint8_t getFingerprintdoor1() {
uint8_t p = finger2.getImage();
switch (p) {
case FINGERPRINT_OK:
//Serial.println("Image taken");
break;
case FINGERPRINT_NOFINGER:
// Serial.println("No finger detected");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
// Serial.println("Communication error");
return p;
case FINGERPRINT_IMAGEFAIL:
//Serial.println("Imaging error");
return p;
default:
//Serial.println("Unknown error");
return p;
}
// OK success!
p = finger2.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 = finger2.fingerFastSearch();
if (p == FINGERPRINT_OK) {
Serial.println("Found a print match!");
digitalWrite(door1, LOW);
delay(5000);
digitalWrite(door1, HIGH);
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
//Serial.println("Communication error");
return p;
} else if (p == FINGERPRINT_NOTFOUND) {
return p;
} else {
//Serial.println("Unknown error");
return p;
}
// found a match!
return finger2.fingerID;
}
А вот код проблемы, где мне нужно зарегистрироваться на обоих сканерах отпечатков пальцев:
#include <Adafruit_Fingerprint.h>
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial2);
Adafruit_Fingerprint finger2 = Adafruit_Fingerprint(&Serial3);
uint8_t id;
void setup()
{
Serial.begin(9600);
while (!Serial); // For Yun/Leo/Micro/Zero/...
delay(100);
Serial.println("\n\nAdafruit Fingerprint sensor enrollment");
// set the data rate for the sensor serial port
finger.begin(57600);
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!");
} else {
Serial.println("Did not find fingerprint sensor :(");
while (1) { delay(1); }
}
}
uint8_t readnumber(void) {
uint8_t num = 0;
while (num == 0) {
while (! Serial.available());
num = Serial.parseInt();
}
return num;
}
void loop()
{
Serial.println("Ready to enroll a fingerprint!");
Serial.println("Please type in the ID # (from 1 to 127) you want to save this finger as...");
if (Serial.available()>0)
switch(Serial.read())
{
case 'A':
id = readnumber();
if (id == 0) {
return;
}
Serial.print("Enrolling ID #");
Serial.println(id);
while (! getFingerprintEnroll1() );
break;
case 'B':
id = readnumber();
if (id == 0) {
return;
}
Serial.print("Enrolling ID #");
Serial.println(id);
while (! getFingerprintEnroll2() );
break;
}
}
uint8_t getFingerprintEnroll1() {
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;
}
}
uint8_t getFingerprintEnroll2() {
int p = -1;
Serial.print("Waiting for valid finger to enroll as #"); Serial.println(id);
while (p != FINGERPRINT_OK) {
p = finger2.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 = finger2.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 = finger2.getImage();
}
Serial.print("ID "); Serial.println(id);
p = -1;
Serial.println("Place same finger again");
while (p != FINGERPRINT_OK) {
p = finger2.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 = finger2.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 = finger2.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 = finger2.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;
}
}
Пожалуйста, помогите, я застрял в этой ситуации..
@Time Gold, 👍0
Обсуждение1 ответ
Библиотека, которую вы используете, похоже, не поддерживает экспорт или импорт отпечатков пальцев. Хотя если вы заглянете в руководство пользователя датчика отпечатков пальцев на сайте Adafruit, то увидите две упомянутые команды, которые, похоже, делают то, что вам нужно:
6.2.2 Загрузить изображение: UpImage
Описание: загрузить изображение в Img_Buffer на верхний компьютер. Дополнительные сведения о буфере изображений см. в разделе 1.1.1.
6.2.3 Загрузить изображение: DownImage
Описание: чтобы загрузить изображение с верхнего компьютера в Img_Buffer. Дополнительные сведения о буфере изображений см. в разделе 1.1.1.
Эти команды можно использовать для чтения или записи буфера изображения, где хранится изображение, когда оно было снято датчиком (речь идет только о данных изображения, а не о распознавании или регистрации; это должно быть сделано после загрузки изображения в буфер). Я не мог найти соответствующие функции в библиотеке, поэтому я думаю, что она не поддерживает это. Итак, чтобы получить то, что вам нужно, вам нужно прекратить использовать библиотеку и справиться с этим самостоятельно (или - может быть, лучше - расширить библиотеку, чтобы включить эту функцию).
В руководстве нет хорошей документации об этих функциях, а спецификация, которая есть у Adafruit, написана на китайском языке, так что я не смог ее прочитать. Вам нужно будет попробовать это и посмотреть, что вы получите, выпуская упомянутые команды (если только вы не умеете читать по-китайски и в этой таблице нет более полезной информации).
Я предполагаю, что после запроса загрузки текущего изображения модуль будет отправлять пакеты данных в настроенном размере пакета до тех пор, пока не передаст все изображение (обратите внимание, что он будет отправлять только 4 бита для каждого пикселя через UART, что означает 16-градационное изображение). После этого вы можете запросить загрузку на другом модуле. После пакета подтверждения, я думаю, вам нужно отправить данные изображения в том же формате, что и вы получили их от первого модуля, в пакетах с настроенным размером пакета.
При настройке на один и тот же размер пакета вы можете запросить загрузку и загрузку одновременно для каждого модуля и просто пропустить пакеты. После переноса изображения вы можете начать распознавание на обоих модулях.
спасибо, я поищу его ... но могу ли я использовать это в arduino?, @Time Gold
Да, вы можете. Это всего лишь команды, выданные через UART. Проблемы могут возникнуть только в том случае, если вы попытаетесь буферизировать полное изображение в Arduino. Но, как я уже писал, вы можете передавать пакеты непосредственно в другой модуль, так что у вас будет только около 2 пакетов одновременно в Arduino, @chrisl
спасибо!!! можете ли вы прислать мне ссылку или руководство о том, где я должен начать работать plss, @Time Gold
Начните с библиотеки из Adafruit, которую вы уже используете. Попробуйте понять, что делает код. Затем вы можете использовать руководство, которое я связал, и попытаться запустить команды загрузки/выгрузки. Если это сработает, вы можете расширить библиотеку для своего использования. Для этого нет учебника, поэтому вам нужно самому разобраться в этой теме., @chrisl
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Arduino Due vs Mega 2560
- Как получить уникальный идентификатор для всех плат Arduino?
- Почему я получаю avrdude: stk500v2_ReceiveMessage(): timeout error when uploading to Arduino Mega?
- Тайм-аут связи Arduino Mega с ошибкой программатора
вы сделали это и работаете правильно?, @quarantino tentin