Recents in Beach


Receba o meu conteúdo GRATUITAMENTE


Identificação por impressão digital com Arduino


Hoje vou mostrar para vocês como utilizar o reconhecimento da digital para poder fazer autenticação, ou seja, como fazer uma fechadura com controle digital para ser empregada em um sistema de segurança, por exemplo. Vamos, então, cadastrar, verificar e apagar digitais em um sensor biométrico, isso usando ESP32, ESP8266 ou Arduino. Confere aí!


 

 

 

RECURSOS USADOS

  • ESP32, ESP8266 ou Arduino
  • Sensor Biométrico DY50
  • Protoboard
  • Jumpers


 

 

 

MONTAGEM


 

 

 

BIBLIOTECA

Adafruit Fingerprint Sensor Library


https://github.com/adafruit/Adafruit-Fingerprint-Sensor-Library

 

 

 

FLUXOGRAMA


 

1 - Cadastrar Digital


 

 

2 - Verificar Digital





3 – Mostrar quantidade de digitais cadastradas




 

4 – Apagar digital em uma posição




 

5 – Apagar banco de digitais




 


 

CÓDIGO

Declarações e variáveis

#include <Adafruit_Fingerprint.h> //https://github.com/adafruit/Adafruit-Fingerprint-Sensor-Library

//Senha padrão do sensor de digitais
const uint32_t password = 0x0;

//Objeto responsável por controlar o sensor de digitais
//Utilizamos a Serial2 para comunicação e a senha padrão
//Você também pode utilizar software serial se seu dispositivo não tiver  mais HardwareSerial disponível
//Se não passar o parâmetro de senha ele também considera como senha padrão (0x0)
Adafruit_Fingerprint fingerprintSensor = Adafruit_Fingerprint(&Serial2, password);

 

setup

void setup()  
{
  Serial.begin(9600);

  //Inicializa o sensor de digitais
  setupFingerprintSensor();
}

 

setupFingerprintSensor

void setupFingerprintSensor()
{
  //Inicializa o sensor
  fingerprintSensor.begin(57600);

  //Verifica se a senha está correta
  if(!fingerprintSensor.verifyPassword())
  {
    //Se chegou aqui significa que a senha está errada ou o sensor está problemas de conexão
    Serial.println(F("Não foi possível conectar ao sensor. Verifique a senha ou a conexão"));
    while(true);
  }
}

 

loop

void loop()
{
  //Exibe o menu no monitor serial
  printMenu();

  //Faz a leitura do comando digitado
  String command = getCommand();
  
  //Transforma a string em inteiro
  int i = command.toInt();

  //Verifica qual o número digitado e chama a função correspondente
  switch (i)
  {
    case 1:
      storeFingerprint();
      break;
    case 2:
      checkFingerprint();
      break;
    case 3:
      printStoredFingerprintsCount();
      break;
    case 4:
      deleteFingerprint();
      break;
    case 5:
      emptyDatabase();
      break;
    default:
      Serial.println(F("Opção inválida"));
      break;
  }

  delay(1000);
}

 

printMenu

//Exibe o menu no monitor serial
void printMenu()
{
  Serial.println();
  Serial.println(F("Digite um dos números do menu abaixo"));
  Serial.println(F("1 - Cadastrar digital"));
  Serial.println(F("2 - Verificar digital"));
  Serial.println(F("3 - Mostrar quantidade de digitais cadastradas"));
  Serial.println(F("4 - Apagar digital em uma posição"));
  Serial.println(F("5 - Apagar banco de digitais"));
}

 

getCommand

//Espera até que se digite algo no monitor serial e retorna o que foi digitado
String getCommand()
{
  while(!Serial.available()) delay(100);
  return Serial.readStringUntil('\n');
}

 

storeFingerprint

//Cadastro da digital
void storeFingerprint()
{
  Serial.println(F("Qual a posição para guardar a digital? (1 a 149)"));

  //Lê o que foi digitado no monitor serial
  String strLocation = getCommand();

  //Transforma em inteiro
  int location = strLocation.toInt();

  //Verifica se a posição é válida ou não
  if(location < 1 || location > 149)
  {
    //Se chegou aqui a posição digitada é inválida, então abortamos os próximos passos
    Serial.println(F("Posição inválida"));
    return;
  }

  Serial.println(F("Encoste o dedo no sensor"));

  //Espera até pegar uma imagem válida da digital
  while (fingerprintSensor.getImage() != FINGERPRINT_OK);
  
  //Converte a imagem para o primeiro padrão
  if (fingerprintSensor.image2Tz(1) != FINGERPRINT_OK)
  {
    //Se chegou aqui deu erro, então abortamos os próximos passos
    Serial.println(F("Erro image2Tz 1"));
    return;
  }
  
  Serial.println(F("Tire o dedo do sensor"));

  delay(2000);

  //Espera até tirar o dedo
  while (fingerprintSensor.getImage() != FINGERPRINT_NOFINGER);

  //Antes de guardar precisamos de outra imagem da mesma digital
  Serial.println(F("Encoste o mesmo dedo no sensor"));

  //Espera até pegar uma imagem válida da digital
  while (fingerprintSensor.getImage() != FINGERPRINT_OK);

  //Converte a imagem para o segundo padrão
  if(fingerprintSensor.image2Tz(2) != FINGERPRINT_OK)
  {
    //Se chegou aqui deu erro, então abortamos os próximos passos
    Serial.println(F("Erro image2Tz 2"));
    return;
  }

  //Cria um modelo da digital a partir dos dois padrões
  if(fingerprintSensor.createModel() != FINGERPRINT_OK)
  {
    //Se chegou aqui deu erro, então abortamos os próximos passos
    Serial.println(F("Erro createModel"));
    return;
  }

  //Guarda o modelo da digital no sensor
  if(fingerprintSensor.storeModel(location) != FINGERPRINT_OK)
  {
    //Se chegou aqui deu erro, então abortamos os próximos passos
    Serial.println(F("Erro storeModel"));
    return;
  }

  //Se chegou aqui significa que todos os passos foram bem sucedidos
  Serial.println(F("Sucesso!!!"));
}

 

checkFingerprint

//Verifica se a digital está cadastrada
void checkFingerprint()
{
  Serial.println(F("Encoste o dedo no sensor"));

  //Espera até pegar uma imagem válida da digital
  while (fingerprintSensor.getImage() != FINGERPRINT_OK);

  //Converte a imagem para o padrão que será utilizado para verificar com o banco de digitais
  if (fingerprintSensor.image2Tz() != FINGERPRINT_OK)
  {
    //Se chegou aqui deu erro, então abortamos os próximos passos
    Serial.println(F("Erro image2Tz"));
    return;
  }
  
  //Procura por este padrão no banco de digitais
  if (fingerprintSensor.fingerFastSearch() != FINGERPRINT_OK)
  {
    //Se chegou aqui significa que a digital não foi encontrada
    Serial.println(F("Digital não encontrada"));
    return;
  }

  //Se chegou aqui a digital foi encontrada
  //Mostramos a posição onde a digital estava salva e a confiança
  //Quanto mais alta a confiança melhor
  Serial.print(F("Digital encontrada com confiança de "));
  Serial.print(fingerprintSensor.confidence);
  Serial.print(F(" na posição "));
  Serial.println(fingerprintSensor.fingerID);
}

 

printStoredFingerprintsCount

void printStoredFingerprintsCount()
{
  //Manda o sensor colocar em "templateCount" a quantidade de digitais salvas
  fingerprintSensor.getTemplateCount();

  //Exibe a quantidade salva
  Serial.print(F("Digitais cadastradas: "));
  Serial.println(fingerprintSensor.templateCount);
}

 

deleteFingerprint

void deleteFingerprint()
{
  Serial.println(F("Qual a posição para apagar a digital? (1 a 149)"));

  //Lê o que foi digitado no monitor serial
  String strLocation = getCommand();

  //Transforma em inteiro
  int location = strLocation.toInt();

  //Verifica se a posição é válida ou não
  if(location < 1 || location > 149)
  {
    //Se chegou aqui a posição digitada é inválida, então abortamos os próximos passos
    Serial.println(F("Posição inválida"));
    return;
  }

  //Apaga a digital nesta posição
  if(fingerprintSensor.deleteModel(location) != FINGERPRINT_OK)
  {
    Serial.println(F("Erro ao apagar digital"));
  }
  else
  {
    Serial.println(F("Digital apagada com sucesso!!!"));
  }
}

 

emptyDatabase

void emptyDatabase()
{
  Serial.println(F("Tem certeza? (s/N)"));

  //Lê o que foi digitado no monitor serial
  String command = getCommand();

  //Coloca tudo em maiúsculo para facilitar a comparação
  command.toUpperCase();

  //Verifica se foi digitado "S" ou "SIM"
  if(command == "S" || command == "SIM")
  {
    Serial.println(F("Apagando banco de digitais..."));

    //Apaga todas as digitais
    if(fingerprintSensor.emptyDatabase() != FINGERPRINT_OK)
    {
      Serial.println(F("Erro ao apagar banco de digitais"));
    }
    else
    {
      Serial.println(F("Banco de digitais apagado com sucesso!!!"));
    }
  }
  else
  {
    Serial.println(F("Cancelado"));
  }
}

 

 

FAÇA O DOWNLOAD DOS ARQUIVOS
PDF
INO

 



Postar um comentário

10 Comentários

  1. Fernando você é fantástico nas explicações, não se preocupe com tamanho do vídeo. QUALIDADE PRECISA DE TEMPO e dedicação! PARABÉNS! eu queria fazer um pedido curioso, já trabalhei com servo e com algumas bibliotecas e até tentei fazer um balanceador de plataforma (pra equilibrar alguma coisa em movimento). Isso nessa época de pandemia abriria um nicho pra transportar produtos delicados que não podem balançar muito, utilizando também acelerômetros... mas minha plataforma ficou muito lerda e não funciona direito pq tb tem umas contas matemáticas pra normalizar as leituras pros servos... acho que chama kaliman... enfim.. parece muito complexo mas se torna simples quando você pensa em poder prospectar uma solução pras pessoas que transportam bolos por exemplo... mas enfim, acompanho cada vídeo seu... um grande abraço e parabéns de novo!! felipe@9ideias.com . precisando de sistema web com integrações inteligentes me chama!!

    ResponderExcluir
  2. FERNANDO
    EU CONSEGUI COMPILAR PORÉM ESTA DANDO ERRO DE SENHA DO SENHOR
    O Q DEVO FAZER
    PRECISO MT DE SUA AJUDA

    GRATO.

    ResponderExcluir
    Respostas
    1. Também não consegui com o ESP32, só com ESP8266. Não Compila, dá varios erros. Eu substitui o mySerial por Serial2, mas não vai. Vc resolveu?

      Excluir
    2. Funcionou na IDE 1.8.5 e na AVR Boards 1.8.3, NÃO FUNCIONOU na IDE 1.8.13

      Excluir
    3. Conseguir rodar no ESP32, mas havia errado a ligação eléctrica. Logo, aparecia erro de "Não foi possível conectar ao sensor. Verifique a senha ou a conexão".

      Verifique a ligação eléctrica, O TX do sensor vai no RX do ESP, da mesma forma que o RX do esp vai no TX do sensor

      o Código funciona perfeitamente, linha por linha.

      Excluir
  3. FERNANDO
    EU CONSEGUI COMPILAR PORÉM ESTA DANDO ERRO DE SENHA DO SENSOR
    O Q DEVO FAZER
    PRECISO MT DE SUA AJUDA

    GRATO.

    ResponderExcluir
    Respostas
    1. O meu aqui tbm não pegou , porém o meu sensor não ligou . O seu sensor chegou a ligar?

      Excluir
    2. Funcionou na IDE 1.8.5 e na AVR Boards 1.8.3, NÃO FUNCIONOU na IDE 1.8.13

      Excluir
  4. Conseguir cadastrar as digitais, qual o passo para carregar o código com as digitais cadastradas, e qual pino que ligo um relé para acionar uma fechadura? Grato!

    ResponderExcluir