Componentes · 14 min de leitura

Sensor de impressão digital com Arduino: AS608, R307 e fechadura de porta

Como usar um sensor de impressão digital com Arduino: cores dos fios e alimentação do AS608/R307, cadastro e verificação com a Adafruit Fingerprint, fechadura com relé, ESP32 e soluções.

Um sensor de impressão digital permite que um projeto Arduino pergunte “quem é você?” com um único toque e abra uma porta, gaveta ou cofre quando reconhece o seu dedo. Os modelos mais comuns na eletrônica hobby são módulos ópticos baseados no AS608 e no R307: eles processam a imagem do dedo internamente, guardam as impressões digitais na própria memória e enviam ao Arduino só uma resposta curta, como “correspondeu ao ID 3”. Por isso, até uma placa pequena como o Arduino Uno consegue controlar com folga uma fechadura biométrica para centenas de pessoas.

Neste guia você vai aprender como o sensor funciona, como ligá-lo corretamente mesmo que as cores dos fios mudem de fabricante para fabricante, como cadastrar (enroll) e verificar impressões digitais com a biblioteca Adafruit Fingerprint e o que significam o ID e a pontuação de confiança. Depois você vai montar uma fechadura de porta de verdade com um relé e um solenoide de 12 V, fazer o mesmo com um ESP32 e um Raspberry Pi Pico e resolver passo a passo o famoso erro “Did not find fingerprint sensor”.

Sensor óptico de impressão digital AS608 com conector de 6 fios
Sensor óptico de impressão digital AS608: uma janela de leitura com prisma, um chip DSP que processa a imagem e um conjunto de conector com fios finos. As cores dos fios variam conforme o vendedor.

O que é um sensor de impressão digital e como ele funciona?

Módulos como o AS608 e o R307 são sensores ópticos. Quando você coloca o dedo sobre o vidro, um LED interno ilumina o prisma que fica embaixo dele; as cristas da sua impressão digital tocam o vidro e refletem a luz de forma diferente, enquanto os vales não tocam. Uma pequena câmera captura esse padrão como uma imagem em tons de cinza com cerca de 500 dpi. O chip DSP do módulo extrai os pontos onde as cristas terminam ou se bifurcam (minúcias) e os transforma em um arquivo de características de algumas centenas de bytes. Dois arquivos de características obtidos do mesmo dedo são combinados em um modelo (template), e esse modelo é salvo na própria memória flash do sensor com um número de ID.

Na verificação, o sensor também converte a nova imagem em um arquivo de características e a compara com todos os modelos armazenados. Essa busca 1:N costuma levar menos de um segundo; no final, o sensor devolve o ID correspondente e uma pontuação de confiança que mostra o quanto a correspondência é forte. O ponto principal: a imagem da impressão digital nunca chega ao Arduino, todo o trabalho pesado acontece dentro do sensor. O Arduino só envia comandos pela porta serial (UART) e lê respostas curtas.

CaracterísticaMódulo AS608R307FPM10A / ZFM-20
Alimentação3,3 V4,2–6 V (normalmente 5 V)3,6–6 V
Capacidade de armazenamentoNormalmente 300 (162 em algumas placas)1000162
ComunicaçãoUART (TTL), 57600 bps por padrãoUART (TTL), 57600 bps por padrãoUART (TTL), 57600 bps por padrão
Pino de detecção de toqueSim (WAK + Vt)Sim (Touch + 3.3VT)Não na maioria
Nível de segurança1–51–51–5
Taxa de falsa aceitação (FAR)< 0,001%< 0,001%< 0,001%
Biblioteca para ArduinoAdafruit FingerprintAdafruit FingerprintAdafruit Fingerprint

Os valores da tabela podem variar conforme o vendedor e a revisão da placa, principalmente a capacidade. O jeito mais confiável é rodar o sketch de teste abaixo e ler a capacidade que o próprio sensor informa. Vamos também deixar três termos claros: o ID é o número da posição do modelo na memória (de 0 até a capacidade menos um); o nível de segurança define o limite de correspondência de 1 (mais tolerante) a 5 (mais rigoroso); e a pontuação de confiança é a nota de semelhança que o sensor devolve a cada correspondência.

Cores dos fios e alimentação: qual fio vai onde?

O erro mais comum com sensores de impressão digital é achar que as cores dos fios são padronizadas. O mesmo modelo pode vir com fios vermelho-preto-amarelo-branco de um vendedor e vermelho-preto-verde-azul de outro; até a Adafruit lista disposições de cores diferentes para versões diferentes do sensor. Então não se guie pela cor: confira as marcações dos pinos na parte de trás do sensor ou ao lado do conector, e o diagrama do vendedor. Os módulos AS608 normalmente têm 6 pinos: V+ (Vi), TX, RX, GND, WAK (Touch) e Vt (3.3VT). Para o uso básico, só os quatro primeiros são necessários.

Pino do sensorFunçãoArduino UnoESP32Raspberry Pi Pico
V+ / Vi / VCCAlimentação3.3V (AS608) ou 5V (R307)3V3 (5V/VIN para o R307)3V3(OUT) (VBUS para o R307)
GNDTerraGNDGNDGND
TXSaída de dados do sensorD2 (SoftwareSerial RX)GPIO 16 (RX2)GP1 (UART0 RX)
RXEntrada de dados no sensorD3 (SoftwareSerial TX)GPIO 17 (TX2)GP0 (UART0 TX)
WAK / TouchSinal de dedo detectado (opcional)D4GPIO 27GP2
Vt / 3.3VTAlimentação do circuito de toque (opcional)3.3V3V33V3(OUT)
A maioria das placas AS608 funciona com 3,3 V; aplicar 5 V a um sensor marcado com 3.3V pode danificá-lo de forma permanente. Já o R307 precisa de 5 V e muitas vezes nem responde com 3,3 V. O pino 3.3V do Uno é especificado oficialmente para apenas 50 mA, e um sensor óptico consome mais corrente enquanto captura uma imagem (a Adafruit especifica até 120 mA de corrente de operação para o seu próprio sensor óptico). Se a placa reinicia aleatoriamente ou o sensor fica sumindo, alimente o sensor com um regulador externo de 3,3 V, como um AMS1117, e una os GNDs. Como o pino D3 do Uno tem saída de 5 V, colocar um divisor de tensão de 1 kΩ + 2 kΩ na linha RX de um sensor de 3,3 V é a opção mais segura.

O pino WAK (ou Touch) está ligado ao circuito de detecção de toque de baixo consumo do sensor. Com 3,3 V no pino Vt, ele muda de nível no instante em que um dedo toca o vidro; na maioria dos módulos ele vai para HIGH, em alguns vai para LOW, então teste na sua própria placa. Em uma fechadura alimentada por bateria, você pode cortar a alimentação principal com um MOSFET, deixar só o Vt alimentado e usar o sinal WAK para acordar o microcontrolador do modo de suspensão e ligar o sensor só nessa hora.

Instalando a biblioteca Adafruit Fingerprint

  1. No Arduino IDE, abra Ferramentas > Gerenciar Bibliotecas, busque Adafruit Fingerprint Sensor Library e instale. Se você nunca adicionou uma biblioteca, veja Como instalar uma biblioteca no Arduino.
  2. A biblioteca funciona com todos os sensores que usam o mesmo conjunto de comandos, como o AS608, R307, R503, FPM10A e a série ZFM; não é preciso mudar o código.
  3. Em Arquivo > Exemplos você encontra os exemplos enroll (cadastro), fingerprint (verificação), delete (apaga um registro) e emptyDatabase (apaga tudo).
  4. No Uno e no Nano, o sensor é ligado a D2 e D3 com SoftwareSerial, para não ocupar os pinos 0 e 1, que a conexão USB usa. Placas com uma segunda porta serial de hardware, como o Mega, o Leonardo e o ESP32, usam Serial1 ou Serial2.

Primeiro teste: o sensor é encontrado?

Antes de cadastrar, vamos confirmar que o sensor está conversando com o Arduino. O sketch abaixo primeiro procura o sensor na velocidade padrão de 57600 bps e, se não encontrar, testa as outras taxas de baud comuns. Quando encontra o sensor, ele mostra no Monitor Serial a taxa de baud em que o sensor respondeu, a capacidade informada, o nível de segurança e o número de impressões digitais armazenadas. Não se esqueça de ajustar o Monitor Serial para 9600 baud; isso é independente da velocidade do sensor.

C++ (Arduino IDE)
1#include <Adafruit_Fingerprint.h>
2#include <SoftwareSerial.h>
3
4SoftwareSerial fpSerial(2, 3);            // D2 = RX (sensör TX), D3 = TX (sensör RX) / D2 = RX (sensor TX), D3 = TX (sensor RX)
5Adafruit_Fingerprint finger(&fpSerial);
6
7const uint32_t rates[] = {57600, 9600, 19200, 38400, 115200};   // denenecek hızlar / baud rates to try
8
9void setup() {
10  Serial.begin(9600);
11  Serial.println(F("Sensor araniyor / searching for sensor..."));
12  bool found = false;
13  for (uint8_t i = 0; i < 5 && !found; i++) {
14    finger.begin(rates[i]);               // 1 sn bekler, portu açar / waits 1 s, opens the port
15    if (finger.verifyPassword()) {        // sensör cevap verdi mi? / did the sensor answer?
16      Serial.print(F("Bulundu / found @ "));
17      Serial.println(rates[i]);
18      found = true;
19    }
20  }
21  if (!found) {
22    Serial.println(F("Did not find fingerprint sensor :("));
23    while (1) delay(1);
24  }
25  finger.getParameters();                 // kapasite ve ayarları oku / read capacity and settings
26  Serial.print(F("Kapasite / capacity: "));
27  Serial.println(finger.capacity);
28  Serial.print(F("Guvenlik / security level: "));
29  Serial.println(finger.security_level);
30  finger.getTemplateCount();              // kayıtlı şablon sayısı / number of stored templates
31  Serial.print(F("Kayitli iz / templates: "));
32  Serial.println(finger.templateCount);
33}
34
35void loop() {
36}

Cadastrando uma impressão digital passo a passo

No cadastro, o sensor tira duas imagens separadas do mesmo dedo, guarda cada uma como arquivo de características em dois buffers (CharBuffer1 e CharBuffer2), junta as duas em um modelo e grava o modelo no ID que você escolher. O exemplo enroll pronto da Adafruit pede um ID entre 1 e 127 e o guarda em uma variável de um byte. A versão simplificada abaixo guarda o ID em 16 bits e pega o limite superior da capacidade real do sensor; assim, você pode usar todas as posições de um sensor de 300 ou 1000 impressões. Estes são os passos da biblioteca:

  1. getImage(): Tenta capturar uma imagem até haver um dedo no vidro; retorna FINGERPRINT_NOFINGER quando não há nenhum.
  2. image2Tz(1): Converte a primeira imagem em um arquivo de características e o coloca no buffer 1.
  3. O dedo é levantado e o mesmo dedo é colocado de novo; image2Tz(2) coloca a segunda imagem no buffer 2.
  4. createModel(): Compara e junta os dois buffers; retorna FINGERPRINT_ENROLLMISMATCH se eles não corresponderem.
  5. storeModel(id): Grava o modelo de forma permanente na memória flash do sensor; ele não se perde se faltar energia.
C++ (Arduino IDE)
1#include <Adafruit_Fingerprint.h>
2#include <SoftwareSerial.h>
3
4SoftwareSerial fpSerial(2, 3);            // D2 = RX, D3 = TX
5Adafruit_Fingerprint finger(&fpSerial);
6
7void setup() {
8  Serial.begin(9600);
9  finger.begin(57600);
10  if (!finger.verifyPassword()) {
11    Serial.println(F("Did not find fingerprint sensor :("));
12    while (1) delay(1);
13  }
14  finger.getParameters();                 // gerçek kapasiteyi öğren / learn the real capacity
15  Serial.println(F("Kayit modu / enroll mode"));
16}
17
18// Parmak gelene kadar bekle, görüntüyü tampona çevir / wait for a finger, convert the image into a buffer
19bool captureTo(uint8_t slot) {
20  while (finger.getImage() != FINGERPRINT_OK) delay(50);
21  uint8_t p = finger.image2Tz(slot);
22  if (p != FINGERPRINT_OK) {
23    Serial.print(F("Goruntu kotu / bad image, kod / code 0x"));
24    Serial.println(p, HEX);
25    return false;
26  }
27  return true;
28}
29
30void loop() {
31  Serial.print(F("ID gir / enter ID (1-"));
32  Serial.print(finger.capacity - 1);
33  Serial.println(F("):"));
34  while (!Serial.available()) delay(10);
35  uint16_t id = Serial.parseInt();
36  while (Serial.available()) Serial.read();   // satır sonunu temizle / clear the line ending
37  if (id == 0 || id >= finger.capacity) return;
38
39  Serial.println(F("Parmagini koy / place your finger"));
40  if (!captureTo(1)) return;
41  Serial.println(F("Kaldir / remove your finger"));
42  delay(1000);
43  while (finger.getImage() != FINGERPRINT_NOFINGER) delay(50);   // parmak kalkana kadar / until the finger is lifted
44
45  Serial.println(F("Ayni parmagi tekrar koy / place the same finger again"));
46  if (!captureTo(2)) return;
47
48  uint8_t p = finger.createModel();       // iki görüntüyü birleştir / merge the two images
49  if (p == FINGERPRINT_ENROLLMISMATCH) {
50    Serial.println(F("Fingerprints did not match"));
51    return;
52  }
53  if (p != FINGERPRINT_OK) return;
54
55  p = finger.storeModel(id);              // sensörün flash belleğine yaz / write to the sensor's flash
56  if (p == FINGERPRINT_OK) {
57    Serial.print(F("Kaydedildi / stored, ID #"));
58    Serial.println(id);
59  } else {
60    Serial.print(F("Kayit hatasi / store error 0x"));
61    Serial.println(p, HEX);
62  }
63}
Digite o ID no Monitor Serial, pressione Enter e siga as instruções. Um bom cadastro define a qualidade de todas as verificações seguintes: coloque o dedo no centro do vidro sem apertar demais e mude o ângulo só um pouquinho para a segunda imagem. Em uma fechadura usada todos os dias, cadastrar o mesmo dedo com dois IDs diferentes (uma vez reto, outra levemente inclinado) reduz bastante a taxa de rejeição. Anote qual ID pertence a quem; o sensor só conhece números, não nomes.

Verificando uma impressão digital: ID e pontuação de confiança

Para verificar, você primeiro captura uma imagem com getImage(), converte com image2Tz() e depois busca entre os modelos armazenados. A biblioteca tem duas funções de busca: fingerFastSearch() é rápida, mas o comando que a biblioteca envia só varre os primeiros 163 registros (IDs 0–162); fingerSearch() busca em toda a capacidade lida com getParameters(). Se você vai usar IDs acima de 162, use fingerSearch() e sempre chame getParameters() no setup(); caso contrário, a biblioteca assume a capacidade padrão de 64 e busca só nos primeiros 64 registros.

Quando a busca dá certo, finger.fingerID informa o número do registro correspondente e finger.confidence, a pontuação de confiança. O próprio sensor já decide se há correspondência com base no nível de segurança; a pontuação só diz o quanto ela é forte. Com um dedo bem cadastrado, a pontuação costuma ficar entre algumas dezenas e algumas centenas. Para uma fechadura mais rigorosa, você pode subir o limite com setSecurityLevel(4) ou setSecurityLevel(5), ou acrescentar seu próprio limite mínimo no código (por exemplo, rejeitar tudo abaixo de 50). Um limite mais alto diminui a chance de aceitar a pessoa errada, mas aumenta a chance de rejeitar a certa; encontre o equilíbrio testando com os seus próprios dedos.

Código de retornoMensagem no Monitor SerialSignificado e solução
FINGERPRINT_OK (0x00)Image taken / Stored! (imagem capturada / salvo!)Operação concluída com sucesso.
FINGERPRINT_NOFINGER (0x02)No finger detected (nenhum dedo detectado)Não há dedo no vidro; continue esperando no laço.
FINGERPRINT_PACKETRECIEVEERR (0x01)Communication error (erro de comunicação)Nenhum pacote de resposta recebido; confira a fiação, a taxa de baud e a alimentação.
FINGERPRINT_IMAGEFAIL (0x03)Imaging error (erro de imagem)Não foi possível capturar a imagem; coloque o dedo de novo.
FINGERPRINT_IMAGEMESS (0x06)Image too messy (imagem muito borrada)Imagem borrada; limpe o vidro, o dedo pode estar muito molhado ou muito seco.
FINGERPRINT_FEATUREFAIL (0x07)Could not find fingerprint features (características não encontradas)Detalhes insuficientes; centralize o dedo e pressione de leve.
FINGERPRINT_NOTFOUND (0x09)Did not find a match (nenhuma correspondência)Nenhum registro correspondente; o dedo não foi cadastrado ou foi mal cadastrado.
FINGERPRINT_ENROLLMISMATCH (0x0A)Fingerprints did not match (as impressões não correspondem)As duas imagens do cadastro não corresponderam; repita o processo.
FINGERPRINT_BADLOCATION (0x0B)Could not store in that location (não foi possível salvar nessa posição)O ID está fora da capacidade; leia o limite com getParameters().
FINGERPRINT_FLASHERR (0x18)Error writing to flash (erro ao gravar na flash)Não foi possível gravar na memória do sensor; confira a alimentação e a fiação.

Fechadura de porta biométrica com relé e solenoide

Agora vamos juntar tudo e montar uma fechadura de porta que abre por 3 segundos para um dedo autorizado, apita três vezes para um desconhecido e bloqueia o sistema por 30 segundos depois de 5 tentativas erradas seguidas. Como trava, usamos uma fechadura solenoide de 12 V. Um solenoide consome 0,5–1 A, então ele nunca deve ser ligado diretamente a um pino do Arduino; coloque um módulo relé ou um MOSFET de nível lógico no meio. A ligação: o VCC e o GND do módulo relé vão ao 5V e ao GND do Arduino, e o pino IN vai ao D8; um buzzer ativo vai ao D9; o positivo da fonte de 12 V vai ao terminal COM do relé, o terminal NO (normalmente aberto) do relé vai ao positivo do solenoide, e o negativo do solenoide vai ao negativo da fonte.

Um solenoide é uma bobina e gera uma tensão reversa alta no instante em que a corrente é cortada. Por isso, ligue um diodo 1N4007 em paralelo com o solenoide, polarizado ao contrário; a ponta do diodo com a faixa vai para o lado positivo. Se você usar um MOSFET no lugar do relé, escolha um modelo de nível lógico, como o IRLZ44N, e ligue o negativo da fonte de 12 V ao GND do Arduino. Para mais detalhes, veja Acionando correntes altas com um MOSFET e, para a ordem dos pinos do MOSFET, consulte a ferramenta Pinagem de transistores.

C++ (Arduino IDE)
1#include <Adafruit_Fingerprint.h>
2#include <SoftwareSerial.h>
3
4SoftwareSerial fpSerial(2, 3);            // D2 = RX, D3 = TX
5Adafruit_Fingerprint finger(&fpSerial);
6
7const int RELAY_PIN = 8;                  // röle modülü IN / relay module IN
8const int BUZZER_PIN = 9;                 // aktif buzzer / active buzzer
9const uint8_t RELAY_ON = LOW;             // çoğu röle modülü LOW ile çeker / most relay modules switch on LOW
10const uint8_t RELAY_OFF = HIGH;
11const uint16_t MIN_CONFIDENCE = 50;       // ek güven eşiği / extra confidence threshold
12const unsigned long OPEN_MS = 3000;       // kilidin açık kalma süresi / unlock time
13
14uint8_t failCount = 0;
15
16void setup() {
17  digitalWrite(RELAY_PIN, RELAY_OFF);     // açılışta kilitli kalsın / stay locked at power-up
18  pinMode(RELAY_PIN, OUTPUT);
19  pinMode(BUZZER_PIN, OUTPUT);
20  Serial.begin(9600);
21  finger.begin(57600);
22  if (!finger.verifyPassword()) {
23    Serial.println(F("Did not find fingerprint sensor :("));
24    while (1) delay(1);
25  }
26  finger.getParameters();                 // fingerSearch için kapasite / capacity for fingerSearch
27}
28
29// Eşleşen ID; parmak yoksa -1, tanınmadıysa -2 / matching ID; -1 no finger, -2 not recognised
30int readFinger() {
31  if (finger.getImage() != FINGERPRINT_OK) return -1;
32  if (finger.image2Tz(1) != FINGERPRINT_OK) return -2;
33  if (finger.fingerSearch(1) != FINGERPRINT_OK) return -2;
34  if (finger.confidence < MIN_CONFIDENCE) return -2;
35  return finger.fingerID;
36}
37
38void beep(int count, int ms) {
39  for (int i = 0; i < count; i++) {
40    digitalWrite(BUZZER_PIN, HIGH);
41    delay(ms);
42    digitalWrite(BUZZER_PIN, LOW);
43    delay(ms);
44  }
45}
46
47void loop() {
48  int id = readFinger();
49  if (id >= 0) {
50    Serial.print(F("Hos geldin / welcome, ID #"));
51    Serial.print(id);
52    Serial.print(F(", guven / confidence "));
53    Serial.println(finger.confidence);
54    failCount = 0;
55    beep(1, 100);
56    digitalWrite(RELAY_PIN, RELAY_ON);    // kilidi aç / unlock
57    delay(OPEN_MS);
58    digitalWrite(RELAY_PIN, RELAY_OFF);   // yeniden kilitle / lock again
59  } else if (id == -2) {
60    failCount++;
61    Serial.println(F("Yetkisiz / not authorised"));
62    beep(3, 80);
63    if (failCount >= 5) {                 // 5 hatada 30 sn bekle / 30 s lockout after 5 failures
64      Serial.println(F("30 sn kilitli / locked for 30 s"));
65      delay(30000);
66      failCount = 0;
67    }
68    delay(1000);
69  }
70  delay(50);
71}
Este projeto é ótimo para aprender e para uso hobby, mas sozinho não é um sistema de segurança de verdade. Sensores ópticos podem ser enganados por um molde de impressão digital bem-feito, e quem alcançar os fios pode acionar o relé diretamente. Em uma porta real, mantenha a eletrônica do lado de dentro, deixe uma chave mecânica ou outra forma de abrir e pense no que a fechadura faz quando a energia cai: solenoides do tipo caixa geralmente ficam travados sem energia, enquanto fechaduras eletromagnéticas abrem. Não deixe o solenoide energizado por muito tempo; a bobina esquenta e pode ser danificada.

Sensor de impressão digital com ESP32: a ligação pela Serial2

O ESP32 tem três portas seriais de hardware, então você não precisa do SoftwareSerial; basta ligar o sensor à UART2 (Serial2). Como o ESP32 trabalha com 3,3 V, ele combina exatamente com os níveis de sinal do AS608 e nenhum divisor de tensão é necessário. O único cuidado são os pinos: no core Arduino-ESP32 atual (3.x), os pinos padrão da Serial2 não são mais GPIO 16/17, como em tutoriais antigos, e sim GPIO 4 (RX) e GPIO 25 (TX). Por isso, você deve passar os pinos explicitamente para Serial2.begin(); o begin() da biblioteca mantém os pinos que você definiu antes. Você pode ver o mapa de pinos da sua placa na ferramenta Pinagem.

C++ (Arduino IDE)
1#include <Adafruit_Fingerprint.h>
2
3#define FP_RX 16                          // ESP32 RX2 <- sensör TX / sensor TX
4#define FP_TX 17                          // ESP32 TX2 -> sensör RX / sensor RX
5const int RELAY_PIN = 23;                 // röle modülü IN / relay module IN
6
7Adafruit_Fingerprint finger(&Serial2);
8
9void setup() {
10  Serial.begin(115200);
11  pinMode(RELAY_PIN, OUTPUT);
12  digitalWrite(RELAY_PIN, HIGH);          // LOW tetiklemeli röle kapalı / active-LOW relay off
13  Serial2.begin(57600, SERIAL_8N1, FP_RX, FP_TX);   // pinleri açıkça ver / set the pins explicitly
14  finger.begin(57600);                    // önceki pinleri korur / keeps the pins set above
15  if (!finger.verifyPassword()) {
16    Serial.println("Did not find fingerprint sensor :(");
17    while (true) delay(10);
18  }
19  finger.getParameters();
20  finger.getTemplateCount();
21  Serial.printf("Kapasite / capacity: %u, kayitli / stored: %u\n", finger.capacity, finger.templateCount);
22}
23
24void loop() {
25  if (finger.getImage() == FINGERPRINT_OK && finger.image2Tz(1) == FINGERPRINT_OK) {
26    if (finger.fingerSearch(1) == FINGERPRINT_OK) {
27      Serial.printf("ID #%u, guven / confidence %u\n", finger.fingerID, finger.confidence);
28      digitalWrite(RELAY_PIN, LOW);       // kilidi aç / unlock
29      delay(3000);
30      digitalWrite(RELAY_PIN, HIGH);      // yeniden kilitle / lock again
31    } else {
32      Serial.println("Did not find a match");
33      delay(1000);
34    }
35  }
36  delay(50);
37}

Em placas com módulo ESP32-WROVER, os GPIO 16 e 17 estão ligados à PSRAM; numa placa assim, mude FP_RX e FP_TX para, por exemplo, 25 e 26. O ESP32-C3 tem só duas UARTs, então não há Serial2; você pode usar o mesmo código com a Serial1 e quaisquer dois pinos que quiser. Graças ao Wi-Fi, você pode registrar cada entrada com data e hora em um servidor ou enviar uma notificação para o celular com um bot do Telegram quando um dedo desconhecido for detectado.

Sensor de impressão digital com Raspberry Pi Pico e MicroPython

Não existe uma versão oficial da biblioteca da Adafruit para MicroPython, mas o protocolo do sensor é simples o bastante para você conversar com ele em poucas linhas. Todo pacote começa com o código de início EF 01, seguido de um endereço de 4 bytes (FF FF FF FF por padrão), do tipo de pacote (01 comando, 07 resposta), de um comprimento de 2 bytes, do comando e seus parâmetros e, por fim, de um checksum de 2 bytes formado pela soma dos bytes de tipo, comprimento e dados. O primeiro byte de dados da resposta é o código de confirmação: 00 sucesso, 02 sem dedo, 09 sem correspondência. O código abaixo verifica o sensor, lê a capacidade e identifica o dedo no vidro com o ID e a pontuação de confiança. Como o Pico trabalha com 3,3 V, você pode ligar o AS608 direto no pino 3V3(OUT); se você está começando com o Pico, O que é o Raspberry Pi Pico? é um bom ponto de partida.

MicroPython
1from machine import UART, Pin
2import time
3
4# GP0 = UART0 TX -> sensör RX, GP1 = UART0 RX <- sensör TX / sensor RX, sensor TX
5uart = UART(0, baudrate=57600, tx=Pin(0), rx=Pin(1), timeout=2000, timeout_char=100)
6HEADER = b'\xEF\x01\xFF\xFF\xFF\xFF'          # başlangıç kodu + adres / start code + address
7
8def command(*data):
9    while uart.any():                          # eski baytları at / drop stale bytes
10        uart.read()
11    length = len(data) + 2                     # veri + 2 bayt sağlama / data + 2-byte checksum
12    body = bytes([0x01, length >> 8, length & 0xFF]) + bytes(data)   # 0x01 = komut paketi / command packet
13    s = sum(body)
14    uart.write(HEADER + body + bytes([(s >> 8) & 0xFF, s & 0xFF]))
15    head = uart.read(9)                        # başlık + tip + uzunluk / header + type + length
16    if not head or len(head) < 9 or head[0] != 0xEF:
17        return None
18    n = (head[7] << 8) | head[8]
19    rest = uart.read(n)
20    if not rest or len(rest) < n:
21        return None
22    return rest[:-2]                           # sağlama hariç veri / data without checksum
23
24def ok(r):
25    return r is not None and r[0] == 0x00      # 0x00 = başarılı / success
26
27time.sleep(1)                                  # sensörün açılmasını bekle / let the sensor boot up
28if not ok(command(0x13, 0, 0, 0, 0)):          # VfyPwd: şifre 0 / password 0
29    print("Did not find fingerprint sensor")
30    while True:
31        time.sleep(1)
32
33p = command(0x0F)                              # ReadSysPara: sistem parametreleri / system parameters
34capacity = (p[5] << 8) | p[6] if ok(p) else 162
35print("Kapasite / capacity:", capacity)
36
37def identify():
38    if not ok(command(0x01)):                  # GenImg: parmak yoksa 0x02 / 0x02 = no finger
39        return None
40    if not ok(command(0x02, 1)):               # Img2Tz: CharBuffer1'e çevir / convert into CharBuffer1
41        return (-1, 0)
42    r = command(0x04, 1, 0, 0, capacity >> 8, capacity & 0xFF)   # Search: tüm kayıtlar / all records
43    if not ok(r):
44        return (-1, 0)                         # 0x09 = eşleşme yok / no match
45    return ((r[1] << 8) | r[2], (r[3] << 8) | r[4])   # (ID, güven / confidence)
46
47while True:
48    res = identify()
49    if res:
50        fid, score = res
51        if fid >= 0:
52            print("ID", fid, "guven / confidence", score)
53        else:
54            print("Eslesme yok / no match")
55        time.sleep(1)
56    time.sleep_ms(100)

O erro “Did not find fingerprint sensor” e outros problemas comuns

Essa mensagem significa que a biblioteca não recebeu do sensor uma resposta válida ao comando verifyPassword(); ela não quer dizer que o sensor está com defeito. A grande maioria dos casos se resume a fiação, alimentação ou taxa de baud errada. Siga a tabela abaixo de cima para baixo:

SintomaCausa provávelSolução
Did not find fingerprint sensor :( (sensor não encontrado)TX e RX ligados direto, sem cruzarO TX do sensor vai ao RX do Arduino (D2) e o RX dele vai ao TX (D3). Trocar os dois fios de dados de lugar não causa dano, então teste.
Did not find fingerprint sensor :( (sensor não encontrado)Confiar nas cores dos fiosRefaça a ligação seguindo as marcações dos pinos na placa ou o diagrama do vendedor; confirme o GND com um multímetro.
Did not find fingerprint sensor :( (sensor não encontrado)Alimentação errada ou insuficienteDê 3,3 V ao AS608 e 5 V ao R307; se o pino 3.3V do Uno não for suficiente, use um regulador externo e una os GNDs.
Did not find fingerprint sensor :( (sensor não encontrado)O sensor está em outra taxa de baudRode a varredura de baud do primeiro sketch de teste e coloque o valor encontrado em finger.begin().
Did not find fingerprint sensor :( (sensor não encontrado)A senha do sensor foi alteradaPasse a senha para o construtor: Adafruit_Fingerprint finger(&fpSerial, 0x12345678);
Sensor não encontrado em um Mega ou LeonardoA SoftwareSerial não consegue receber em todos os pinosUse a Serial1: RX1 19, TX1 18 no Mega; RX 0, TX 1 no Leonardo.
Sensor não encontrado em um ESP32Pinos padrão da Serial2 diferentes ou conflito com a PSRAMDefina os pinos explicitamente com Serial2.begin(57600, SERIAL_8N1, RX, TX); não use 16/17 em um WROVER.
“Communication error” frequenteConector frouxo, fios longos ou finosMantenha os fios curtos, use ligações soldadas em vez de protoboard e acrescente um capacitor de 100 µF na alimentação.
Um dedo cadastrado é rejeitado com frequênciaVidro sujo, dedo seco ou molhado, cadastro feito de um só ânguloLimpe o vidro com um pano macio, cadastre o mesmo dedo em dois IDs e, se precisar, baixe o nível de segurança para 2.
O sensor esquenta e o LED nunca acendeAlimentação invertida ou 5 V em um AS608Corte a alimentação imediatamente e corrija a ligação; o sensor pode ter sido danificado.
Um jeito rápido de isolar o problema é ligar o sensor a um conversor USB-TTL e testá-lo com um programa de teste para Windows, como o SFGDemo: se o sensor aparecer ali, o problema está na fiação ou no código do lado do Arduino. Lembre também que a velocidade do Monitor Serial (9600) e a velocidade do sensor (57600) são coisas diferentes; não confunda as duas.

Leitor de impressão digital UART da Waveshare: uma observação rápida

Módulo leitor de impressão digital UART da Waveshare e placa controladora
Waveshare UART Fingerprint Reader: o sensor óptico se conecta por um cabo flat a uma placa controladora separada com processador STM32F205; a placa tem os pinos VCC, GND, TXD, RXD, BL e RST.

Apesar de parecer igual, o leitor de impressão digital UART da Waveshare fala um protocolo diferente do AS608 e do R307: os comandos têm 8 bytes, começam e terminam com 0xF5, e a velocidade padrão é 19200 bps. Por isso ele não funciona com a biblioteca Adafruit Fingerprint; em vez dela, você usa a tabela de comandos e o código de exemplo do manual do usuário da Waveshare. No cadastro, o dedo é lido três vezes, cada usuário pode receber um nível de permissão de 1 a 3, e a comparação 1:N é feita com um único comando. A placa pode ser alimentada com 3,3 V ou 5 V; você liga o TXD ao RX do microcontrolador e o RXD ao TX dele. Se você quer muitas bibliotecas e exemplos prontos, escolha o AS608 ou o R307; se não se importa de escrever seu próprio código de protocolo, o Waveshare é uma boa escolha.

Ideias de projetos com sensor de impressão digital

  • Gaveta ou cofre biométrico: Um pequeno cofre que abre com um servo ou solenoide e dispara um alarme em tentativas não autorizadas. Para um mecanismo de trava com servo, veja O que é um servo motor?
  • Porta em duas etapas: Uma entrada mais segura que pede primeiro a impressão digital e depois um PIN em um teclado matricial.
  • Cartão ou dedo: Acrescente um leitor RFID RC522 à mesma fechadura, para que quem tem cartão entre com o cartão e os outros, com o dedo.
  • Sistema de controle de presença: Associe cada ID a um nome em uma escola ou clube e registre os horários de entrada.
  • Fechadura com display: Mostre uma mensagem de boas-vindas e o nome da pessoa em um display OLED de 0,96 polegada.
  • Junto com um alarme residencial: Um sistema de alarme com Arduino que é armado e desarmado com a impressão digital.

Com alguns fios e a biblioteca certa, um sensor de impressão digital acrescenta uma camada real de identificação ao seu projeto: teste o sensor primeiro, cadastre os dedos com cuidado e depois monte a fechadura com relé e solenoide. No app BlueGrays você encontra projetos de segurança como um cofre eletrônico inteligente, autenticação RFID, uma fechadura de porta RFID com ESP32 e um app de senha com teclado matricial, cada um com esquemas do circuito e código passo a passo, o que dá uma base pronta para adicionar um sensor de impressão digital.

Perguntas frequentes

Quantas impressões digitais um sensor de impressão digital consegue armazenar?

Depende do modelo: placas AS608 normalmente guardam 300 (algumas, 162), o R307 guarda 1000, e o FPM10A e o ZFM-20 guardam 162. Para descobrir a capacidade do seu sensor, chame getParameters() e mostre finger.capacity no Monitor Serial. Lembre que cadastrar o mesmo dedo em dois IDs ocupa duas posições.

O sensor de impressão digital funciona com 5 V ou 3,3 V?

A maioria das placas AS608 precisa de 3,3 V, enquanto o R307 funciona com 4,2–6 V, normalmente 5 V. Não ligue a alimentação antes de conferir a etiqueta do sensor e as especificações do vendedor. Ao ligar a saída TX de um Arduino de 5 V ao RX de um sensor de 3,3 V, um divisor de tensão é a escolha mais segura.

As impressões digitais ficam salvas no Arduino? Elas se perdem quando a energia acaba?

Não, os modelos ficam salvos na própria memória flash do sensor e não são apagados quando a energia acaba. Mesmo que você troque o Arduino ou carregue um código novo, os registros continuam no sensor. Do lado do Arduino, você só precisa controlar qual ID pertence a quem; se quiser, pode salvar isso na EEPROM.

Como corrigir o erro “Did not find fingerprint sensor”?

Primeiro, confirme que TX e RX estão cruzados: o TX do sensor vai ao pino RX do Arduino (D2 no Uno). Depois verifique se a alimentação tem a tensão certa e corrente suficiente e se os GNDs estão em comum. Se ainda assim ele não for encontrado, o sensor pode estar usando outra taxa de baud ou uma senha; rode um sketch de teste que experimente várias taxas de baud.

Qual é a diferença entre o AS608 e o R307?

Os dois são sensores ópticos que usam o mesmo conjunto de comandos e funcionam com o mesmo código na biblioteca Adafruit Fingerprint. As principais diferenças são a alimentação e a capacidade: placas AS608 normalmente funcionam com 3,3 V e guardam cerca de 300 registros, enquanto o R307 funciona com 5 V e pode guardar 1000. Confira a ordem dos pinos na etiqueta do seu modelo antes de fazer a ligação.

Como apagar uma impressão digital cadastrada?

Use finger.deleteModel(id) para apagar um único registro e finger.emptyDatabase() para apagar todos. Os exemplos delete e emptyDatabase da biblioteca fazem isso pelo Monitor Serial. Depois, você pode cadastrar uma nova impressão digital em um ID apagado.

Ver todos os projetos
Cofre eletrônico inteligente
#92Avançado
Premium

Cofre eletrônico inteligente

Um pequeno cofre para guardar seus objetos de valor, que abre com uma senha. Você digita sua senha de quatro dígitos no teclado; se estiver correta, o servo motor abre a trava, a luz verde acende e o

4.7(42)
63
Fechadura RFID com ESP32 (RC522 + servo + OLED + buzzer + LED)
#137Avançado
Premium

Fechadura RFID com ESP32 (RC522 + servo + OLED + buzzer + LED)

Vamos montar uma fechadura inteligente com ESP32, módulo RFID RC522, servo motor SG90, display OLED SSD1306, buzzer ativo e 2 LEDs. Ao ler um cartão, seu UID é comparado à lista de cartões autorizados definida no código. Se estiver autorizado, o servo motor gira para abrir a fechadura (LED verde + 2 bipes curtos), que trava novamente após 5 segundos. Com um cartão não autorizado, o LED vermelho acende, 3 bipes rápidos soam e o UID lido aparece no OLED.

4.8(9)
15
Autenticação por RFID
#54Intermediário
Premium

Autenticação por RFID

Como na entrada com cartão de um prédio: você aproxima o cartão do leitor RFID e o Arduino compara o número dele com o número salvo. Com o cartão correto, o LED verde acende por três segundos; com um

4.8(64)
83
Leitura de valores RFID
#53Iniciante
Premium

Leitura de valores RFID

O chaveiro de acesso do seu prédio ou seu cartão de entrada guarda um número de identificação oculto, e este projeto faz a leitura dele. Aproxime o cartão do leitor RFID e o Arduino escreve o número d

4.7(47)
61
Fechadura com senha, teclado 4x4 e LCD
#64Avançado
Premium

Fechadura com senha, teclado 4x4 e LCD

Uma pequena fechadura eletrônica que impede a entrada de quem não sabe a senha. Você pressiona a cerquilha e digita a senha no teclado. Se estiver correta, o display indica que o acesso foi permitido,

4.8(59)
75
Leitor de cartões RFID RC522 com ESP32 e LCD
#123Intermediário

Leitor de cartões RFID RC522 com ESP32 e LCD

Neste projeto, vamos conectar o módulo RFID RC522, baseado no MFRC522, ao ESP32 via SPI e ler o UID do cartão ou da etiqueta. Isso serve de base para aplicações como fechaduras, sistemas de associados e controle de acesso. Vamos exibir o UID lido em um display LCD; nesta versão, ele não é comparado com uma lista de cartões autorizados. ATENÇÃO: o RC522 funciona apenas com 3,3V; alimentá-lo com 5V queima o módulo!

4.8(21)
39
Sensor de porta com chave reed
#38Iniciante
Premium

Sensor de porta com chave reed

Saiba se a porta está aberta ou fechada só de olhar uma luz. Você fixa um pequeno ímã na porta e uma chave sensível ao ímã no batente; quando a porta está fechada, os dois ficam lado a lado e o LED ve

4.7(34)
44
Alarme de movimento com ESP32 (PIR + buzzer + LED + Telegram)
#145Avançado
Premium

Alarme de movimento com ESP32 (PIR + buzzer + LED + Telegram)

Um sistema de alarme de segurança inteligente que aciona o buzzer e o LED quando o sensor PIR detecta movimento e, ao mesmo tempo, envia uma notificação instantânea ao proprietário pelo Telegram. Inclui um intervalo de espera de 30 segundos para limitar a frequência dos alarmes repetidos; esse mecanismo não valida as detecções do PIR nem elimina disparos falsos. Pode ser usado na segurança de casas, no monitoramento de garagens, depósitos ou salas de trabalho.

0.0(0)
9