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.
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.
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.
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.
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
- Programando Relé RF 4331 -Instruções de emparelhamento do modo de alternância Modo de… Leia mais: Programando Relé RF 433
- Acionando motor DC por meio do pino “Touch” do ESP-32Neste projeto, vamos explorar uma aplicação ainda mais dinâmica e… Leia mais: Acionando motor DC por meio do pino “Touch” do ESP-32
- Acendendo led RGB por meio do pino “Touch” do ESP-32No último post, exploramos o fascinante mundo dos pinos touch… Leia mais: Acendendo led RGB por meio do pino “Touch” do ESP-32
- Utilizando os Pinos touch do ESP32Nesse projeto Vamos aprender a usar os pinos touch´s do… Leia mais: Utilizando os Pinos touch do ESP32
- Como Programar e Localizar o Endereço de uma Tela OLED I2C com Arduinoeste guia, vou levá-lo através dos passos para programar uma… Leia mais: Como Programar e Localizar o Endereço de uma Tela OLED I2C com Arduino
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