Parmak İzi Sensörü Arduino: AS608, R307 ve Kapı Kilidi Yapımı
Parmak izi sensörü Arduino ile nasıl kullanılır? AS608/R307 kablo renkleri, Adafruit Fingerprint ile kayıt ve doğrulama, röleli kilit, ESP32 ve hata çözümü.
Parmak izi sensörü, Arduino projelerine "kimsin?" sorusunu tek dokunuşla soran ve parmağını tanıdığında kapı, çekmece ya da kasa açabilen bir okuyucudur. Hobi elektroniğinde en yaygın modeller AS608 ve R307 tabanlı optik modüllerdir: parmağın görüntüsünü kendi içinde işler, parmak izlerini kendi belleğinde saklar ve Arduino'ya yalnızca "ID 3 ile eşleşti" gibi kısa bir cevap gönderir. Bu yüzden Arduino Uno gibi küçük bir kart bile yüzlerce kişilik bir parmak izi kilidini rahatça yönetebilir.
Bu rehberde sensörün nasıl çalıştığını, renkleri üreticiye göre değişen kablolarını nasıl doğru bağlayacağını, Adafruit Fingerprint kütüphanesiyle parmak izi kaydetmeyi (enroll) ve doğrulamayı, ID ile güven skorunun ne anlama geldiğini öğreneceksin. Ardından röle ve 12 V solenoid ile gerçek bir kapı kilidi kuracak, aynı işi ESP32 ve Raspberry Pi Pico ile yapacak ve meşhur "Did not find fingerprint sensor" hatasını adım adım çözeceksin.

Parmak izi sensörü nedir, nasıl çalışır?
AS608 ve R307 gibi modüller optik sensörlerdir. Parmağını cama koyduğunda içerideki LED, camın altındaki prizmayı aydınlatır; parmak izinin tepeleri camla temas ettiği için ışığı farklı yansıtır, çukurları ise temas etmez. Küçük bir kamera bu deseni yaklaşık 500 dpi çözünürlükte gri tonlu bir görüntü olarak çeker. Modülün içindeki DSP yongası görüntüden çizgilerin bittiği ve çatallandığı noktaları (minutiae) çıkarır ve bunları birkaç yüz baytlık bir özellik dosyasına dönüştürür. Aynı parmaktan alınan iki özellik dosyası birleştirilince bir şablon (template) oluşur ve bu şablon, sensörün kendi flash belleğine bir ID numarasıyla kaydedilir.
Doğrulama sırasında sensör yeni görüntüyü yine özellik dosyasına çevirir ve kayıtlı şablonların hepsiyle karşılaştırır. Bu 1:N arama genellikle bir saniyenin altında biter; sonunda sensör eşleşen ID'yi ve eşleşmenin ne kadar güçlü olduğunu gösteren bir güven skorunu (confidence) gönderir. Önemli nokta şu: parmak izinin resmi Arduino'ya hiç gelmez, tüm ağır iş sensörde yapılır. Arduino seri port (UART) üzerinden yalnızca komut gönderir ve kısa cevaplar okur.
| Özellik | AS608 modülü | R307 | FPM10A / ZFM-20 |
|---|---|---|---|
| Besleme | 3,3 V | 4,2–6 V (genellikle 5 V) | 3,6–6 V |
| Kayıt kapasitesi | Genellikle 300 (bazı kartlarda 162) | 1000 | 162 |
| Haberleşme | UART (TTL), varsayılan 57600 bps | UART (TTL), varsayılan 57600 bps | UART (TTL), varsayılan 57600 bps |
| Dokunma algılama pini | Var (WAK + Vt) | Var (Touch + 3.3VT) | Çoğunda yok |
| Güvenlik seviyesi | 1–5 | 1–5 | 1–5 |
| Hatalı kabul oranı (FAR) | < %0,001 | < %0,001 | < %0,001 |
| Arduino kütüphanesi | Adafruit Fingerprint | Adafruit Fingerprint | Adafruit Fingerprint |
Tablodaki değerler satıcıya ve kart sürümüne göre değişebilir, özellikle kapasite. En güvenilir yöntem, aşağıdaki test kodunu çalıştırıp sensörün kendi bildirdiği kapasiteyi okumaktır. Üç kavramı da netleştirelim: ID, şablonun bellekteki sıra numarasıdır (0'dan kapasitenin bir eksiğine kadar); güvenlik seviyesi, 1 (en hoşgörülü) ile 5 (en sıkı) arasında eşleşme eşiğini belirler; güven skoru ise her doğrulamada sensörün verdiği benzerlik puanıdır.
Kablo renkleri ve besleme: hangi kablo nereye?
Parmak izi sensörlerinde en çok yapılan hata, kablo renklerinin standart olduğunu sanmaktır. Aynı model sensör bir satıcıda kırmızı-siyah-sarı-beyaz, başka bir satıcıda kırmızı-siyah-yeşil-mavi kabloyla gelebilir; Adafruit bile farklı sensör sürümleri için farklı renk düzenleri listeler. Bu yüzden renge değil, sensörün arkasındaki ya da soketin yanındaki pin yazılarına ve satıcının şemasına bak. AS608 modüllerinde genellikle 6 pin bulunur: V+ (Vi), TX, RX, GND, WAK (Touch) ve Vt (3.3VT). Temel kullanım için yalnızca ilk dördü yeterlidir.
| Sensör pini | Görevi | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|---|
| V+ / Vi / VCC | Besleme | 3.3V (AS608) ya da 5V (R307) | 3V3 (R307 için 5V/VIN) | 3V3(OUT) (R307 için VBUS) |
| GND | Toprak | GND | GND | GND |
| TX | Sensörden veri çıkışı | D2 (SoftwareSerial RX) | GPIO 16 (RX2) | GP1 (UART0 RX) |
| RX | Sensöre veri girişi | D3 (SoftwareSerial TX) | GPIO 17 (TX2) | GP0 (UART0 TX) |
| WAK / Touch | Parmak algılandı sinyali (isteğe bağlı) | D4 | GPIO 27 | GP2 |
| Vt / 3.3VT | Dokunma devresinin beslemesi (isteğe bağlı) | 3.3V | 3V3 | 3V3(OUT) |
WAK (ya da Touch) pini, sensörün çok az akım çeken dokunma algılama devresine bağlıdır. Vt pinine 3,3 V verildiğinde parmak cama değdiği anda seviyesini değiştirir; çoğu modülde HIGH olur, bazılarında LOW, bu yüzden kendi kartında dene. Pille çalışan bir kilitte ana beslemeyi bir MOSFET ile kesip yalnızca Vt'yi açık bırakabilir, WAK sinyaliyle mikrodenetleyiciyi uykudan uyandırıp sensörü ancak o zaman çalıştırabilirsin.
Adafruit Fingerprint kütüphanesini kurmak
- Arduino IDE'de Araçlar > Kütüphaneleri Yönet menüsünü aç, Adafruit Fingerprint Sensor Library ara ve kur. Kütüphane eklemeyi hiç yapmadıysan Arduino'ya Kütüphane Ekleme yazısına göz at.
- Kütüphane AS608, R307, R503, FPM10A ve ZFM serisi gibi aynı komut setini kullanan sensörlerin hepsiyle çalışır; kod değiştirmen gerekmez.
- Dosya > Örnekler menüsünde enroll (kayıt), fingerprint (doğrulama), delete (tek kaydı silme) ve emptyDatabase (hepsini silme) örneklerini bulursun.
- Uno ve Nano'da sensör, USB'nin kullandığı 0 ve 1 numaralı pinleri meşgul etmemek için SoftwareSerial ile D2 ve D3'e bağlanır. Mega, Leonardo ve ESP32 gibi ikinci donanım seri portu olan kartlarda Serial1 ya da Serial2 kullanılır.
İlk test: sensör bulunuyor mu?
Kayda geçmeden önce sensörün Arduino ile konuştuğundan emin olalım. Aşağıdaki kod sensörü önce varsayılan 57600 bps hızında arar, bulamazsa diğer yaygın hızları dener. Sensörü bulduğunda hangi hızda cevap verdiğini, bildirdiği kapasiteyi, güvenlik seviyesini ve kayıtlı parmak izi sayısını Seri Monitör'e yazar. Seri Monitör'ü 9600 baud'a ayarlamayı unutma; bu, sensörün hızından bağımsızdır.
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}Parmak izi kaydetme (enroll) adım adım
Kayıt sırasında sensör aynı parmağın iki ayrı görüntüsünü alır, bunları iki ayrı tampona (CharBuffer1 ve CharBuffer2) özellik dosyası olarak koyar, ikisini birleştirip şablon oluşturur ve şablonu seçtiğin ID'ye yazar. Adafruit'in hazır enroll örneği ID'yi 1–127 aralığında sorar ve tek baytlık bir değişkende tutar. Aşağıdaki sadeleştirilmiş sürüm ID'yi 16 bit tutar ve üst sınırı sensörün gerçek kapasitesinden alır; böylece 300 ya da 1000 kayıtlı sensörlerin tamamını kullanabilirsin. Kütüphanedeki adımlar şöyledir:
- getImage(): Parmak cama konana kadar görüntü almaya çalışır; parmak yoksa FINGERPRINT_NOFINGER döner.
- image2Tz(1): İlk görüntüyü özellik dosyasına çevirip 1 numaralı tampona koyar.
- Parmak kaldırılır ve aynı parmak yeniden konur; image2Tz(2) ikinci görüntüyü 2 numaralı tampona koyar.
- createModel(): İki tamponu karşılaştırıp birleştirir; parmaklar uyuşmazsa FINGERPRINT_ENROLLMISMATCH döner.
- storeModel(id): Şablonu sensörün flash belleğine kalıcı olarak yazar; elektrik kesilse de silinmez.
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}Parmak izi doğrulama: ID ve güven skoru
Doğrulamada önce getImage() ile görüntü alınır, image2Tz() ile özellik dosyasına çevrilir, ardından kayıtlı şablonlar arasında arama yapılır. Kütüphanede iki arama fonksiyonu vardır: fingerFastSearch() hızlıdır ama kütüphanenin gönderdiği komut yalnızca ilk 163 kaydı (ID 0–162) tarar; fingerSearch() ise getParameters() ile okunan kapasitenin tamamında arar. 162'den büyük ID kullanacaksan fingerSearch() kullan ve setup() içinde mutlaka getParameters() çağır; aksi halde kütüphane kapasiteyi varsayılan 64 kabul eder ve yalnızca ilk 64 kaydı arar.
Arama başarılı olduğunda finger.fingerID eşleşen kaydın numarasını, finger.confidence ise güven skorunu verir. Eşleşme kararını sensör zaten güvenlik seviyesine göre kendisi verir; skor yalnızca eşleşmenin ne kadar güçlü olduğunu gösterir. İyi kaydedilmiş bir parmakta skor genellikle birkaç onluk ile birkaç yüz arasında çıkar. Daha sıkı bir kilit istersen setSecurityLevel(4) ya da setSecurityLevel(5) ile eşiği yükseltebilir veya kodunda ek bir alt sınır koyabilirsin (ör. 50'nin altını reddet). Eşiği yükseltmek yanlış kişinin kabul edilme ihtimalini azaltır ama doğru kişinin reddedilme ihtimalini artırır; dengeyi kendi parmaklarınla deneyerek bul.
| Dönüş kodu | Seri Monitör mesajı | Anlamı ve çözüm |
|---|---|---|
| FINGERPRINT_OK (0x00) | Image taken / Stored! | İşlem başarılı. |
| FINGERPRINT_NOFINGER (0x02) | No finger detected | Camda parmak yok; döngüde beklemeye devam et. |
| FINGERPRINT_PACKETRECIEVEERR (0x01) | Communication error | Cevap paketi alınamadı; kabloyu, hızı ve beslemeyi kontrol et. |
| FINGERPRINT_IMAGEFAIL (0x03) | Imaging error | Görüntü alınamadı; parmağı yeniden yerleştir. |
| FINGERPRINT_IMAGEMESS (0x06) | Image too messy | Görüntü bulanık; camı temizle, parmak çok ıslak ya da çok kuru olabilir. |
| FINGERPRINT_FEATUREFAIL (0x07) | Could not find fingerprint features | Yeterli ayrıntı yok; parmağı ortala ve hafifçe bastır. |
| FINGERPRINT_NOTFOUND (0x09) | Did not find a match | Eşleşen kayıt yok; parmak kayıtlı değil ya da kötü kaydedilmiş. |
| FINGERPRINT_ENROLLMISMATCH (0x0A) | Fingerprints did not match | Kayıttaki iki görüntü uyuşmadı; işlemi tekrarla. |
| FINGERPRINT_BADLOCATION (0x0B) | Could not store in that location | ID kapasitenin dışında; getParameters() ile sınırı oku. |
| FINGERPRINT_FLASHERR (0x18) | Error writing to flash | Sensörün belleğine yazılamadı; beslemeyi ve kabloları kontrol et. |
Röle ve solenoid ile parmak izli kapı kilidi
Şimdi öğrendiklerimizi birleştirip yetkili parmakta kilidi 3 saniye açan, yetkisiz parmakta üç kez öten ve art arda 5 hatalı denemede sistemi 30 saniye kilitleyen bir kapı kilidi yapalım. Kilit olarak 12 V'luk bir solenoid kilit kullanıyoruz. Solenoid 0,5–1 A çektiği için Arduino pinine asla doğrudan bağlanmaz; araya bir röle modülü ya da lojik seviyeli bir MOSFET konur. Bağlantı şöyle: röle modülünün VCC ve GND pinleri Arduino'nun 5V ve GND'sine, IN pini D8'e, aktif buzzer D9'a, 12 V adaptörün artısı rölenin COM ucuna, rölenin NO ucu solenoidin artısına, solenoidin eksisi de adaptörün eksisine gider.
Solenoid bir bobindir ve akımı kesildiği anda yüksek bir ters gerilim üretir. Bu yüzden solenoidin uçlarına ters yönde bir 1N4007 diyot bağla; diyotun çizgili ucu artıya gelmeli. Röle yerine MOSFET kullanacaksan IRLZ44N gibi lojik seviyeli bir model seç ve 12 V kaynağın eksisini Arduino'nun GND'sine bağla. Ayrıntılar için MOSFET ile yüksek akım sürmek yazısına, MOSFET'in bacak sırası için Transistör Bacak Bağlantıları aracına bakabilirsin.
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}ESP32 ile parmak izi sensörü: Serial2 bağlantısı
ESP32'nin üç donanım seri portu olduğu için SoftwareSerial'a gerek yoktur; sensörü UART2'ye (Serial2) bağlarsın. ESP32 3,3 V ile çalıştığı için AS608'in sinyal seviyeleriyle birebir uyumludur ve gerilim bölücü gerekmez. Dikkat etmen gereken tek nokta pinlerdir: güncel Arduino-ESP32 çekirdeğinde (3.x) Serial2'nin varsayılan pinleri, eski rehberlerdeki GPIO 16/17 değil, GPIO 4 (RX) ve GPIO 25 (TX)'tir. Bu yüzden Serial2.begin() içine pinleri açıkça yazmalısın; kütüphanenin begin() fonksiyonu daha önce ayarlanan pinleri korur. Kartının pin haritasını Pinout aracında görebilirsin.
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}ESP32-WROVER modüllü kartlarda GPIO 16 ve 17 PSRAM'e bağlıdır; böyle bir kartta FP_RX ve FP_TX'i örneğin 25 ve 26 yap. ESP32-C3'te yalnızca iki UART olduğundan Serial2 yoktur; aynı kodu Serial1 ve istediğin iki pinle kullanabilirsin. Wi-Fi sayesinde her girişi saatiyle bir sunucuya kaydedebilir ya da tanınmayan bir parmakta Telegram botu ile telefonuna bildirim gönderebilirsin.
Raspberry Pi Pico ve MicroPython ile parmak izi sensörü
MicroPython için Adafruit kütüphanesinin resmi bir karşılığı yok, ama sensörün protokolü basit olduğu için birkaç satırla kendin konuşabilirsin. Her paket EF 01 başlangıç koduyla başlar; ardından 4 baytlık adres (varsayılan FF FF FF FF), paket tipi (01 komut, 07 cevap), 2 baytlık uzunluk, komut ve parametreler, en sonda da tip, uzunluk ve veri baytlarının toplamından oluşan 2 baytlık sağlama toplamı gelir. Cevabın ilk veri baytı onay kodudur: 00 başarılı, 02 parmak yok, 09 eşleşme yok. Aşağıdaki kod sensörü doğrular, kapasiteyi okur ve konan parmağı ID ve güven skoruyla tanır. Pico 3,3 V ile çalıştığı için AS608'i doğrudan 3V3(OUT) pinine bağlayabilirsin; Pico'ya yeni başlıyorsan Raspberry Pi Pico Nedir? yazısı iyi bir başlangıçtır.
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)"Did not find fingerprint sensor" hatası ve diğer sık sorunlar
Bu mesaj, kütüphanenin verifyPassword() komutuna sensörden geçerli bir cevap alamadığı anlamına gelir; sensörün bozuk olduğunu göstermez. Vakaların büyük çoğunluğu kablolamadan, beslemeden ya da yanlış hızdan kaynaklanır. Aşağıdaki tabloyu yukarıdan aşağıya doğru kontrol et:
| Belirti | Olası neden | Çözüm |
|---|---|---|
| Did not find fingerprint sensor :( | TX ve RX düz bağlanmış | Sensörün TX'i Arduino'nun RX'ine (D2), RX'i TX'ine (D3) gider. İki veri kablosunun yerini değiştirmek zarar vermez; dene. |
| Did not find fingerprint sensor :( | Kablo renklerine güvenilmiş | Kart üzerindeki pin yazılarına ya da satıcı şemasına göre yeniden bağla; GND'yi multimetreyle doğrula. |
| Did not find fingerprint sensor :( | Yanlış ya da yetersiz besleme | AS608'e 3,3 V, R307'ye 5 V ver; Uno'nun 3.3V pini yetmiyorsa harici regülatör kullan ve GND'leri birleştir. |
| Did not find fingerprint sensor :( | Sensör farklı bir hızda | İlk test kodundaki hız taramasını çalıştır, bulunan değeri finger.begin() içine yaz. |
| Did not find fingerprint sensor :( | Sensörün şifresi değiştirilmiş | Şifreyi kurucuya ver: Adafruit_Fingerprint finger(&fpSerial, 0x12345678); |
| Mega ya da Leonardo'da sensör bulunamıyor | SoftwareSerial her pinde veri alamaz | Serial1 kullan: Mega'da RX1 19, TX1 18; Leonardo'da RX 0, TX 1. |
| ESP32'de sensör bulunamıyor | Serial2 varsayılan pinleri farklı ya da PSRAM çakışması | Serial2.begin(57600, SERIAL_8N1, RX, TX) ile pinleri açıkça yaz; WROVER'da 16/17'yi kullanma. |
| Sık sık "Communication error" | Gevşek soket, uzun ya da ince kablo | Kabloları kısa tut, breadboard yerine lehimli bağlantı kullan, beslemeye 100 µF kondansatör ekle. |
| Kayıtlı parmak sık reddediliyor | Kirli cam, kuru ya da ıslak parmak, tek açıdan kayıt | Camı yumuşak bir bezle sil, aynı parmağı iki ID ile kaydet, gerekirse güvenlik seviyesini 2'ye düşür. |
| Sensör ısınıyor, LED hiç yanmıyor | Besleme ters ya da AS608'e 5 V verilmiş | Gücü hemen kes ve bağlantıyı düzelt; sensör zarar görmüş olabilir. |
Waveshare UART parmak izi okuyucu: kısa not

Waveshare'in UART parmak izi okuyucusu, görünüşü benzese de AS608 ve R307'den farklı bir protokol konuşur: komutlar 8 baytlıktır, 0xF5 ile başlayıp 0xF5 ile biter ve varsayılan hız 19200 bps'dir. Bu nedenle Adafruit Fingerprint kütüphanesiyle çalışmaz; Waveshare'in kullanım kılavuzundaki komut tablosu ve örnek kodları kullanılır. Kayıtta parmak üç kez okutulur, her kullanıcıya 1–3 arası bir yetki seviyesi atanabilir ve 1:N karşılaştırma tek bir komutla yapılır. Kart 3,3 V ya da 5 V ile beslenebilir; TXD'yi mikrodenetleyicinin RX'ine, RXD'yi TX'ine bağlarsın. Hazır kütüphane ve örnek bolluğu istiyorsan AS608 ya da R307, kendi protokol kodunu yazmaktan çekinmiyorsan Waveshare iyi bir seçimdir.
Parmak izi sensörü ile proje fikirleri
- Parmak izli çekmece ya da kasa: Servo ya da solenoidle açılan, yetkisiz denemede alarm veren küçük bir kasa. Servolu kilit mekanizması için Servo Motor Nedir? yazısına bak.
- İki aşamalı kapı: Önce parmak izi, ardından keypad ile PIN kodu isteyen daha güvenli bir giriş.
- Kart ya da parmak: Aynı kilide bir RFID RC522 okuyucu ekleyerek kartı olanın kartla, olmayanın parmakla girmesi.
- Yoklama sistemi: Okul ya da kulüp için her ID'yi bir isimle eşleştirip giriş saatlerini kaydetmek.
- Ekranlı kilit: Karşılama mesajını ve kişinin adını bir OLED ekranda göstermek.
- Ev alarmıyla birlikte: Parmak iziyle kurulup kapatılan bir Arduino alarm sistemi.
Parmak izi sensörü, birkaç kablo ve doğru kütüphaneyle projene gerçek bir kimlik katmanı ekler: önce sensörü test et, parmakları özenle kaydet, sonra röle ve solenoidle kilidi kur. BlueGrays uygulamasında akıllı elektronik kasa, RFID kimlik doğrulama, ESP32 RFID kapı kilidi ve keypad şifre uygulaması gibi güvenlik projelerini devre şemaları ve kodlarıyla adım adım bulabilir, parmak izi sensörünü eklemek için hazır bir temel edinebilirsin.
Sıkça sorulan sorular
Parmak izi sensörü kaç parmak izi kaydedebilir?
Modele göre değişir: AS608 kartları genellikle 300 (bazıları 162), R307 1000, FPM10A ve ZFM-20 ise 162 kayıt tutar. Kendi sensörünün kapasitesini öğrenmek için getParameters() fonksiyonunu çağırıp finger.capacity değerini Seri Monitör'e yazdır. Aynı parmağı iki ID ile kaydedersen iki yer harcadığını unutma.
Parmak izi sensörü 5V mu 3.3V mu çalışır?
AS608 kartlarının çoğu 3,3 V ister; R307 ise 4,2–6 V aralığında, genellikle 5 V ile çalışır. Sensörün üzerindeki yazıyı ve satıcının teknik bilgisini kontrol etmeden besleme verme. 5 V'luk Arduino'nun TX çıkışını 3,3 V'luk bir sensörün RX'ine bağlarken gerilim bölücü kullanmak en güvenlisidir.
Parmak izleri Arduino'da mı saklanır, elektrik kesilince silinir mi?
Hayır, şablonlar sensörün kendi flash belleğinde saklanır ve elektrik kesilince silinmez. Arduino'yu değiştirsen ya da yeni kod yüklesen bile kayıtlar sensörde kalır. Arduino tarafında yalnızca hangi ID'nin kime ait olduğunu tutman gerekir; istersen bunu EEPROM'a kaydedebilirsin.
"Did not find fingerprint sensor" hatası nasıl çözülür?
Önce TX ve RX'in çapraz bağlandığından emin ol: sensörün TX'i Arduino'nun RX pinine (Uno'da D2) gider. Sonra beslemenin doğru gerilimde ve yeterli akımda olduğunu, GND'lerin ortak olduğunu kontrol et. Hâlâ bulunamıyorsa sensör farklı bir hızda ya da şifreyle çalışıyor olabilir; farklı baud hızlarını deneyen bir test kodu çalıştır.
AS608 ile R307 arasındaki fark nedir?
İkisi de aynı komut setini kullanan optik sensörlerdir ve Adafruit Fingerprint kütüphanesiyle aynı kodla çalışır. Temel farklar besleme ve kapasitededir: AS608 kartları genellikle 3,3 V ile çalışır ve yaklaşık 300 kayıt tutar, R307 ise 5 V ile çalışır ve 1000 kayıt tutabilir. Bağlamadan önce pin sırasını kendi modelinin etiketinden kontrol et.
Kayıtlı bir parmak izi nasıl silinir?
Tek bir kaydı silmek için finger.deleteModel(id), tüm kayıtları silmek için finger.emptyDatabase() fonksiyonunu kullan. Kütüphanedeki delete ve emptyDatabase örnekleri bu işi Seri Monitör üzerinden yapar. Silinen ID'ye daha sonra yeni bir parmak izi kaydedebilirsin.
Bu yazıdan sonra yapabileceğin projeler
Tüm projeleri gör
Akıllı Elektronik Kasa
Değerli eşyalarını saklayabileceğin, şifreyle açılan küçük bir kasa. Tuş takımından dört haneli şifreni girersin; doğruysa servo motor kilidi açar, yeşil ışık yanar ve ekran kasanın durumunu yazar, he

ESP32 RFID Kapı Kilidi (RC522 + Servo + OLED + Buzzer + LED)
ESP32 ile RC522 RFID modülü, SG90 servo motoru, SSD1306 OLED ekran, aktif buzzer ve 2 LED kullanarak akıllı bir kapı kilidi yapıyoruz. Kart okutulduğunda, UID kod içinde tanımlı yetkili kartlar listesiyle karşılaştırılır — yetkiliyse servo motoru döndürerek kilit açılır (yeşil LED + 2 kısa bip), 5 saniye sonra otomatik kilitler. Yetkisiz kartta kırmızı LED yanar, 3 hızlı bip ile uyarı verir ve OLED'de yakalanan UID gösterilir. Gerçek IoT güvenlik senaryosu için pratik ve öğretici — SPI protokolü

RFID Kimlik Doğrulama
Apartman kapısındaki kartlı giriş gibi: RFID okuyucuya kartını yaklaştırırsın, Arduino kartın numarasını kayıtlı olanla karşılaştırır. Doğru kartta yeşil, yabancı kartta kırmızı LED üç saniye yanar ve

RFID Değer Okuma
Apartman anahtarlığında ya da giriş kartında gizli bir kimlik numarası saklıdır; bu proje onu okur. Kartı RFID okuyucuya yaklaştırınca Arduino kartın numarasını bilgisayar ekranına yazar. Kartlı kapı

4x4 Keypad LCD Ekran Şifre Uygulaması
Doğru şifreyi bilmeyenin giremediği küçük bir elektronik kapı kilidi. Kare tuşuna basıp şifreyi tuş takımından girersin; şifre doğruysa ekranda giriş izni yazar, yeşil LED yanar ve servo motor kapıyı

ESP32 RFID RC522 Kart Okuyucu (LCD Ekranlı)
Bu projede MFRC522 tabanlı RC522 RFID modülünü ESP32'ye SPI üzerinden bağlayıp kart/etiket UID'sini okuyacağız. Kapı kilidi, üyelik sistemi ve giriş kontrolü gibi uygulamaların temelini oluşturur. Okunan UID'yi LCD ekranda göstereceğiz; bu sürümde yetkili kart listesiyle karşılaştırma yapılmaz. DİKKAT: RC522 sadece 3.3V ile çalışır, 5V verirseniz modül yanar!

Reed Röle Kapı Sensörü
Kapın açık mı kapalı mı, bir ışığa bakarak anla. Kapıya küçük bir mıknatıs, kasaya da mıknatısı hisseden bir anahtar takarsın; kapı kapalıyken ikisi yan yana durur ve yeşil LED yanar, kapı açılıp mıkn

ESP32 Hareket Alarm Sistemi (PIR + Buzzer + LED + Telegram)
PIR sensörü hareket algıladığında buzzer ve LED'i aktif eden, aynı anda Telegram üzerinden sahibine anlık bildirim gönderen akıllı bir güvenlik alarm sistemidir. Tekrarlayan alarmların sıklığını sınırlamak için 30 saniyelik cooldown (bekleme süresi) mekanizması vardır; bu mekanizma PIR sensörünün yanlış algılamalarını doğrulamaz veya ortadan kaldırmaz. Ev güvenliği, garaj izleme, depo veya çalışma odası gibi alanlarda kullanılabilir. Telegram entegrasyonu sayesinde nerede olursanız olun anında h
Diğer yazılar
BlueGrays uygulaması
Bu devreyi telefonunda adım adım kur
Devre şeması, kod ve parça listesi tek ekranda. 200'den fazla Arduino, ESP32 ve Pico projesi seni bekliyor.
Telefonunla tara
Kamerayı koda tut; telefonunun uygulama mağazası açılır.
ya da mağazada aç

