一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

指紋傳感器與Arduino的接口(附代碼)

芯情觀察猿 ? 來源:芯情觀察猿 ? 作者:芯情觀察猿 ? 2022-07-08 10:21 ? 次閱讀

指紋傳感器是應(yīng)用廣泛的感知元件,本項(xiàng)目以R502/R503電容式指紋傳感器為例,演示如何通過Arduino開發(fā)板錄入和檢測(cè)指紋。項(xiàng)目BOM清單如下:
Arduino開發(fā)板 1
指紋傳感器R503 1
杜邦線 20
面包板 1


了解電容式指紋傳感器


光學(xué)指紋傳感器的創(chuàng)建指紋圖像不同,電容式產(chǎn)品采用微電容電路組成的陣列來收集數(shù)據(jù)。當(dāng)手指按壓到采集面上時(shí),手指的脊和谷在表皮和芯片之間產(chǎn)生不同的微小電容,芯片通過測(cè)量空間中的不同的電磁場(chǎng)得到完整的指紋信息,并通過運(yùn)放和ADC進(jìn)行處理。例如,R502/R503就能識(shí)別干、濕指紋,而前者更輕巧。

pYYBAGLHkoOAAJZgAABeDKon6rk486.png

以R503為例,該傳感器內(nèi)嵌指紋識(shí)別算法和協(xié)議,具有指紋采集、比對(duì)、搜索和模板存儲(chǔ)等功能。R503圖像大小192*192,分辨率達(dá)508 DPI,可存儲(chǔ)200個(gè)指紋,F(xiàn)RR≤0.01%,F(xiàn)AR≤0.00001%,支持Arduino、Android、Windows、Linux等。


R503支持低功耗手指檢測(cè),工作電壓3.3V,采集電流不超過18mA,平均待機(jī)電流僅2uA。R503通過RS232 UART接口,通訊速率達(dá)57600bps,用于電腦外設(shè)、指紋門鎖、指紋掛鎖、保險(xiǎn)柜等。

poYBAGLHkx2AAAFMAABk4VjQny4784.png

把R502/R503與Arduino連接,電電路很簡(jiǎn)單。

pYYBAGLHkqKAPV0LAAA1u94pE_U725.png



.
把R502/R503的VCC、GND、Tx (黃線)、Rx (綠線)四個(gè)引腳分別連接到Arduino開發(fā)板的3.3V、GND、D2、D3引腳.,藍(lán)色的中斷線不用連接,白色引線接到3.3V引腳上。

pYYBAGLHk3SAIrMOAADcGGXYa4M722.png

源代碼及編程


Github倉庫有Adafruit編寫的關(guān)于R502/R503指紋傳感器的Arduino庫文件。指紋錄入和閱讀是分開的,錄入代碼保存在EEPROM存儲(chǔ)器中,閱讀代碼從EEPROM中讀取數(shù)據(jù)并與掃描到的指紋數(shù)據(jù)校驗(yàn)匹配。
指紋錄入代碼如下:

#include

#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__)
// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino(WHITE wire)
// Set up the serial port to use softwareserial..
SoftwareSerial mySerial(2, 3);

#else
// On Leonardo/M0/etc, others with hardware serial, use hardware serial!
// #0 is green wire, #1 is white
#define mySerial Serial1

#endif

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

uint8_t id;

void setup()
{
Serial.begin(9600);
while (!Serial);// For Yun/Leo/Micro/Zero/...
delay(100);
Serial.println("\n\nAdafruit Fingerprint sensor enrollment");

// set the data rate for the sensor serial port
finger.begin(57600);

if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!");
} else {
Serial.println("Did not find fingerprint sensor :(");
while (1) { delay(1); }
}

Serial.println(F("Reading sensor parameters"));
finger.getParameters();
Serial.print(F("Status: 0x")); Serial.println(finger.status_reg, HEX);
Serial.print(F("Sys ID: 0x")); Serial.println(finger.system_id, HEX);
Serial.print(F("Capacity: ")); Serial.println(finger.capacity);
Serial.print(F("Security level: ")); Serial.println(finger.security_level);
Serial.print(F("Device address: ")); Serial.println(finger.device_addr, HEX);
Serial.print(F("Packet len: ")); Serial.println(finger.packet_len);
Serial.print(F("Baud rate: ")); Serial.println(finger.baud_rate);
}

uint8_t readnumber(void) {
uint8_t num = 0;

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

void loop() // run over and over again
{
Serial.println("Ready to enroll a fingerprint!");
Serial.println("Please type in the ID # (from 1 to 127) you want to save this finger as...");
id = readnumber();
if (id == 0) {// ID #0 not allowed, try again!
return;
}
Serial.print("Enrolling ID #");
Serial.println(id);

while (!getFingerprintEnroll() );
}

uint8_t getFingerprintEnroll() {

int p = -1;
Serial.print("Waiting for valid finger to enroll as #"); Serial.println(id);
while (p != FINGERPRINT_OK) {
p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image taken");
break;
case FINGERPRINT_NOFINGER:
Serial.println(".");
break;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
break;
case FINGERPRINT_IMAGEFAIL:
Serial.println("Imaging error");
break;
default:
Serial.println("Unknown error");
break;
}
}

// OK success!

p = finger.image2Tz(1);
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image converted");
break;
case FINGERPRINT_IMAGEMESS:
Serial.println("Image too messy");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println("Could not find fingerprint features");
return p;
case FINGERPRINT_INVALIDIMAGE:
Serial.println("Could not find fingerprint features");
return p;
default:
Serial.println("Unknown error");
return p;
}

Serial.println("Remove finger");
delay(2000);
p = 0;
while (p != FINGERPRINT_NOFINGER) {
p = finger.getImage();
}
Serial.print("ID "); Serial.println(id);
p = -1;
Serial.println("Place same finger again");
while (p != FINGERPRINT_OK) {
p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image taken");
break;
case FINGERPRINT_NOFINGER:
Serial.print(".");
break;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
break;
case FINGERPRINT_IMAGEFAIL:
Serial.println("Imaging error");
break;
default:
Serial.println("Unknown error");
break;
}
}

// OK success!

p = finger.image2Tz(2);
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image converted");
break;
case FINGERPRINT_IMAGEMESS:
Serial.println("Image too messy");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println("Could not find fingerprint features");
return p;
case FINGERPRINT_INVALIDIMAGE:
Serial.println("Could not find fingerprint features");
return p;
default:
Serial.println("Unknown error");
return p;
}

// OK converted!
Serial.print("Creating model for #");Serial.println(id);

p = finger.createModel();
if (p == FINGERPRINT_OK) {
Serial.println("Prints matched!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error");
return p;
} else if (p == FINGERPRINT_ENROLLMISMATCH) {
Serial.println("Fingerprints did not match");
return p;
} else {
Serial.println("Unknown error");
return p;
}

Serial.print("ID "); Serial.println(id);
p = finger.storeModel(id);
if (p == FINGERPRINT_OK) {
Serial.println("Stored!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error");
return p;
} else if (p == FINGERPRINT_BADLOCATION) {
Serial.println("Could not store in that location");
return p;
} else if (p == FINGERPRINT_FLASHERR) {
Serial.println("Error writing to flash");
return p;
} else {
Serial.println("Unknown error");
return p;
}

return true;
}

上傳代碼后,打開Serial Monitor,監(jiān)視器將詢問位于1-127之間的指紋ID 。

poYBAGLHk6-ATBEwAACSMgfQKyM736.png

現(xiàn)在Serial Monitor顯示屏中輸入ID號(hào),并發(fā)送,然后按照屏幕指令提示錄入指紋。

poYBAGLHk8OAUHKmAAECWSag_9w343.png

把希望錄入的手指放在傳感器上。

一個(gè)手指錄入成功后,你也可以按照同樣的方式再錄入其他幾個(gè)手指的指紋。

pYYBAGLHk9mAf-OqAAB4ZieuYIM135.png

指紋讀取代碼如下:

#include
int u=0;
int relay=5;

#if (defined(__AVR__) || defined(ESP8266)) && !defined(__AVR_ATmega2560__)
// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino(WHITE wire)
// Set up the serial port to use softwareserial..
SoftwareSerial mySerial(2, 3);

#else
// On Leonardo/M0/etc, others with hardware serial, use hardware serial!
// #0 is green wire, #1 is white
#define mySerial Serial1

#endif

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

void setup()
{
pinMode(relay,OUTPUT);
Serial.begin(9600);
while (!Serial);// For Yun/Leo/Micro/Zero/...
delay(100);
Serial.println("\n\nAdafruit finger detect test");

// set the data rate for the sensor serial port
finger.begin(57600);
delay(5);
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!");
} else {
Serial.println("Did not find fingerprint sensor :(");
while (1) { delay(1); }
}

Serial.println(F("Reading sensor parameters"));
finger.getParameters();
Serial.print(F("Status: 0x")); Serial.println(finger.status_reg, HEX);
Serial.print(F("Sys ID: 0x")); Serial.println(finger.system_id, HEX);
Serial.print(F("Capacity: ")); Serial.println(finger.capacity);
Serial.print(F("Security level: ")); Serial.println(finger.security_level);
Serial.print(F("Device address: ")); Serial.println(finger.device_addr, HEX);
Serial.print(F("Packet len: ")); Serial.println(finger.packet_len);
Serial.print(F("Baud rate: ")); Serial.println(finger.baud_rate);

finger.getTemplateCount();

if (finger.templateCount == 0) {
Serial.print("Sensor doesn't contain any fingerprint data. Please run the 'enroll' example.");
}
else {
Serial.println("Waiting for valid finger...");
Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
}
}

void loop() // run over and over again
{
getFingerprintID();
delay(50);//don't ned to run this at full speed.
}

uint8_t getFingerprintID() {
uint8_t p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image taken");
break;
case FINGERPRINT_NOFINGER:
Serial.println("No finger detected");
finger.LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_BLUE);
finger.LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_RED);
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
return p;
case FINGERPRINT_IMAGEFAIL:
Serial.println("Imaging error");
return p;
default:
Serial.println("Unknown error");
return p;
}

// OK success!

p = finger.image2Tz();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image converted");
break;
case FINGERPRINT_IMAGEMESS:
Serial.println("Image too messy");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println("Could not find fingerprint features");
return p;
case FINGERPRINT_INVALIDIMAGE:
Serial.println("Could not find fingerprint features");
return p;
default:
Serial.println("Unknown error");
return p;
}

// OK converted!
p = finger.fingerSearch();
if (p == FINGERPRINT_OK) {
Serial.println("Found a print match!");
finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_PURPLE, 10);
delay(1000);
if(u==0)
{
digitalWrite(relay,HIGH);
u=1;
}
else if(u==1)
{
digitalWrite(relay,LOW);
u=0;
}
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error");
return p;
} else if (p == FINGERPRINT_NOTFOUND) {
finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_RED, 10);
delay(1000);
Serial.println("Did not find a match");
return p;
} else {
Serial.println("Unknown error");
return p;
}

// found a match!
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);

return finger.fingerID;
}

// returns -1 if failed, otherwise returns ID #
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;

// found a match!
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);
return finger.fingerID;
}


一旦指紋錄入成功,就可以上傳上述代碼,以讀取存儲(chǔ)在指紋數(shù)據(jù)庫中的指紋信息,通過比對(duì)匹配實(shí)現(xiàn)門禁、考勤、開機(jī)等操作。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8885

    瀏覽量

    152990
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    5389

    瀏覽量

    100988
  • 指紋傳感器
    +關(guān)注

    關(guān)注

    6

    文章

    196

    瀏覽量

    63829
  • Arduino
    +關(guān)注

    關(guān)注

    188

    文章

    6485

    瀏覽量

    189712
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于Arduino控制指紋傳感器模塊的指紋識(shí)別使用方案

    本篇文章主要介紹如何在Arduino開發(fā)板上使用指紋傳感器模塊FPM10A。我們將向您介紹如何注冊(cè)新的指紋ID,以及如何查找匹配的指紋。
    的頭像 發(fā)表于 10-28 14:19 ?8198次閱讀

    半導(dǎo)體指紋傳感器與光學(xué)指紋傳感器的技術(shù)原理比較

    本帖最后由 eehome 于 2013-1-5 10:07 編輯 半導(dǎo)體傳感器可以分為硅電容指紋傳感器、半導(dǎo)體壓感式傳感器、半導(dǎo)體溫度感應(yīng)傳感
    發(fā)表于 06-04 16:43

    回收指紋傳感器模組 收購(gòu)指紋傳感器模組

    回收傳感器模組,收購(gòu)傳感器模組,指紋傳感器IC、傳感器指紋芯片、
    發(fā)表于 11-19 17:09

    【開源分享】帶有 Arduino 接口的火災(zāi)報(bào)警傳感器

    描述帶有 Arduino 接口 PCB 設(shè)計(jì)板的火災(zāi)報(bào)警傳感器火焰傳感器:火焰傳感器對(duì)普通光敏感。它用于檢測(cè)火焰或火災(zāi)的存在。該模塊可以檢測(cè)
    發(fā)表于 06-30 16:12

    怎樣用ArduinoUNO創(chuàng)建指紋傳感器門鎖

    首先,將指紋傳感器連接到Arduino UNO。確保通過串行通信獲得與Arduino配合使用的指紋傳感器
    的頭像 發(fā)表于 08-01 17:51 ?7140次閱讀

    怎樣將敲擊傳感器Arduino接口

    在這個(gè)項(xiàng)目中,我們將了解敲擊傳感器或振動(dòng)傳感器(有時(shí)稱為分接傳感器)。在此過程中,我們將看到敲擊傳感器的組件,敲擊傳感器的工作原理以及如何將
    的頭像 發(fā)表于 07-30 10:49 ?9836次閱讀

    指紋傳感器定義_指紋傳感器的應(yīng)用

    指紋傳感器(又稱指紋Sensor)是實(shí)現(xiàn)指紋自動(dòng)采集的關(guān)鍵器件。指紋傳感器
    發(fā)表于 12-23 09:37 ?3553次閱讀

    Arduino雨滴傳感器的使用示例代碼免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是Arduino雨滴傳感器的使用示例代碼免費(fèi)下載。
    發(fā)表于 03-27 11:39 ?43次下載
    <b class='flag-5'>Arduino</b>雨滴<b class='flag-5'>傳感器</b>的使用示例<b class='flag-5'>代碼</b>免費(fèi)下載

    霍爾傳感器Arduino UNO接口及示例代碼

    霍爾傳感器應(yīng)用非常廣泛,本文以A3144開關(guān)型霍爾傳感器為例,介紹霍爾效應(yīng)傳感器以及A3144與Arduino UNO的連接,通過紅色LED閃爍檢測(cè)其附近是否有磁場(chǎng)存在。
    的頭像 發(fā)表于 08-01 09:14 ?6051次閱讀
    霍爾<b class='flag-5'>傳感器</b>與<b class='flag-5'>Arduino</b> UNO<b class='flag-5'>接口</b>及示例<b class='flag-5'>代碼</b>

    帶有用于AGV的磁帶傳感器Arduino接口

    電子發(fā)燒友網(wǎng)站提供《帶有用于AGV的磁帶傳感器Arduino接口.zip》資料免費(fèi)下載
    發(fā)表于 10-28 16:00 ?1次下載
    帶有用于AGV的磁帶<b class='flag-5'>傳感器</b>的<b class='flag-5'>Arduino</b><b class='flag-5'>接口</b>

    Arduino UNO板上使用指紋傳感器模塊FPM10A

    電子發(fā)燒友網(wǎng)站提供《在Arduino UNO板上使用指紋傳感器模塊FPM10A.zip》資料免費(fèi)下載
    發(fā)表于 11-11 09:26 ?2次下載
    在<b class='flag-5'>Arduino</b> UNO板上使用<b class='flag-5'>指紋</b><b class='flag-5'>傳感器</b>模塊FPM10A

    Arduino Uno接口超聲波傳感器開源

    電子發(fā)燒友網(wǎng)站提供《與Arduino Uno接口超聲波傳感器開源.zip》資料免費(fèi)下載
    發(fā)表于 11-30 09:28 ?1次下載
    與<b class='flag-5'>Arduino</b> Uno<b class='flag-5'>接口</b>超聲波<b class='flag-5'>傳感器</b>開源

    Arduino指紋傳感器教程

    方案介紹尊敬的朋友們,歡迎繼續(xù)閱讀本教程!今天,我們將建立一個(gè)有趣的Arduino項(xiàng)目,該項(xiàng)目使用指紋傳感器模塊。不用再拖延了,讓我們開始吧! 我一直想嘗試一個(gè)指紋
    發(fā)表于 01-03 16:34 ?0次下載

    Arduino指紋傳感器教程分享

    電子發(fā)燒友網(wǎng)站提供《Arduino指紋傳感器教程分享.zip》資料免費(fèi)下載
    發(fā)表于 06-20 09:43 ?0次下載
    <b class='flag-5'>Arduino</b><b class='flag-5'>指紋</b><b class='flag-5'>傳感器</b>教程分享

    指紋傳感器的定義 指紋傳感器的應(yīng)用

    指紋傳感器的定義 指紋傳感器的應(yīng)用? 指紋傳感器是一種生物識(shí)別技術(shù),通過檢測(cè)和分析人體
    的頭像 發(fā)表于 03-05 17:35 ?3852次閱讀