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

Пожалуйста, помогите, я застрял в этой ситуации..

, 👍0

Обсуждение

вы сделали это и работаете правильно?, @quarantino tentin


1 ответ


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