Вы находитесь на странице: 1из 16

Sensor biométrico FPM10A com ESP32.

Sem dúvida uma ferramenta muito útil em seus projetos de


automação residencial.
Com um leitor biométrico você poderá:

 Abrir uma fechadura elétrica;


 Abrir um portão automático de garagem;
 Fazer um cofre;
 Acionar um relé;
 Fazer um alarme anti-furto e por aí vai......

Vamos usar o sensor biométrico da Adafruit modelo FPM10A.

Características:

 Modelo: FPM10A
 Tensão de alimentação DC: 3,6 a 6V
 Corrente: <120mA
 Capacidade de armazenamento on-board: 300 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)
 Área da janela de leitura: 14x18mm
 Dimensões totais: 55x 21x21mm
 Peso: 20g

Montagem
Usaremos essas bibliotecas no projeto.

#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>

Baixe essas bibliotecas no link a seguir porque já estão


adaptadas para serem usadas com o ESP32:

https://drive.google.com/drive/folders/1BFhQC4PktBHRkiLiTqPYlcuG2kwB
UZGI?usp=sharing

Entre na pasta “Bibliotecas”.


Clique com o botão direito do mouse em cima da pasta
“espsoftwareserial-master” e “Adafruit-Fingerprint-Sensor-Library-
master”, depois clique em “Fazer download”.

Escolha um local para baixar em seu pc.


Você deve copiar e extrair o arquivo no seguinte local em seu
computador:

C:\Users\nome do seu pc\AppData\Local\Arduino15\packages\esp32


\hardware \esp32\1.0.4\libraries.

Aperte a tecla Windows + E no seu computador e cole esse link


na janela de endereço. Não esqueça de colocar o nome do seu pc.

Nota: Quando exploramos nosso computador, a pasta Usuários


aparece como na figura abaixo:

Porem ao digitarmos o endereço na janela em branco, ele aparece


assim:

Outra coisa importante a falar é que a pasta AppData é uma


pasta oculta. Você só vai conseguir acessa-la se digitar o endereço
na janela em branco.
Agora, para evitar conflitos ou bibliotecas duplicadas, você
deverá apagar todas as pastas dentro da pasta libraries no endereço
abaixo:

C:\Program Files (x86) \Arduino\libraries (Na janela aparece


Arquivos de Programas (x86)).

Aperte a tecla Windows +


E do seu teclado.

Digite o endereço acima.

Selecione e Apague todas


as pastas.

Deve ficar
completamente
vazia.

Recomendo ao instalar uma nova biblioteca futuramente, salve


nessa pasta ao invés de incluir pela IDE do arduino na pasta
sketch/incluir biblioteca, pois tive vários problemas com
bibliotecas repetidas.
Vamos começar cadastrando as digitais.

Copie e cole o código abaixo em seu ESP32.


#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>

uint8_t id;

// pin 33 Input do sensor (fio verde) ou rx


// pin 32 Output que vem do arduino (fio amarelo ou branco) tx
//mySerial(rx,tx)
SoftwareSerial mySerial(33,32);

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

void setup()
{
Serial.begin(115200);
Serial.println("Teste do sensor");

// set the data rate for the sensor serial port


finger.begin(57600);

if (finger.verifyPassword()) {
Serial.println("O sensor foi encontrado!");
} else {
Serial.println("O sensor não foi encontrado :(");
while (1);
}
}

uint8_t readnumber(void) {
uint8_t num = 0;

while (num == 0) {
while (! Serial.available());
num = Serial.parseInt();
}
return num;
}

void loop()
{
Serial.println("Digite o número de ID que deseja salvar...");
id = readnumber();
if (id == 0) {// ID #0 !
return;
}
Serial.print("Gravação ID #");
Serial.println(id);

while (! getFingerprintEnroll(id) );
}

uint8_t getFingerprintEnroll(int id) {


int p = -1;
Serial.println("Aguardando a leitura de uma nova digital");
while (p != FINGERPRINT_OK) {
p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
Serial.println ("Impressão gravada");
break;
case FINGERPRINT_NOFINGER:
Serial.println (".");
break;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println ("erro na comunicação");
break;
case FINGERPRINT_IMAGEFAIL:
Serial.println ("erro na imagem");
break;
default:
Serial.println ("erro desconhecido");
break;
}
}

// OK success!

p = finger.image2Tz(1);
switch (p) {
case FINGERPRINT_OK:
Serial.println ("Imagem convertida");
break;
case FINGERPRINT_IMAGEMESS:
Serial.println ("Imagem distorcida");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println ("erro na comunicação");
return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println ("Não foi possível reconhecer a digital");
return p;
case FINGERPRINT_INVALIDIMAGE:
Serial.println ("Não foi possível reconhecer a digital");
return p;
default:
Serial.println ("erro desconhecido");
return p;
}

Serial.println ("Remova o seu dedo");


delay(2000);
p = 0;
while (p != FINGERPRINT_NOFINGER) {
p = finger.getImage();
}

p = -1;
Serial.println ("Coloque o mesmo dedo novamente");
while (p != FINGERPRINT_OK) {
p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
Serial.println ("Imagem convertida");
break;
case FINGERPRINT_NOFINGER:
Serial.print (".");
break;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println ("erro na comunicação");
break;
case FINGERPRINT_IMAGEFAIL:
Serial.println ("erro na imagem");
break;
default:
Serial.println ("erro desconhecido");
break;
}
}

// OK success!

p = finger.image2Tz(2);
switch (p) {
case FINGERPRINT_OK:
Serial.println ("Imagem convertida");
break;
case FINGERPRINT_IMAGEMESS:
Serial.println ("Imagem distorcida");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println ("erro na comunicação");
return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println ("Não foi possível reconhecer a digital");
return p;
case FINGERPRINT_INVALIDIMAGE:
Serial.println ("Não foi possível reconhecer a digital");
return p;
default:
Serial.println ("erro desconhecido");
return p;
}

// OK converted!
Serial.print("Criando modelo para #"); Serial.println(id);
p = finger.createModel();
if (p == FINGERPRINT_OK) {
Serial.println ("Digitais conferem!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println ("erro na comunicação");
return p;
} else if (p == FINGERPRINT_ENROLLMISMATCH) {
Serial.println ("As impressões digitais não batem.");
return p;
} else {
Serial.println ("erro desconhecido");
return p;
}

Serial.print("ID "); Serial.println(id);


p = finger.storeModel(id);
if (p == FINGERPRINT_OK) {
Serial.println ("A digital foi gravada!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println ("erro na comunicação");
return p;
} else if (p == FINGERPRINT_BADLOCATION) {
Serial.println ("Não foi possível armazenar nesse local");
return p;
} else if (p == FINGERPRINT_FLASHERR) {
Serial.println ("Erro ao gravar na memória");
return p;
} else {
Serial.println ("erro desconhecido");
return p;
}
}
Abra a porta serial. Reinicie o ESP32.
O sensor só vai começar a funcionar, depois que você digitar um número
diferente de zero para a identificação do cadastro de uma nova digital.

Digite “1” e depois “enviar”.

O sensor começará a fazer a leitura, piscando 3 leds vermelhos internos.


Coloque sua digital no sensor.
Agora terá que tirar sua digital do sensor e colocar novamente.
Se a leitura de sua digital ocorreu bem, ela será gravada com o número de
identificação “1”. Se der algum erro, repita a operação.

Vamos alterar o código agora para o leitor reconhecer sua


digital gravada e acionar um relé que estará ligado na GPIO27.
Copie, cole e carregue o código abaixo em seu ESP32.

#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>

int getFingerprintIDez();
// pin 33 Input do sensor (fio verde) ou rx
// pin 32 Output que vem do arduino (fio amarelo ou branco) tx
//mySerial(rx,tx)
SoftwareSerial mySerial(33,32);

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

int rele = 27;

void setup()
{
Serial.begin(115200);
Serial.println("Teste do sensor");
pinMode(27,OUTPUT); // relé

// set the data rate for the sensor serial port


finger.begin(57600);

if (finger.verifyPassword()) {
Serial.println("O sensor foi encontrado!");
} else {
Serial.println("O sensor não foi encontrado :(");
while (1);
}
}

void loop()
{
getFingerprintIDez();
delay(50);
}

uint8_t getFingerprintID() {
uint8_t p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
Serial.println ("Impressão gravada");
break;
case FINGERPRINT_NOFINGER:
Serial.println ("Nenhuma digital encontrada");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println ("erro na comunicação");
return p;
case FINGERPRINT_IMAGEFAIL:
Serial.println ("erro na imagem");
break;
return p;
default:
Serial.println ("erro desconhecido");
return p;
}

// OK success!

p = finger.image2Tz(1);
switch (p) {
case FINGERPRINT_OK:
Serial.println ("Imagem convertida");
break;
case FINGERPRINT_IMAGEMESS:
Serial.println ("Imagem distorcida");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println ("erro na comunicação");
return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println ("Não foi possível reconhecer a digital");
return p;
case FINGERPRINT_INVALIDIMAGE:
Serial.println ("Não foi possível reconhecer a digital");
return p;
default:
Serial.println ("erro desconhecido");
return p;
}

// OK converted!
p = finger.fingerFastSearch();
if (p == FINGERPRINT_OK) {
Serial.println ("Foi encontrada uma digital!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println ("erro na comunicação");
return p;
} else if (p == FINGERPRINT_NOTFOUND) {
Serial.println ("Não foi encontrada nenhuma digital");
return p;
} else {
Serial.println ("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;

// encontrada a digital correta

Serial.print("Liberado ID #"); Serial.print(finger.fingerID);


digitalWrite(27,HIGH);
delay(1000);
digitalWrite(27,LOW);
delay(1000);
}
Abra a porta serial. Reinicie o seu ESP32.Se você fez as
ligações corretas, aparecerá a mensagem que o sensor foi encontrado.
Agora é só testar a sua digital e ver se o relé vai acionar.

Se a sua digital foi gravada corretamente, aparecerá a mensagem


de “liberado” e o relé será acionado.

Vejamos agora como apagar as digitais gravadas no sensor.


Carregue o código abaixo no seu ESP32.

#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>

uint8_t id;

// pin 33 Input do sensor (fio verde) ou rx


// pin 32 Output que vem do arduino (fio amarelo ou branco) tx
//mySerial(rx,tx)
SoftwareSerial mySerial(33,32);

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

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

// set the data rate for the sensor serial port


finger.begin(57600);

if (finger.verifyPassword()) {
Serial.println("O sensor foi encontrado!");
} else {
Serial.println("O sensor não foi encontrado :(");
while (1);
}
}

uint8_t readnumber(void) {
uint8_t num = 0;

while (num == 0) {
while (! Serial.available());
num = Serial.parseInt();
}
return num;
}

void loop()
{
Serial.println("Digite o número de ID que deseja excluir...");
id = readnumber();
if (id == 0) {// ID #0 !
return;
}
Serial.print("Deletando ID #");
Serial.println(id);

deleteFingerprint(id);
}
uint8_t deleteFingerprint(uint8_t id) {
uint8_t p = -1;

p = finger.deleteModel(id);

if (p == FINGERPRINT_OK) {
Serial.println ("A digital foi apagada!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println ("erro na comunicação");
return p;
} else if (p == FINGERPRINT_BADLOCATION) {
Serial.println ("Não foi possível excluir essa digital");
return p;
} else if (p == FINGERPRINT_FLASHERR) {
Serial.println ("Erro ao gravar na memória");
return p;
} else {
Serial.println ("erro desconhecido: 0x"); Serial.println (p, HEX);
return p;
}
}

Abra a porta serial. Reinicie o ESP32.


Você terá que digitar o número de identificação da digital que
deverá ser excluída.
Depois que digitou a ID e pressionou enter, aparecerá a
mensagem de deletando a digital.

Baixe o tutorial completo em PDF e os sketchs da programação em


nossa pasta compartilhada:
https://drive.google.com/drive/folders/1BFhQC4PktBHRkiLiTqPYlcuG2kwB
UZGI?usp=sharing

Obrigado pela atenção!!!

Вам также может понравиться