Problema con Lettore di Impronte [Risolto]

Salve a tutti ho un problema strano con un lettore di impronte .

Per capirne il funzionamento ho aggiunto allo sketck “fingerprint” (gia presente tra gli esempi) l’accensione di un led al momento del riconoscimento dell’impronta.

Il fatto strano è che nonostante dalla seriale si capisca che il riconoscimento è andato a buon fine
(infatti invece di “-1” appare scritto " Found ID # numero template …ecc " ) il led si accende una
volta su 3/4, poi magari due volte si e altre 4/5 no in modo random.

Questo è lo screeshot della seriale in cui si vede il cambiamento al momento del riconoscimento dell’impronta

Questo è invece lo sketch

/*************************************************** 
  This is an example sketch for our optical Fingerprint sensor

  Designed specifically to work with the Adafruit BMP085 Breakout 
  ----> http://www.adafruit.com/products/751

  These displays use TTL Serial to communicate, 2 pins are required to 
  interface
  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ****************************************************/


#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>

int getFingerprintIDez();

// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino  (WHITE wire)
SoftwareSerial mySerial(2, 3);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

// On Leonardo/Micro or others with hardware serial, use those! #0 is green wire, #1 is white
//Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial1);


# define LED_ATT 4
boolean a = false;

void setup()  
{
  while (!Serial);  // For Yun/Leo/Micro/Zero/...
  
  Serial.begin(9600);
  Serial.println("Adafruit finger detect test");

  // 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);
  }
  Serial.println("Waiting for valid finger...");

 
  
  pinMode(LED_ATT, OUTPUT);  // Led Verde con attivazione se LOW
  digitalWrite(LED_ATT, HIGH);

  

}

void loop()                     // run over and over again

{
  getFingerprintIDez();
  delay(50);            //don't ned to run this at full speed.
 Serial.println(getFingerprintIDez());
    
   if (getFingerprintIDez() != -1){
    a = true;
    }

  if (a == true){
    digitalWrite(LED, LOW);      // Disattivo Led Rosso
    digitalWrite(LED_ATT, LOW);  // Attivo Led Verde

    delay (1000);

    digitalWrite(LED_ATT, HIGH);  // disattivo Led Verde
    a = false;
    }


}

////////////////////
uint8_t getFingerprintID() {
  uint8_t p = finger.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 = 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.fingerFastSearch();
  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) {
    Serial.println("Did not find a match");
    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); 
 
 
}

// returns -1 if failed, otherwise returns ID #
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)  return -1;
  
  // found a match!
  Serial.print("Found ID #"); Serial.print(finger.fingerID); 
  Serial.print(" with confidence of "); Serial.println(finger.confidence);
  return finger.fingerID; 
  
  
 
}

Vi domando come mai quando riconosce l’impronta ( come dimostrato dalla seriale) il
led non si accende il 100% delle volte?

Forse vanno modificati dei tempi da qualche parte nello sketch di esempio?

Ogni suggerimento è ben accetto

ciao Roby0303,

tu invochi due volta la funzione getFingerprintIDez()...una per il Serial.println() ed una in un if() che dovrebbe accenderti il LED_ATT...prova ad eseguire una sola volta la funzione getFingerprintIDez() salvando il risultato in una variabile, anche locale, e stampare il valore della variabile e fare l'if() sulla variabile...questo perchè, ma dico forse, con la prima chiamata, quando ti ritorna "vero", lasciami dire, gli svuoti il "buffer" e quindi alla seconda lettura, quella dell'if(), ti da falso.

Grazie @ORSO2001 per la risposta.

Se non ho capito male ho modificato il codice come mi hai suggerito (vedi qui di seguito),
ed effettivamente adesso funziona meglio ma salta ancora l’accensione del led però meno
rispetto a prima. ( per sicurezza ho anche “commentato” la scrittura sulla seriale, tanto non serve)

Quindi sicuramente la tua idea ha influito positivamentema ma deve esserci ancora qualcosa da sistemare e penso probabilmente nel codice dell’esempio.

Cosa potrebbe essere?

Una curiosità, cosa significa e rappresenta “with confidence of…(numero)” che viene scritto
nella seriale quando riconosce un’impronta?

/***************************************************
  This is an example sketch for our optical Fingerprint sensor

  Designed specifically to work with the Adafruit BMP085 Breakout
  ----> http://www.adafruit.com/products/751

  These displays use TTL Serial to communicate, 2 pins are required to
  interface
  Adafruit invests time and resources providing this open source code,
  please support Adafruit and open-source hardware by purchasing
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries. 
  BSD license, all text above must be included in any redistribution
 ****************************************************/


#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>

int getFingerprintIDez();

// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino  (WHITE wire)
SoftwareSerial mySerial(2, 3);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

// On Leonardo/Micro or others with hardware serial, use those! #0 is green wire, #1 is white
//Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial1);


# define LED_ATT 4
int a ;

void setup() 
{
  while (!Serial);  // For Yun/Leo/Micro/Zero/...
 
  Serial.begin(9600);
  Serial.println("Adafruit finger detect test");

  // 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);
  }
  Serial.println("Waiting for valid finger...");

 
 
  pinMode(LED_ATT, OUTPUT);  // Led Verde con attivazione se LOW
  digitalWrite(LED_ATT, HIGH);

 

}

void loop()                     // run over and over again

{
  getFingerprintIDez();
  
  a = getFingerprintIDez();
  delay(50);            //don't ned to run this at full speed.
      
  //Serial.println(a);
         
  if (a != -1){

    digitalWrite(LED_ATT, LOW);  // Attivo Led Verde

    delay (1000);

    digitalWrite(LED_ATT, HIGH);  // disattivo Led Verde
    a = -1;
    }


}

////////////////////
uint8_t getFingerprintID() {
  uint8_t p = finger.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 = 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.fingerFastSearch();
  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) {
    Serial.println("Did not find a match");
    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);
 
 
}

// returns -1 if failed, otherwise returns ID #
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)  return -1;
 
  // found a match!
  Serial.print("Found ID #"); Serial.print(finger.fingerID);
  Serial.print(" with confidence of "); Serial.println(finger.confidence);
  return finger.fingerID;
 
 
 
}

ciao,

se questo è esattamente il tuo ultimo codice nel loop(), subito all'inizio, hai lasciato ancora una chiamata a getFingerprintIDez(); che non serve a nulla...commentala e lascia solo:

a = getFingerprintIDez();

poi cambia l'if in questa modo:

digitalWrite(LED_ATT, LOW);  // Attivo Led Verde
delay (1000);
digitalWrite(LED_ATT, HIGH);  // disattivo Led Verde
a = -1;
delay(1000);

una cosa non capisco...perchè subito all'inizio quando dichiari variabili , #define etc metti questo:

int getFingerprintIDez();

che senso ha!?

EDIT: non so che senso ha...posso solo teorizzare...ID è l'indirizzo della scheda per riconoscimento impronte..."confidence" sarà l'ID dell'impronta memorizzata.

Una curiosità, cosa significa e rappresenta “with confidence of…(numero)” che viene scritto
nella seriale quando riconosce un’impronta?

Quello dipende dal sensore. Leggi leggere il manuale.
Ok ho guardato. Non so il cinese.

È una variabile a 16 bit che da il sensore come risposta come il 5 e 6 byte:

confidence = recvPacket[4];
confidence <<= 8;
confidence |= recvPacket[5];

La parola dice fiducia o affidabilitá percui suppongo é un valore che dice quanto corrisponde l’ impronta digitale letta con quella di riferimento memorizzata.

Ciao Uwe

ORSO2001:
se questo è esattamente il tuo ultimo codice nel loop(), subito all'inizio, hai lasciato ancora una chiamata a getFingerprintIDez(); che non serve a nulla...commentala e lascia solo:

a = getFingerprintIDez();

Quella chiamata era già scritta nel codice dell'esempio e quindi l'avevo lasciata :confused:

e sai che ti dico... era propio quella che incasinava il tutto :slight_smile:
adesso ogni lettura è un'accensione ;D

ORSO2001:
una cosa non capisco...perchè subito all'inizio quando dichiari variabili , #define etc metti questo:

int getFingerprintIDez();

che senso ha!?

Anche questa era già scritta nell'esempio ( non l'ho messa io) comunque ho provato a toglierla e funziona tutto lo stesso

@ORSO

Ti posso solo ringraziare e Karmare, mi hai risolto un problema e mi hai anche insegnato alcuni concetti.

@uwefed

Era quello che mi ero immaginato anche io e Te mi hai confermato,grazie.

conferma:
Getting Started with the Fingerprint Sensor - YouTube un tutorial di Adafruit.
al minuto 1:46 lo dice. Piú alto é il numero meglio é il riconoscimento della impronta.

Per motivi di sicurezza puoi Tu scegliere se acettare un numero basso o che deve esserci una corrispondenza alta.

Ciao Uwe

@uwe
me lo diceva sempre il mio babbo.... impara le lingue che ti faranno sempre comodo :smiley: :smiley:

Beh, io so l' italiano. :smiley: :smiley:
Ciao Uwe