Leitor Biométrico com ESP32 – FPM10A

,

Olá, como estão? Hoje iremos trazer mais um sensor, desta vez um muito utilizado na área de segurança e IoT (Internet das Coisas) o leitor biométrico mais especificamente o sensor FPM10A. Onde iremos desenvolver um projeto baseado no leitor biométrico com ESP32.

Leitor Biométrico FPM10A - WJ Componentes
ESP32

Componentes Utilizados


Funcionamento do Projeto Leitor Biométrico com ESP32


O circuito baseia-se no ESP32 junto com o leitor biométrico FPM10A. O leitor tem seis saídas, mas somente iremos usar quatro delas, sendo uma delas o VCC, importante ressaltar que o FPM10A não funciona com a tenção de 3,3V a tensão mínima é de 3,6V, as outras saídas que usaremos é RX, TX  e GND.

Montagem do Projeto Leitor Biométrico com ESP32


Logo após compra dos componentes na WJ Componentes, vamos à montagem! Então agora para realizar a montagem é simples, só teremos que tomar cuidado com algumas coisas entre elas são que o FPM10A não funciona com 3,3V a tensão mínima é de 3,6v e que as saídas TX do sensor são conectadas na entrada RX do microcontrolador e o RX do sensor no TX do microcontrolador. No nosso caso como iremos utilizar o ESP32 as saídas dele é de 3,3V então nesse caso temos que utilizar o pino VIN para alimentar o leitor biométrico, ligamos o GND do sensor ao GND do microcontrolador e usaremos os pinos TX2 e RX2 (GPIO16 e GPIO17) para realizar as conexões com o ESP32.

Contudo segue abaixo uma imagem que demonstrando a montagem do circuito.

Montagem do Circuito Eletrônico na Protoboard - Leitor Biométrico com ESP32

Utilizando o ESP32 Com a Arduino IDE


Entretanto se você ainda não possui as placas ESP instalado na IDE do Arduíno é necessário realizar a instalação, seguindo os passos abaixo. Contudo caso já possua podemos prosseguir para a programação da placa.

Então na Arduíno IDE clique em Preferências e cole o link abaixo em “URLs Adicionais para Gerenciadores de Placas” e dê um OK.

URL: https://dl.espressif.com/dl/package_esp32_index.json

Em seguida, clique em Ferramentas > Placas > Gerenciador de placas, pesquise ESP32, selecione a versão 1.0.2 e clique em instalar.

Instalação ESP32 no Gerenciador de Placas

Logo após instalado, vá em Ferramentas -> Placas e selecione a placa ESP32 Dev Module.

Código-fonte do Projeto Leitor Biométrico com ESP32


Em seguida segue abaixo o código-fonte completo do projeto.

//Biblioteca -----------------------------------------------------------------------------------------
#include <Adafruit_Fingerprint.h>                           // Responsável pelo Sensor Biométrico

//Declarações de Variáveis----------------------------------------------------------------------------
const uint32_t password = 0x0;                              // Senha padrão do sensor biométrico

//Objetos --------------------------------------------------------------------------------------------
Adafruit_Fingerprint fingerSensor = Adafruit_Fingerprint(&Serial2, password);

//Funções Auxiliares ---------------------------------------------------------------------------------
void printMenu();                                           // Responsável pelo Menu
String pegaComando();                                       // Responsável por Pegar Comando
void cadastraDigital();                                     // Responsável por Cadastrar Digital
void verificaDigital();                                     // Responsável por Verificar Digital
void contDigital();                                         // Responsável por Contar Digitais
void deleteDigital();                                       // Responsável por Deletar Digital
void limpaDatabase();                                       // Responsável por Limpar Banco de Dados

//Setup ----------------------------------------------------------------------------------------------
void setup(){
    Serial.begin(115200);                                   // Inicializa o Serial
    fingerSensor.begin(57600);                              // Inicializa o Sensor
    if(!fingerSensor.verifyPassword()){                     // Verifica se não é a senha do sensor
        Serial.println("Não foi possível conectar ao sensor. Verifique a senha ou a conexão");
        while(true){};                                      // Loop Infinito
    }
}

//Loop -----------------------------------------------------------------------------------------------
void loop(){
    printMenu();                                            // Chama função printMenu()
    String command = pegaComando();                         // Faz a leitura do comando digitado
    int i = command.toInt();                                // Transforma em inteiro
    switch (i){                                             // Verifica qual o número digitado
    case 1:                                                 // Se i = 1
        cadastraDigital();                                  // Chama Função cadastraDigital()
        break;
    case 2:                                                 // Se i = 2
        verificaDigital();                                  // Chama Função verificaDigital()
        break;
    case 3:                                                 // Se i = 3
        contDigital();                                      // Chama Função contDigital()
        break;
    case 4:                                                 // Se i = 4
        deleteDigital();                                    // Chama Função deletaDigital()
        break;
    case 5:                                                 // Se i = 5
        limpaDatabase();                                    // Chama Função limpaDatabase()
        break;
    default:
        Serial.println("Opção inválida");                   // Imprime na Serial
        break;
    }
    delay(1000);                                            // Espera 1s
}

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

//Pega Comando ---------------------------------------------------------------------------------------
String pegaComando(){
    while(!Serial.available()) delay(100);
    return Serial.readStringUntil('\n');                    // Retorna o que foi digitado na Serial
}

//Cadastra Digital -----------------------------------------------------------------------------------
void cadastraDigital(){
    Serial.println("Qual a posição para guardar a digital? (1 a 149)"); // Imprime na Serial
    String strLocation = pegaComando();                     // Faz a leitura do comando digitado
    int location = strLocation.toInt();                     // Transforma em inteiro

    if(location < 1 || location > 169){                     // Verifica se a posição é invalida
        Serial.println("Posição inválida");                 // Imprime na Serial
        return;
    }

    Serial.println("Encoste o dedo no sensor");             // Imprime na Serial
    while (fingerSensor.getImage() != FINGERPRINT_OK){};    // Espera até pegar uma imagem válida
    
    if (fingerSensor.image2Tz(1) != FINGERPRINT_OK){        // Converte a imagem para primeiro padrão
        Serial.println("Erro image2Tz 1");                  // Erro de Imagem
        return;
    }
    
    Serial.println("Tire o dedo do sensor");                // Imprime na Serial
    delay(2000);                                            // Espera 2s
    while (fingerSensor.getImage() != FINGERPRINT_NOFINGER){}; // Espera até tirar o dedo
    Serial.println("Encoste o mesmo dedo no sensor");       // Imprime na Serial
    while (fingerSensor.getImage() != FINGERPRINT_OK){};    // Espera até pegar uma imagem válida

    if(fingerSensor.image2Tz(2) != FINGERPRINT_OK){         // Converte a imagem para o segundo padrão
        Serial.println("Erro image2Tz 2");                  // Erro de Imagem
        return;
    }

    if(fingerSensor.createModel() != FINGERPRINT_OK){       // Cria um modelo com os dois padrões
        Serial.println("Erro createModel");                 // Erro para criar o Modelo
        return;
    }

    if(fingerSensor.storeModel(location) != FINGERPRINT_OK){// Guarda o modelo da digital no sensor
        Serial.println("Erro já existe uma biométrica cadastrada"); // Já existe 
        return;
    }

    Serial.println("Sucesso!!!");                           // Guardada com sucesso
}

//Verifica Digital -----------------------------------------------------------------------------------
void verificaDigital(){
    Serial.println("Encoste o dedo no sensor");             // Imprime na Serial
    while (fingerSensor.getImage() != FINGERPRINT_OK){};    // Espera até pegar uma imagem válida

    if (fingerSensor.image2Tz() != FINGERPRINT_OK){         // Converte a imagem para utilizar
        Serial.println("Erro image2Tz");                    // Imprime na Serial
        return;
    }

    if (fingerSensor.fingerFastSearch() != FINGERPRINT_OK){ // Procura pela digital no banco de dados
        Serial.println("Digital não encontrada");           // Imprime na Serial
        return;
    }

    Serial.print("Digital encontrada com confiança de ");   // Se chegou aqui a digital foi encontrada
    Serial.print(fingerSensor.confidence);                  // Imprime a confiança quanto maior melhor
    Serial.print(" na posição ");                           // Imprime a posição da digital
    Serial.println(fingerSensor.fingerID);                  // Imprime a posição da digital
}

//Conta Qtde de Digitais -----------------------------------------------------------------------------
void contDigital(){
    fingerSensor.getTemplateCount();                        // Atribui a "templateCount" a qtde
    Serial.print("Digitais cadastradas: ");                 // Imprime na Serial
    Serial.println(fingerSensor.templateCount);             // Imprime na Serial a quantidade salva
}

//Deleta uma Digital ---------------------------------------------------------------------------------
void deleteDigital(){
    Serial.println("Qual a posição para apagar a digital? (1 a 149)");  // Imprime na Serial
    String strLocation = pegaComando();                     // Faz a leitura do comando digitado
    int location = strLocation.toInt();                     // Transforma em inteiro

    if(location < 1 || location > 149){                     // Verifica se a posição é invalida
        Serial.println("Posição inválida");                 // Imprime na Serial
        return;
    }

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

//Limpa Banco de Dados -------------------------------------------------------------------------------
void limpaDatabase(){
    Serial.println("Tem certeza? (S/N)");                   // Imprime na Serial
    String command = pegaComando();                         // Faz a leitura do comando digitado
    command.toUpperCase();                                  // Coloca tudo em maiúsculo

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

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

Vamos dar uma olhada mais de perto no código:

Incluindo Bibliotecas

Primeiramente temos que incluir as bibliotecas que usamos em nosso projeto.

//Bibliotecas ----------------------------------------------------------------------------------------
#include <WiFi.h>                                          // Responsável pelo WiFi

Variáveis Globais

Logo após declaramos 1 variável global chamada password.

//Declarações de Variáveis----------------------------------------------------------------------------
const uint32_t password = 0x0;                              // Senha padrão do sensor biométrico

Declaração de Objeto

Logo após declaramos 1 objeto o qual chamamos de fingerSensor.

//Objetos --------------------------------------------------------------------------------------------
Adafruit_Fingerprint fingerSensor = Adafruit_Fingerprint(&Serial2, password);

Declarações de Funções Auxiliares

Em seguida declaramos 6 funções auxiliares, para que dessa forma possamos dividir nosso código.

//Funções Auxiliares ---------------------------------------------------------------------------------
void printMenu();                                           // Responsável pelo Menu
String pegaComando();                                       // Responsável por Pegar Comando
void cadastraDigital();                                     // Responsável por Cadastrar Digital
void verificaDigital();                                     // Responsável por Verificar Digital
void contDigital();                                         // Responsável por Contar Digitais
void deleteDigital();                                       // Responsável por Deletar Digital
void limpaDatabase();                                       // Responsável por Limpar Banco de Dados

Funções Setup

Então agora na função setup, será onde iremos inicializar a Serial e o sensor biométrico. Em seguida verificamos se a senha do sensor é igual a variável password.

//Setup ----------------------------------------------------------------------------------------------
void setup(){
    Serial.begin(115200);                                   // Inicializa o Serial
    fingerSensor.begin(57600);                              // Inicializa o Sensor
    if(!fingerSensor.verifyPassword()){                     // Verifica se não é a senha do sensor
        Serial.println("Não foi possível conectar ao sensor. Verifique a senha ou a conexão");
        while(true){};                                      // Loop Infinito
    }
}

Funções Loop

Em seguida na função loop, iremos imprimir o menu chamando a função printMenu, então esperamos o usuário digitar o comando e atribuímos a command. Em seguida transformamos em inteiro e atribuímos a i, após verificamos se i é igual a 1, 2, 3, 4 ou 5. Entretanto caso seja chamamos sua respectiva função.

//Loop -----------------------------------------------------------------------------------------------
void loop(){
    printMenu();                                            // Chama função printMenu()
    String command = pegaComando();                         // Faz a leitura do comando digitado
    int i = command.toInt();                                // Transforma em inteiro
    switch (i){                                             // Verifica qual o número digitado
    case 1:                                                 // Se i = 1
        cadastraDigital();                                  // Chama Função cadastraDigital()
        break;
    case 2:                                                 // Se i = 2
        verificaDigital();                                  // Chama Função verificaDigital()
        break;
    case 3:                                                 // Se i = 3
        contDigital();                                      // Chama Função contDigital()
        break;
    case 4:                                                 // Se i = 4
        deleteDigital();                                    // Chama Função deletaDigital()
        break;
    case 5:                                                 // Se i = 5
        limpaDatabase();                                    // Chama Função limpaDatabase()
        break;
    default:
        Serial.println("Opção inválida");                   // Imprime na Serial
        break;
    }
    delay(1000);                                            // Espera 1s
}

Funções Pega Comando

Logo após na função pegaComando, será onde iremos obter o comando digitado pelo usuário. Então para isso iremos criar um loop enquanto não tiver dados na serial, quando tiver iremos retornar a string da serial.

//Pega Comando ---------------------------------------------------------------------------------------
String pegaComando(){
    while(!Serial.available()) delay(100);
    return Serial.readStringUntil('\n');                    // Retorna o que foi digitado na Serial
}

Funções Cadastra Digital

Em seguida a função cadastraDigital, é responsável por cadastrar uma nova digital no banco de dados.

//Cadastra Digital -----------------------------------------------------------------------------------
void cadastraDigital(){
    Serial.println("Qual a posição para guardar a digital? (1 a 149)"); // Imprime na Serial
    String strLocation = pegaComando();                     // Faz a leitura do comando digitado
    int location = strLocation.toInt();                     // Transforma em inteiro

    if(location < 1 || location > 169){                     // Verifica se a posição é invalida
        Serial.println("Posição inválida");                 // Imprime na Serial
        return;
    }

    Serial.println("Encoste o dedo no sensor");             // Imprime na Serial
    while (fingerSensor.getImage() != FINGERPRINT_OK){};    // Espera até pegar uma imagem válida
    
    if (fingerSensor.image2Tz(1) != FINGERPRINT_OK){        // Converte a imagem para primeiro padrão
        Serial.println("Erro image2Tz 1");                  // Erro de Imagem
        return;
    }
    
    Serial.println("Tire o dedo do sensor");                // Imprime na Serial
    delay(2000);                                            // Espera 2s
    while (fingerSensor.getImage() != FINGERPRINT_NOFINGER){}; // Espera até tirar o dedo
    Serial.println("Encoste o mesmo dedo no sensor");       // Imprime na Serial
    while (fingerSensor.getImage() != FINGERPRINT_OK){};    // Espera até pegar uma imagem válida

    if(fingerSensor.image2Tz(2) != FINGERPRINT_OK){         // Converte a imagem para o segundo padrão
        Serial.println("Erro image2Tz 2");                  // Erro de Imagem
        return;
    }

    if(fingerSensor.createModel() != FINGERPRINT_OK){       // Cria um modelo com os dois padrões
        Serial.println("Erro createModel");                 // Erro para criar o Modelo
        return;
    }

    if(fingerSensor.storeModel(location) != FINGERPRINT_OK){// Guarda o modelo da digital no sensor
        Serial.println("Erro já existe uma biométrica cadastrada"); // Já existe 
        return;
    }

    Serial.println("Sucesso!!!");                           // Guardada com sucesso
}

Funções Verifica Digital

Então agora na função verificaDigital, é responsável por verificar se a digital é igual alguma digital cadastrada anterior mente no banco de dados.

//Verifica Digital -----------------------------------------------------------------------------------
void verificaDigital(){
    Serial.println("Encoste o dedo no sensor");             // Imprime na Serial
    while (fingerSensor.getImage() != FINGERPRINT_OK){};    // Espera até pegar uma imagem válida

    if (fingerSensor.image2Tz() != FINGERPRINT_OK){         // Converte a imagem para utilizar
        Serial.println("Erro image2Tz");                    // Imprime na Serial
        return;
    }

    if (fingerSensor.fingerFastSearch() != FINGERPRINT_OK){ // Procura pela digital no banco de dados
        Serial.println("Digital não encontrada");           // Imprime na Serial
        return;
    }

    Serial.print("Digital encontrada com confiança de ");   // Se chegou aqui a digital foi encontrada
    Serial.print(fingerSensor.confidence);                  // Imprime a confiança quanto maior melhor
    Serial.print(" na posição ");                           // Imprime a posição da digital
    Serial.println(fingerSensor.fingerID);                  // Imprime a posição da digital
}

Funções Quantidade de Digitas

Logo após vamos para a função contDigital, onde ela é responsável por imprimir na Seria a quantidade de digitais salva no banco de dados.

//Conta Qtde de Digitais -----------------------------------------------------------------------------
void contDigital(){
    fingerSensor.getTemplateCount();                        // Atribui a "templateCount" a qtde
    Serial.print("Digitais cadastradas: ");                 // Imprime na Serial
    Serial.println(fingerSensor.templateCount);             // Imprime na Serial a quantidade salva
}

Funções Deleta Digital

Em seguida na função deletaDigital, ela é responsável por deletar uma digital especifica no banco de dados

//Deleta uma Digital ---------------------------------------------------------------------------------
void deleteDigital(){
    Serial.println("Qual a posição para apagar a digital? (1 a 149)");  // Imprime na Serial
    String strLocation = pegaComando();                     // Faz a leitura do comando digitado
    int location = strLocation.toInt();                     // Transforma em inteiro

    if(location < 1 || location > 149){                     // Verifica se a posição é invalida
        Serial.println("Posição inválida");                 // Imprime na Serial
        return;
    }

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

Funções Limpa Banco de dados

Logo após vamos para a função limpaDatabase, onde ela é responsável por apagar todas as imformações salva no banco de dados.

//Limpa Banco de Dados -------------------------------------------------------------------------------
void limpaDatabase(){
    Serial.println("Tem certeza? (S/N)");                   // Imprime na Serial
    String command = pegaComando();                         // Faz a leitura do comando digitado
    command.toUpperCase();                                  // Coloca tudo em maiúsculo

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

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

E assim finalizamos todo código e explicação referentes ao projeto Leitor Biométrico com ESP32.

Resultado do Projeto Leitor Biométrico com ESP32


Por fim esse foi o resultado obtido com nosso projeto.

Serial - Leitor Biométrico com ESP32

Agradecemos sua Presença


Por fim, espero que tenham gostado e aprendido. Compartilhe com seus colegas e deixe um comentário de qual projeto deveria ser o próximo aqui no Blog da WJ Componentes!!
Enfim estarei deixando os arquivos do código-fonte e Fritzing, software e sites utilizados e deixarei também o GitHub da biblioteca utilizada.
Fique à vontade para tirar suas dúvidas nos comentários.

Software e Sites Utilizados

GitHub das Bibliotecas Utilizadas

Post Relacionados

    Posts mais Recentes

    Julio Cesar Bonow Manoel

    Julio Cesar Bonow Manoel

    Cursando Engenharia da Computação pelo Centro Universitário Facens e atua no desenvolvimento de projetos na WJ Componentes. Participante da equipe de robótica Omegabotz.

    Deixe um comentário

    O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *