Un code pour capteur d'empreintes ... Etrange

Bonsoir,

pour mon projet de SI, je dois coder entre autres un capteur d'empreintes Adafruit qui fonctionne très bien, mais le code me préoccupe. En fait, lorsque l'on place son doigt avec un certain code, on reçoit l'ID de l'empreinte ainsi reconnue. Mon problème est dans le code: je comprends plus ou moins ce dernier, mais il est hors du void loop() donc c'est très dérangeant ... Je ne comprends pas l’intérêt. Mon but est de sécuriser un système en permettant de, tant qu'aucune empreinte n'a été reconnue, le code est freeze (boucle infinie sans doute). Mais voilà, à cause de ce code hors de la loop, je suis troublé.

Voici ce que j'ai déjà essayé de faire (si on ne laisse que la partie empreinte digitale):

#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
#include <Adafruit_Fingerprint.h>

LiquidCrystal_I2C lcd(0x27,20,4);  // On indique l'adresse de l'écran 20x4 qui est "0x27"

//Empreinte digitale
#include <SoftwareSerial.h>
SoftwareSerial mySerial(6, 5); //(TX, RX)

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

boolean boucleUneFois = false; //Variable pour executer une boucle qu'une seule fois
//Empreinte digitale

void setup()
{
  // Positionnement horloge a run-mode et desactive protection en ecriture
  lcd.init(); // Initialisation de l'écran LCD
  lcd.backlight(); // Allumer la lumière de l'écran LCD qui rend les caractères plus visibles

if (finger.verifyPassword()) {
    lcd.setCursor(0, 0);
    lcd.print("Capteur d'empreintes");
    lcd.setCursor(0, 1);
    lcd.print("detecte");
  } else {
    lcd.setCursor(0, 0);
    lcd.print("Capteur d'empreintes");
    lcd.setCursor(0, 1);
    lcd.print("non detecte");
    while (1) { delay(1); }
  } delay(2000);
  lcd.clear();

  finger.getTemplateCount();
  lcd.setCursor(0, 0);
  lcd.print(finger.templateCount); 
  lcd.print(" modele(s)");
  lcd.setCursor(0, 1);
  lcd.print("deja stocke(s)");
  delay(2000);
  lcd.clear();
  
}

void loop()
{
  {
  getFingerprintIDez();
  delay(50);            //don't need to run this at full speed.
  }

if ((boucleUneFois) == false)
{
  {  
  //Ecrire "Bienvenue, ***** sur l'écran LCD
  if ((finger.fingerID) == 1){
    Serial.println("Bienvenue, François");
  }
  if ((finger.fingerID) == 2){
    Serial.println("Bienvenue, Guillaume");
  }
  if ((finger.fingerID) == 3){
    Serial.println("Bienvenue, Lucas");
  }
  if ((finger.fingerID) == 4){
    Serial.println("Bienvenue, Philippe");
      }
    }
     boucleUneFois = true;
  }
  
}

//Là, on est plus dans la loop ;_;
uint8_t getFingerprintID() {
  uint8_t p = finger.getImage();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image prise");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println("Aucune empreinte détectée");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Erreur de communication");
      return p;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Erreur d'image");
      return p;
    default:
      Serial.println("Erreur inconnue ??!");
      return p;
  }

  // OK success!

  p = finger.image2Tz();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image convertie");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("L'image est trop imprécise");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Erreur de communication");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Impossible de trouver les sillons de l'empreinte digitale");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Impossible de trouver les sillons de l'empreinte digitale");
      return p;
    default:
      Serial.println("Erreur inconnue ??!");
      return p;
  }
  
  // OK converted!
  p = finger.fingerFastSearch();
  if (p == FINGERPRINT_OK) {
    Serial.println("Une empreinte a été reconnue !");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Erreur de communication");
    return p;
  } else if (p == FINGERPRINT_NOTFOUND) {
    Serial.println("Aucune empreinte reconnue");
    return p;
  } else {
    Serial.println("Erreur inconnue ??!");
    return p;
  }   
  
  // found a match!
  Serial.print("ID trouvé ! #"); Serial.print(finger.fingerID); 
Serial.print(" avec une précision de "); Serial.println(finger.confidence);  

  return finger.fingerID;
}

// 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("ID trouvé ! #"); Serial.print(finger.fingerID); 
  Serial.print(" avec une précision de "); Serial.println(finger.confidence);
  return finger.fingerID; 
}

Voilà, si jamais vous ne savez pas trop mais que vous pouvez quand même m'expliquer cette histoire de loop, ça serait super sympa :slight_smile:
Passez une bonne soirée

Expliquer quoi?

Après la loop, tu as deux fonctions :

  • getFingerprintID qui renvoie un uint8_t via l'instruction return finger.fingerID;
  • getFingerprintIDez qui renvoie un int via l'instuction return finger.fingerID;
    La seconde fonction est appelée depuis la loop, mais je ne trouve pas l'appel de la première...

finger est défini en début de programme :

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

Bonjour, iFrostizz

iFrostizz:
Oui, d'accord, mais alors quel intérêt de mettre ces deux fonctions après la loop ? C'est pour ça, je ne comprends pas bien comment ça peut fonctionner.

Cordialement,
bidouilleelec

Le compilateur est souple et accepte que les fonctions soient déclarées après le programme principal.

Salut
Je vois que tu es parti de cet exemple.

Je ne connais pas la librairie mais en supposant que la lecture d'empreinte sont non bloquante, tu passes par un test d'une variable boucleUneFois qui vaut false au départ, et que tu initialise à true quelque soit le résultat de la lecture d'empreinte.
Donc tu ne repassera jamais dans le code permettant l'affichage des messages "Bienvenue ...".

J'ai l'impression que tu ne comprends pas bien la notion de loop() dans le monde ARDUINO.
loop() comme son nom l'indique est appelée en boucle par la fonction main() de la librairie standard, donc on est déjà dans une boucle infinie.
Rien ne t'empêche de mémoriser finger.fingerID dans une variable et de dérouler ton "programme normal" en fonction de la valeur de cette variable.

@+

Dans ce cas, il faut virer cette variable boucleUneFois.
Une boucle while est inutile, puisque loop() est déjà appelée dans une boule while située dans la fonction main().
Il suffit d'écrire :

Lire l'empreinte
Si une empreinte est détectée
afficher le message "Bienvenue xxxx"
lire les autres capteurs
traiter les résultats
Sinon
afficher le message "Aucune empreinte valide n'a été reconnue"

@+

On est bien d'accord que la loop() appelle une fonction nommée getFingerprintIDez() ?
Ou vois-tu un problème ?

C’était un peu l’objet de ma question au point un, J’ai l’impression que iFrostizz ne comprend pas ce qu’est un appel de fonction...

J'en ai bien l'impression aussi.
Dans ce cas, il faudrait suivre le conseil de bidouilleelec : un tuto C.

Oui, d'accord, mais alors quel intérêt de mettre ces deux fonctions après la loop ? C'est pour ça, je ne comprends pas bien comment ça peut fonctionner.

D'après ce que je comprends la fonction getFingerprintID fait la même chose que getFingerprintIDez en affichant plus de détails.

getFingerprintID n'est pas utilisée mais peut être appelée à la place de getFingerprintIDez dans la loop pour plus de facilité de debug.
Dans un premier temps, assimiler la notion de fonction semble une nécessité, à moins que je me trompe ?

@+