



Use a tecnologia da biometria para proteger seus projetos - este Sensor Óptico de Impressão Digital ( DY-50) tornará a adição e detecção de impressões digitais muito simples. Esses módulos são geralmente usados em cofres. Existe um Chip DSP ( Processador de Sinal Digital) de alta potência que pode renderizar, calcular, localizar e pesquisar imagens. Conecte-se a qualquer microcontrolador ou sistema TTL Serial e envie pacotes de dados para tirar fotos, detectar conteúdo de impressão, hash , pesquisa entre outros. E no caso do sensor óptico, você pode registrar novos "dedos " diretamente já que esses sensores suportam em média até 162 impressões digitais armazenadas na memória flash integrada.Falaremos mais a seguir. Se você teve interesse neste leitor biométrico, mas ainda não tem os conhecimentos de sua funcionalidade, ou não entende os diagramas eletrônicos dele, chegou a hora de aprender!
- Modelo: DY50;
- Tensão de alimentação DC: 3,6 a 6V;
- Corrente de operação: <120mA;
- Corrente de pico máx: 150mA;
- Tempo de impressão digital de imagem: <1,0 segundo;
- Capacidade de armazenamento on-board: 162 digitais;
- Nível de segurança configurável: 1-baixo, 3-médio, 5-alto;
- Taxa de aceitação falsa: <0,001% (nível de segurança 3);
- Taxa de rejeição falsa: <1,0% (nível de segurança 3);
- Interface: UART (Serial TTL);
- Taxa de transmissão: 9600, 19200, 28800, 38400, 57600 (o padrão é 57600);
- Temperatura de operação: -20ºC a +50ºC;
- Umidade de trabalho: <85%;
- Comprimento do cabo: 150mm;
- Área da janela de leitura: 14x18mm;
- Dimensões totais: 55x 21x21mm;
- Peso: 20g.

Como o fio do sensor é muito fino, usualmente descascamos um pouco o fio e o soldamos em um outro jumper para fazermos as conexões, já que assim evitamos mal contato, tornamos o projeto mais profissional e também fica mais firme. Depois de conectado, você pode ver um LED piscando, isso significa que o sensor está funcionando. O nosso sensor possui 6 fios, mas é necessário apenas 4 desses para que ele ligue e funcione perfeitamente! Se o seu sensor tiver todos os fios da mesma cor, o primeiro fio (da esquerda à direita) é o nosso GND, depois os dois pinos de dados ( Rx, Tx) e, em seguida, nosso Vcc. Caso os fios sejam de cores distintas, falaremos a seguir de como diferenciá-los e para que servem!



É possível assim, atraves do Monitor Serial fazermos essa leitura direta entre o sensor e o Arduino, não necessariamente precisando de algum softaware para isso. É admitido outras formas de interação com essa comunicação, por exemplo, os próprios softwares, ou displays devices.
Ficou com alguma dúvida, ou deseja aprender mais sobre o protocolo de comunicação? Clique nesse link para ver a matéria completa.
Estudamos e entendemos melhor através da descrição acima ,sobre a parte técnica do nosso sensor. Compreendemos também as suas especificações, portanto agora vamos aprender na prática uma de suas aplicabilidades, desenvolvendo um Sistema de Segurança utilizando uma trava elétrica, que é controlada remotamente pela digital do usuário! Continue conosco para aprender como desenvolver este projeto.







Antes de começarmos, será necessário baixar algumas bibliotecas para utilizarmos o sensor, o LCD_Módulo I2C e caso utilize o botão, uma biblioteca para eliminar o efeito boucing . Clique nos links abaixo para baixar as bibliotecas:
Adafruit_Fingerprint_Sensor_Library
Liquid_Crystal_Display_I2C_Library
PushButton_Library
Baixe os arquivos para seu computador e abra a pasta compactada
Clique na opção "extrair para" e adicione à pasta Libraries no arquivo da IDE do Arduino.
Pronto! Repita o processo para a biblioteca LIQUIDCRYSTAL_I2C e a biblioteca PUSHBUTTON e então continue .
// INCLUSÃO DAS BIBLIOTECAS BAIXADAS!
#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>
#include <PushButton.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
//Inicializando o display no endereço 0x27
LiquidCrystal_I2C lcd(0x27,20,4); // Configura endereço I2C e display com 20 caracteres e 4 linhas
// PINAGENS DO PROJETO
#define button 5
#define trava 8
// INSTANCIANDO OBJETOS
SoftwareSerial mySerial(7, 6); // mySerial( Rx, Tx) <-- Pinagens do Sensor;
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
PushButton botao(button);
// DECLARAÇÃO DAS VARIÁVEIS E FUNCOES
uint8_t numID = 1;
bool gravar=false;
uint8_t modoGravacaoID(uint8_t IDgravar);
void setup() {
lcd.begin(16,2);
lcd.noCursor();
pinMode(trava, OUTPUT);
digitalWrite(trava, HIGH);
//Serial.begin(9600);
finger.begin(57600);
if(finger.verifyPassword()){
lcd.print("DY-50 encontrado!");
delay(1000);
} else {
lcd.autoscroll();
lcd.print("DY-50 não encontrado");
delay(3000);
lcd.clear();
while(true) {
delay(1);
}
}
lcd.print("sensor Carregado");
delay(900);
lcd.clear();
lcd.print(" Aguardando");
lcd.setCursor(1,1);
lcd.print(" entrada");
}
void loop() {
botao.button_loop();
if ( botao.pressed() ){
gravar = true;
}
if(gravar){
modoGravacaoID(0);
gravar = false;
}
getFingerprintIDez();
}
uint8_t modoGravacaoID(uint8_t IDgravar) {
int p = -1;
lcd.print("Registre o ADM #");
lcd.print(IDgravar);
delay(2000);
lcd.clear();
while (p != FINGERPRINT_OK) {
p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
lcd.clear();
lcd.print(" concluído");
break;
case FINGERPRINT_NOFINGER:
lcd.print(".");
delay(200);
break;
case FINGERPRINT_PACKETRECIEVEERR:
lcd.clear();
lcd.print("Erro");
break;
case FINGERPRINT_IMAGEFAIL:
lcd.print("Erro leitura");
break;
default:
lcd.print("ERROR");
break;
}
}
// Se não entrou em algum dos erros, todos os processos estão OK !
p = finger.image2Tz(1);
switch (p) {
case FINGERPRINT_OK:
lcd.print("Leitura convertida");
break;
case FINGERPRINT_IMAGEMESS:
lcd.print("tente novamente ");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
lcd.print("ERROR");
return p;
case FINGERPRINT_FEATUREFAIL:
lcd.print("Endereço invalido");
return p;
case FINGERPRINT_INVALIDIMAGE:
lcd.print("Imagem invalida");
return p;
default:
lcd.print("ERRO");
return p;
}
lcd.clear();
lcd.print("Retire o Dedo");
delay(2000);
lcd.clear();
p = 0;
while (p != FINGERPRINT_NOFINGER) {
p = finger.getImage();
}
lcd.print("ID ");
lcd.print(IDgravar);
p = -1;
lcd.print(" Insira o dedo ");
lcd.setCursor(1,1);
lcd.print(" novamente");
while (p != FINGERPRINT_OK) {
p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
lcd.print("Concluido ! ");
break;
case FINGERPRINT_NOFINGER:
lcd.print(".");
delay(200);
break;
case FINGERPRINT_PACKETRECIEVEERR:
lcd.print("Erro no pacote");
break;
case FINGERPRINT_IMAGEFAIL:
lcd.print("Erro na imagem");
break;
default:
lcd.print("Erro ");
break;
}
}
// Se não entrou em algum dos erros, o primeiro processo está OK !
p = finger.image2Tz(2);
switch (p) {
case FINGERPRINT_OK:
lcd.print("Leitura convertida");
break;
case FINGERPRINT_IMAGEMESS:
lcd.print("Má leitura");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
lcd.print("Erro- comunicacao");
return p;
case FINGERPRINT_FEATUREFAIL:
lcd.print("Endereco invalido");
return p;
case FINGERPRINT_INVALIDIMAGE:
lcd.print("imagem invalida");
return p;
default:
lcd.print("Erro ");
return p;
}
// Se não entrou em algum dos erros, todos os processos estão OK !
lcd.print("Novo ID para #");
lcd.print(IDgravar);
p = finger.createModel();
if (p == FINGERPRINT_OK) {
lcd.print("As digitais batem!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
lcd.print("Erro de comunicação");
return p;
} else if (p == FINGERPRINT_ENROLLMISMATCH) {
lcd.print("As digitais não batem");
return p;
} else {
lcd.print("Erro desconhecido");
return p;
}
lcd.print("ID ");
lcd.print(IDgravar);
p = finger.storeModel(IDgravar);
if (p == FINGERPRINT_OK) {
lcd.print("Armazenado!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
lcd.print("Erro de comunicação");
return p;
} else if (p == FINGERPRINT_BADLOCATION) {
lcd.print("Erro na memória");
return p;
} else if (p == FINGERPRINT_FLASHERR) {
lcd.print("Erro-memória flash");
return p;
} else {
lcd.print("Erro desconhecido");
return p;
}
}
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;
//Alguma digital foi reconhecida pelo sensor
if (finger.fingerID == 0) {
lcd.print("Modo ADM ON");
numID++;
modoGravacaoID(numID);
return 0;
} else {
lcd.clear();
digitalWrite(trava, LOW);
lcd.print("ID encontrado #");
lcd.print(finger.fingerID);
lcd.setCursor(1,1);
lcd.print("seguranca:");
lcd.print(finger.confidence); //Confiabilidade da leitura !
delay(1000); //<<----- Tempo que a trava ficará aberta em milisegundos
digitalWrite(trava, HIGH);
delay(1000);
lcd.clear();
lcd.print(" Aguardando");
lcd.setCursor(1,1);
lcd.print(" entrada");
}
}
Agora estudaremos o passo-a passo do nosso código, começando temos:
// INCLUSÃO DAS BIBLIOTECAS! #include <Adafruit_Fingerprint.h> #include <SoftwareSerial.h> #include <PushButton.h> #include <LiquidCrystal_I2C.h> #include <Wire.h> //Inicializando o display no endereço 0x27 LiquidCrystal_I2C lcd(0x27,20,4); // Configura endereço I2C e display com 20 caracteres e 4 linhas // PINAGENS DO PROJETO #define button 5 #define trava 8 // INSTANCIANDO OBJETOS SoftwareSerial mySerial(7, 6); // mySerial( Rx, Tx) <-- Pinagens do Sensor; Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); //Criando o nosso objeto Sensro ! PushButton botao(button); // DECLARAÇÃO DAS VARIÁVEIS E FUNCOES uint8_t numID = 1; //Variável responsável pelo armazenamento da digital bool gravar=false; // Indicador booleano para permitir que o sensor grave ou não uint8_t modoGravacaoID(uint8_t IDgravar);Neste primeiro passo, adicionamos todas as bibliotecas baixadas e algumas já dispostas para o Arduino, para que o nosso projeto funcione perfeitamente ! Observação: Normalmente os endereços já definidos para os LCD's é 0x27 . Mas o LCD usado veio configurado como 0x3f. Caso não funcione com o seu , abra este post para aprender como identificar. Segue o próximo passo!
void setup() {
lcd.begin(16,2); //Iniciando o nosso LCD
lcd.noCursor();
pinMode(trava, OUTPUT); //Definindo o pino da trava, como saída
digitalWrite(trava, HIGH);
//Serial.begin(9600);
finger.begin(57600); // O sensor nominalmente trabalha neste valor, confira no seu datasheet caso não seja este !
if(finger.verifyPassword()){ // Testando se o sensor foi identificado
lcd.print("DY-50 encontrado!");
delay(1000);
lcd.clear();
} else {
lcd.autoscroll();
lcd.print("DY-50 não encontrado");
delay(3000);
lcd.clear();
while(true) {
delay(1);
}
}
lcd.print("sensor Carregado");
delay(900);
lcd.clear();
lcd.print(" Aguardando");
lcd.setCursor(1,1);
lcd.print(" entrada");
}
Nessa segunda etapa, definimos as entradas e saidas do projeto, lembre-se que caso o seu display seja de outro tamanho , será necessário colocar as dimensões dele no comando lcd.begin(linhas,colunas). Se o sensor não for identificado, fique atento ao mal contato e reinicie o processo até que ele seja identificado.
Seguimos temos:
void loop() {
botao.button_loop();
if ( botao.pressed() ){
gravar = true;
}
if(gravar){
modoGravacaoID(0);
gravar = false;
}
getFingerprintIDez();
}
uint8_t modoGravacaoID(uint8_t IDgravar) {
int p = -1;
lcd.print("Registre o ADM #");
lcd.print(IDgravar);
delay(2000);
lcd.clear();
while (p != FINGERPRINT_OK) {
p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
lcd.clear();
lcd.print(" concluído");
break;
case FINGERPRINT_NOFINGER:
lcd.print(".");
delay(200);
break;
case FINGERPRINT_PACKETRECIEVEERR:
lcd.clear();
lcd.print("Erro");
break;
case FINGERPRINT_IMAGEFAIL:
lcd.print("Erro leitura");
break;
default:
lcd.print("ERROR");
break;
}
}
//Foram configurados alguns dos erros mais comuns apresentandos pelo Sensor.
p = finger.image2Tz(1);
switch (p) {
case FINGERPRINT_OK:
lcd.print("Leitura convertida");
break;
case FINGERPRINT_IMAGEMESS:
lcd.print("tente novamente ");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
lcd.print("ERROR");
return p;
case FINGERPRINT_FEATUREFAIL:
lcd.print("Endereço invalido");
return p;
case FINGERPRINT_INVALIDIMAGE:
lcd.print("Imagem invalida");
return p;
default:
lcd.print("ERRO");
return p;
}
lcd.clear();
lcd.print("Retire o Dedo");
delay(2000);
lcd.clear();
p = 0;
while (p != FINGERPRINT_NOFINGER) {
p = finger.getImage();
}
lcd.print("ID ");
lcd.print(IDgravar);
p = -1;
lcd.print(" Insira o dedo ");
lcd.setCursor(1,1);
lcd.print(" novamente");
while (p != FINGERPRINT_OK) {
p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
lcd.print("Concluido ! ");
break;
case FINGERPRINT_NOFINGER:
lcd.print(".");
delay(200);
break;
case FINGERPRINT_PACKETRECIEVEERR:
lcd.print("Erro no pacote");
break;
case FINGERPRINT_IMAGEFAIL:
lcd.print("Erro na imagem");
break;
default:
lcd.print("Erro ");
break;
}
}
// Se não entrou em algum dos erros, o primeiro processo está OK !
p = finger.image2Tz(2);
switch (p) {
case FINGERPRINT_OK:
lcd.print("Leitura convertida");
break;
case FINGERPRINT_IMAGEMESS:
lcd.print("Má leitura");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
lcd.print("Erro- comunicacao");
return p;
case FINGERPRINT_FEATUREFAIL:
lcd.print("Endereco invalido");
return p;
case FINGERPRINT_INVALIDIMAGE:
lcd.print("imagem invalida");
return p;
default:
lcd.print("Erro ");
return p;
}
// Se não entrou em algum dos erros, todos os processos estão OK !
lcd.print("Novo ID para #");
lcd.print(IDgravar);
p = finger.createModel();
if (p == FINGERPRINT_OK) {
lcd.print("As digitais batem!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
lcd.print("Erro de comunicação");
return p;
} else if (p == FINGERPRINT_ENROLLMISMATCH) {
lcd.print("As digitais não batem");
return p;
} else {
lcd.print("Erro desconhecido");
return p;
}
lcd.print("ID ");
lcd.print(IDgravar);
p = finger.storeModel(IDgravar);
if (p == FINGERPRINT_OK) {
lcd.print("Armazenado!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
lcd.print("Erro de comunicação");
return p;
} else if (p == FINGERPRINT_BADLOCATION) {
lcd.print("Erro na memória");
return p;
} else if (p == FINGERPRINT_FLASHERR) {
lcd.print("Erro-memória flash");
return p;
} else {
lcd.print("Erro desconhecido");
return p;
}
}
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;
//Alguma digital foi reconhecida pelo sensor
if (finger.fingerID == 0) {
lcd.print("Modo ADM ON"); //Se for a digital ADM, ele entra em modo de gravação e acrescenta 1 valor ao numero
// de endereço.
numID++;
modoGravacaoID(numID);
return 0;
} else {
lcd.clear();
digitalWrite(trava, LOW); //Caso o dedo identificado não seja o adm, e esteja registrado a trava é aberta
lcd.print("ID encontrado #");
lcd.print(finger.fingerID);
lcd.setCursor(1,1);
lcd.print("seguranca:");
lcd.print(finger.confidence); //Confiabilidade da leitura !
delay(2000); //<<----- Tempo que a trava ficará aberta em milisegundos
digitalWrite(trava, HIGH);
delay(1000);
lcd.clear();
lcd.print(" Aguardando");
lcd.setCursor(1,1);
lcd.print(" entrada");
}
}
Neste processo do void loop() definimos a constante verificação da leitura e do estado do sensor ! Foram programados comandos para caso o sensor apresente algum de seus erros, portanto verifique sempre o estado dos fios e deixe sempre o sensor limpo Hoje aprendemos como utilizar o Sensor Óptico de Impressão Digital DY-50 e entendemos como ele funciona, estudamos suas especificações e criamos um sistema de segurança utilizando esse sensor. Esperamos que você tenha entendido e conseguido montar nosso projeto. Se você curtiu, aprendeu e/ou desenvolveu o Sistema de Segurança, poste nas redes sociais e nos marque lá no instagram: @eletrogate
|
Use a tecnologia da biometria para proteger seus projetos – este Sensor Óptico de Impressão Digital ( DY-50) tornará a adição e detecção de impressões digitais muito simples. Esses módulos são geralmente usados em cofres. Existe um Chip DSP ( Processador de Sinal Digital) de alta potência que pode renderizar, calcular, localizar e pesquisar imagens. Conecte-se a qualquer microcontrolador ou sistema TTL Serial e envie pacotes de dados para tirar fotos, detectar conteúdo de impressão, hash , pesquisa entre outros.
Encontre tudo na Loja Eletrogate com frete grátis para compras acima de R$ 200