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")); } }
10 Comentários
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!!
ResponderExcluirFERNANDO
ResponderExcluirEU CONSEGUI COMPILAR PORÉM ESTA DANDO ERRO DE SENHA DO SENHOR
O Q DEVO FAZER
PRECISO MT DE SUA AJUDA
GRATO.
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?
ExcluirFuncionou na IDE 1.8.5 e na AVR Boards 1.8.3, NÃO FUNCIONOU na IDE 1.8.13
ExcluirConseguir 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".
ExcluirVerifique 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.
FERNANDO
ResponderExcluirEU CONSEGUI COMPILAR PORÉM ESTA DANDO ERRO DE SENHA DO SENSOR
O Q DEVO FAZER
PRECISO MT DE SUA AJUDA
GRATO.
O meu aqui tbm não pegou , porém o meu sensor não ligou . O seu sensor chegou a ligar?
ExcluirFuncionou na IDE 1.8.5 e na AVR Boards 1.8.3, NÃO FUNCIONOU na IDE 1.8.13
Excluirmuito bom .
ResponderExcluirConseguir 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