Arduino案例实操 -- AS608光学指纹模块
指紋,也叫手印,即是表皮上突起的紋線。由于人的指紋是遺傳與環(huán)境共同作用產(chǎn)生的,因而指紋人人皆有,卻各不相同。由于指紋重復(fù)率極小,大約150億分之一,故其稱為“人體身份證”。
目錄指引
- 一.指紋概念
- 1.指紋的由來
- 2.指紋的唯一性
- 二、指紋檢測
- 1.獲取方式
- 2.指紋識別
- 優(yōu)點:
- 缺點:
- 三、光學(xué)指紋模塊
- 1.ATK-AS608 光學(xué)指紋模塊
- 2.技術(shù)指標
- 3.硬件接口
- 4.系統(tǒng)資源
- 緩沖區(qū)與指紋庫
- 用戶記事本
- 隨機數(shù)產(chǎn)生器
- 5.軟件開發(fā)指南
- 模塊地址(大小:4bytes,屬性:讀寫)
- 模塊口令(大小:4bytes,屬性:寫)
- 數(shù)據(jù)包大小設(shè)置(大小:1bytes,屬性:讀寫)
- 波特率系數(shù) N 設(shè)置(大小:1bytes,屬性:讀寫)
- 安全等級 level 設(shè)置(大小:1bytes,屬性:讀寫)
- 四、指紋管理系統(tǒng)(程序)
- 1.實驗說明
- 2.實驗器材
- 3.器件接線
- 4.實驗源碼
- demo1-按鍵管理
- demo2-串口指令控制
- 5.實驗效果
- demo1
- demo2
- 五、結(jié)語
一.指紋概念
1.指紋的由來
指紋是人類手指末端指腹上由凹凸的皮膚所形成的紋路,在胎兒第三四個月便開始產(chǎn)生,到六個月左右就形成了。當嬰兒長大成人,指紋也只不過放大增粗,紋樣終生不會發(fā)生改變。指紋能使手在接觸物件時增加摩擦力,從而更容易發(fā)力及抓緊物件,它是人類進化過程中自然形成的。
伸出手,仔細觀察,可以發(fā)現(xiàn)小小的指紋也分三種類型:有同心圓或螺旋紋線,看上去像水中漩渦的,叫斗形紋(whorl);有的紋線是一邊開口的,即像簸箕似的,叫箕形紋(loop);有的紋形像弓一樣,叫弓形紋(arch)。除總體形狀不同之外,各人指紋紋形的多少、長短也不同。
2.指紋的唯一性
由于每個人的遺傳基因均不同,故指紋也不同。然而,指紋的形成雖然主要受到遺傳影響,但是也有環(huán)境因素(5%),當胎兒在母體內(nèi)發(fā)育三至四個月時,指紋就已經(jīng)形成,兒童在成長期間指紋會略有改變,直到青春期14歲左右時才會定型。在皮膚發(fā)育過程中,雖表皮、真皮,以及基質(zhì)層都在共同成長,但柔軟的皮下組織長得比相對堅硬的表皮快。 有人說骨髓移植后指紋會改變,那是不對的。除非是植皮或者深達基底層的損傷,否則指紋是不會變的。
并且它們的復(fù)雜度足以提供用于鑒別的足夠特征。指紋除了具有唯一性外,還具有遺傳性和不變性。尚未發(fā)現(xiàn)有不同的人擁有相同的指紋,所以每個人的指紋也是不一樣的。由于指紋是每個人獨有的標記,近幾百年來,罪犯在犯案現(xiàn)場留下的指紋,均成為警方追捕疑犯的重要線索?,F(xiàn)今鑒別指紋方法已經(jīng)電腦化,使鑒別程序更快更準。
二、指紋檢測
1.獲取方式
光學(xué)識別技術(shù)
借助光學(xué)技術(shù)采集指紋是歷史最久遠、使用最廣泛的技術(shù)。將手指放在光學(xué)鏡片上,手指在內(nèi)置光源照射下,用棱鏡將其投射在電荷耦合器件(CCD) 上,進而形成脊線(指紋圖像中具有一定寬度和走向的紋線)呈黑色、谷線(紋線之間的凹陷部分)呈白色的數(shù)字化的、可被指紋設(shè)備算法處理的多灰度指紋圖像。
溫差感應(yīng)式識別技術(shù)
它的優(yōu)點是可在0.1s內(nèi)獲取指紋圖像,而且傳感器體積和面積最小,即通常所說的滑動式指紋識別儀就是采用該技術(shù)。缺點是:受制于溫度局限,時間一長,手指和芯片就處于相同的溫度了。
半導(dǎo)體硅感技術(shù)(電容式技術(shù))
半導(dǎo)體電容傳感器根據(jù)指紋的嵴和峪與半導(dǎo)體電容感應(yīng)顆粒形成的電容值大小不同,來判斷什么位置是嵴什么位置是峪。其工作過程是通過對每個像素點上的電容感應(yīng)顆粒預(yù)先充電到某一參考電壓。當手指接觸到半導(dǎo)體電容指紋表現(xiàn)上時,因為嵴是凸起、峪是凹下,根據(jù)電容值與距離的關(guān)系,會在嵴和峪的地方形成不同的電容值。然后利用放電電流進行放電。因為嵴和峪對應(yīng)的電容值不同,所以其放電的速度也不同。嵴下的像素(電容量高)放電較慢,而處于峪下的像素(電容量低)放電較快。根據(jù)放電率的不同,可以探測到嵴和峪的位置,從而形成指紋圖像數(shù)據(jù)。
超聲波技術(shù)
超聲波技術(shù)所使用的超聲波頻率為1×104Hz-1×109Hz,能量被控制在對人體無損的程度(與醫(yī)學(xué)診斷的強度相同)。超聲波技術(shù)產(chǎn)品能夠達到最好的精度,它對手指和平面的清潔程度要求較低,但其采集時間會明顯地長于前述兩類產(chǎn)品,而且價格昂貴,也并不能做到活體指紋識別,故使用稀少。
2.指紋識別
指紋識別技術(shù)作為一個新的IT技術(shù)領(lǐng)域,自身具有許多新的概念。了解指紋識別技術(shù)的概念有助于準確的理解指紋識別技術(shù)。
識別系統(tǒng)
指紋識別系統(tǒng)經(jīng)過人工識別到機器識別的發(fā)展之后,進入自動識別階段,稱為自動指紋識別系統(tǒng)(AFIS)。一個典型的自動指紋識別系統(tǒng),包括與人交互的前端子系統(tǒng)――自動指紋采集設(shè)備、完成指紋圖像處理和特征值提取的后臺子系統(tǒng),以及用于指紋庫存儲的數(shù)據(jù)庫子系統(tǒng)。當后臺子系統(tǒng)用于指紋注冊過程時,可以稱為指紋注冊子系統(tǒng)。當它用于指紋辨識過程時,稱為指紋辨識子系統(tǒng)。
注冊匹配
指紋注冊又叫指紋登記。這是從指紋圖像中提取指紋特征值,形成指紋特征值模板,并與人的身份信息結(jié)合起來,存儲在指紋識別系統(tǒng)中的過程。它相當于為指紋報戶口。所以指紋注冊的時候,需要保證指紋與身份信息之間的正確對應(yīng)。尤其對于政府、社團、公司等單位進行指紋注冊時,防止冒名頂替,避免指紋與身份信息關(guān)聯(lián)錯誤,這是非常重要的。因此在這類指紋應(yīng)用中,指紋登記的過程,需要現(xiàn)場督導(dǎo)人員參與。甚至把督導(dǎo)人的指紋采集到系統(tǒng)中,作為注冊者指紋特征值模板的組成部分,以示職責(zé)之重要,并為后續(xù)責(zé)任審計提供依據(jù)。
識別驗證
識別與驗證并不是指紋識別算法領(lǐng)域的問題,而是指紋識別系統(tǒng)的問題。指紋識別是指在1:N模式下匹配指紋特征值。它是從多個指紋模板中識別出一個特定指紋的過程。其結(jié)果是,“有”或者“沒有”。有時會給出“是誰”的信息。
指紋驗證是指在1:1模式下匹配指紋特征值。它是拿待比對的指紋特征模板與事先存在的另一個指紋特征模板進行一次匹配的過程。其結(jié)果是“是不是”。在一個系統(tǒng)中既可以采用1:1模式也可以采用1:N模式,這是取決于應(yīng)用系統(tǒng)的特點和要求。有時候還可以業(yè)務(wù)模式的需要,把1:N模式轉(zhuǎn)化為1:1模式以提高系統(tǒng)安全性和比對速度。
優(yōu)點:
1.指紋是人體不一樣的的特征,并且它們的復(fù)雜度足以提供用于鑒別的足夠特征;
2.如果要增加可靠性,只需登記更多的指紋、鑒別更多的手指,最多可以多達十個,而每一個指紋都是不一樣的;
3.掃描指紋的速度很快,使用非常方便;
4.讀取指紋時,用戶必需將手指與指紋采集頭相互接觸,與指紋采集頭直接;
5.接觸是讀取人體生物特征最可靠的方法;
6.指紋采集頭可以更加小型化,并且價格會更加的低廉;
缺點:
1.某些人或某些群體的指紋特征少,難成像;
2.過去因為在犯罪記錄中使用指紋,使得某些人害怕“將指紋記錄在案”。
3.實際上指紋鑒別技術(shù)都可以不存儲任何含有指紋圖像的數(shù)據(jù),而只是存儲從指紋中得到的加密的指紋特征數(shù)據(jù);
4.每一次使用指紋時都會在指紋采集頭上留下用戶的指紋印痕,而這些指紋痕跡存在被用來復(fù)制指紋的可能性。
三、光學(xué)指紋模塊
1.ATK-AS608 光學(xué)指紋模塊
ATK-AS608 指紋識別模塊是 ALIENTEK 推出的一款高性能的光學(xué)指紋識別模塊。ATK-AS608 模塊采用了國內(nèi)著名指紋識別芯片公司杭州晟元芯片技術(shù)有限公司(Synochip)的 AS608 指紋識別芯片。芯片內(nèi)置 DSP 運算單元,集成了指紋識別算法,能高效快速采集圖像并識別指紋特征。模塊配備了串口、USB 通訊接口,用戶無需研究復(fù)雜的圖像處理及指紋識別算法,只需通過簡單的串口、USB 按照通訊協(xié)議便可控制模塊。本模塊可應(yīng)用于各種考勤機、保險箱柜、指紋門禁系統(tǒng)、指紋鎖等場合。
2.技術(shù)指標
3.硬件接口
模塊接口采用 8 芯 1.25 mm 間距單排插座,PCB 如圖 2.1.1 所示。模塊內(nèi)部內(nèi)置了手指 探測電路,用戶可讀取狀態(tài)引腳(WAK)判斷有無手指按下,模塊接線口如下圖左側(cè)所示。
接著是模塊引腳描述。
還有模塊的實物圖和標配的防呆頭排線,7腳8腳的兩根線有的商家會預(yù)留,有的商家給的排線上抽掉了這兩根線,大概模塊主要還是以串口數(shù)據(jù)收發(fā)為主。
4.系統(tǒng)資源
緩沖區(qū)與指紋庫
系統(tǒng)內(nèi)設(shè)有一個 72K 字節(jié)的圖像緩沖區(qū)與二個 512bytes 大小的特征文件緩沖區(qū),名字 分別稱為:ImageBuffer,CharBuffer1 和 CharBuffer2。用戶可以通過指令讀寫任意一個緩沖區(qū)。 CharBuffer1 或 CharBuffer2 既可以用于存放普通特征文件也可以用于存放模板特征文件。通過 UART 口上傳或下載圖像時為了加快速度,只用到像素字節(jié)的高 4 位,即將兩個像素合 成一個字節(jié)傳送。通過 USB 口則是整 8 位像素。 指紋庫容量根據(jù)掛接的 FLASH 容量不同而改變,系統(tǒng)會自動判別。指紋模板按照序號 存放,序號定義為:0—(N-1)( N 為指紋庫容量)。用戶只能根據(jù)序號訪問指紋庫內(nèi)容。
用戶記事本
系統(tǒng)在 FLASH 中開辟了一個 512 字節(jié)的存儲區(qū)域作為用戶記事本,該記事本邏輯上被 分成 16 頁,每頁 32 字節(jié)。上位機可以通過 PS_WriteNotepad 指令和 PS_ReadNotepad 指令 訪問任意一頁。注意寫記事本某一頁的時候,該頁 32 字節(jié)的內(nèi)容被整體寫入,原來的內(nèi)容 被覆蓋。
隨機數(shù)產(chǎn)生器
系統(tǒng)內(nèi)部集成了硬件 32 位隨機數(shù)生成器(不需要隨機數(shù)種子),用戶可以通過指令讓模 塊產(chǎn)生一個隨機數(shù)并上傳給上位機。
5.軟件開發(fā)指南
模塊地址(大小:4bytes,屬性:讀寫)
模塊的默認地址為0xFFFFFFFF,可通過指令修改,數(shù)據(jù)包的地址域必須與該地址相配, 命令包/數(shù)據(jù)包才被系統(tǒng)接收。注:與上位機通訊必須是默認地址 0xFFFFFFFF!
模塊口令(大小:4bytes,屬性:寫)
系統(tǒng)默認口令為 0,可通過指令修改。若默認口令未被修改,則系統(tǒng)不要求驗證口令, 上位機和 MCU 與芯片通訊;若口令被修改,則上位機與芯片通訊的第一個指令必須是驗證 口令,只有口令驗證通過后,芯片才接收其它指令。注:不建議修改口令!
數(shù)據(jù)包大小設(shè)置(大小:1bytes,屬性:讀寫)
發(fā)送數(shù)據(jù)包和接收數(shù)據(jù)包的長度根據(jù)該值設(shè)定。
波特率系數(shù) N 設(shè)置(大小:1bytes,屬性:讀寫)
USART 波特率=N×9600,N=1~12。
安全等級 level 設(shè)置(大小:1bytes,屬性:讀寫)
系統(tǒng)根據(jù)安全等級設(shè)定比對閥值,level=1~5。安全等級為 1 時認假率最高,拒認率最低。 安全等級為 5 時認假率最低,拒認率最高。
注:以上設(shè)置均可通過指令修改,詳細指令配置請參考 ATK-AS608 指紋識別模塊資料文件 夾中的 AS60x 指紋識別 SOC 通訊手冊 v1.0。
通訊協(xié)議、模塊上位機測試等資料較繁雜就不寫上了,有需要的留意末尾的資源下載分享
四、指紋管理系統(tǒng)(程序)
1.實驗說明
實現(xiàn)一套指紋管理系統(tǒng),對用戶指紋的添加錄入、對模塊指紋庫中的指紋進行擦除、對用戶指紋
進行特征驗證,使用到5個功能按鍵和OLED顯示屏來進行系統(tǒng)管理。
2.實驗器材
- Arduino Mega2560 *1
- AS608光學(xué)指紋模塊 *1
- 0.96寸 12864 OLED顯示屏(IIC) *1
- 輕觸按鍵 *5
- 面包板 *1
- 杜邦線若干
不用多說還有usb線和指紋模塊的通訊排線了,板子博主用的2560,用uno也可。
3.器件接線
直接上圖,面包板的按鍵一端共地,另一端接入數(shù)字引腳2、3、4、5、6;OLED模塊5V供電,另外就是SDA接2560的SDA,SCL接SCL,不是問題
指紋模塊接線單獨發(fā)一張,串口接2560的TX1,RX1,收對發(fā),發(fā)對收
指紋模塊需要3.3V供電,接錯了可能燒壞模塊,這里要注意下,按鍵為了省接線用了面包板,比較推薦使用面包板,1是好分辨按鍵序號,2還是減少接線煩惱跟部分人的強迫癥哈哈哈。
4.實驗源碼
demo1-按鍵管理
在這之前你需要用IDE的庫管理器安裝u8g2 和Adafruit Fingerprint 兩個庫,另外還有OLED顯示中文需要的字庫文件,這個按個人需求自己搞了。
#include "font.h" #include <U8g2lib.h> #include <Adafruit_Fingerprint.h>#define x_coordinate 40#define KEY1 2 #define KEY2 3 #define KEY3 4 #define KEY4 5 #define KEY5 6#define mySerial Serial1 Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);U8G2_SH1106_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 2, /* data=*/ 11, /* reset=*/ U8X8_PIN_NONE);u8 key_num=0;void key_init() {、、、 }u8 key_scan(u8 mode) {、、、 }void Add_FR() {u8 i,ensure,processnum=0;u8 ID_NUM=0;char str2[10];while(1){switch (processnum){case 0:i++;u8g2.clearBuffer(); // 清屏u8g2.drawXBMP(32,24,64,16,State5); /* 字串 請按手指 64x16 */u8g2.sendBuffer();ensure=finger.getImage();if(ensure==FINGERPRINT_OK) {ensure=finger.image2Tz(1); //生成特征if(ensure==FINGERPRINT_OK){u8g2.clearBuffer(); // 清屏u8g2.drawXBMP(32,24,64,16,State6); /* 字串 指紋正常 64x16 */ u8g2.sendBuffer();i=0;processnum=1; //跳到第二步 }else {}; }else {}; break;case 1:i++;u8g2.clearBuffer(); // 清屏u8g2.drawXBMP(32,24,64,16,State7); /* 字串 再按一次 64x16 */u8g2.sendBuffer();ensure=finger.getImage();if(ensure==FINGERPRINT_OK) {ensure=finger.image2Tz(2); //生成特征if(ensure==FINGERPRINT_OK){u8g2.clearBuffer(); // 清屏u8g2.drawXBMP(32,24,64,16,State6); /* 字串 指紋正常 64x16 */u8g2.sendBuffer();i=0;processnum=2; //跳到第三步}else {}; }else {}; break;case 2:u8g2.clearBuffer(); // 清屏u8g2.drawXBMP(32,24,64,16,State8); /* 字串 創(chuàng)建模板 64x16 */ u8g2.sendBuffer();ensure=finger.createModel();if(ensure==FINGERPRINT_OK) {u8g2.clearBuffer(); // 清屏u8g2.drawXBMP(16,24,96,16,State9); /* 字串 模板創(chuàng)建成功 96x16 */ u8g2.sendBuffer();processnum=3; //跳到第四步}else{ u8g2.clearBuffer(); // 清屏u8g2.drawXBMP(16,24,96,16,State10); //顯示字模漢字 u8g2.sendBuffer();i=0;processnum=0; //跳回第一步 }delay(500);break; case 3: u8g2.clearBuffer(); // 清屏u8g2.drawXBMP(1,0,128,48,State11); //顯示字模漢字 u8g2.setFont(u8g2_font_gb16st_t_2); // 選擇字體u8g2.drawStr(40,62,"ID=00"); u8g2.sendBuffer();while(key_num!=3){key_num=key_scan(0);if(key_num==2){key_num=0;if(ID_NUM>0)ID_NUM--;if(ID_NUM<10)sprintf(str2,"ID=0%d",ID_NUM);elsesprintf(str2,"ID=%d",ID_NUM);u8g2.drawStr(40,62,str2);u8g2.sendBuffer();}if(key_num==4){key_num=0;if(ID_NUM<99)ID_NUM++;if(ID_NUM<10)sprintf(str2,"ID=0%d",ID_NUM);elsesprintf(str2,"ID=%d",ID_NUM);u8g2.drawStr(40,62,str2);u8g2.sendBuffer();}}key_num=0;ensure=finger.storeModel(ID_NUM); //儲存模板if(ensure==0x00) { u8g2.clearBuffer(); // 清屏u8g2.drawXBMP(16,24,96,16,State12); //顯示字模漢字 u8g2.sendBuffer();delay(1500);return ;}else {processnum=0;} break; }delay(400);if(i==10) //超過5次沒有按手指則退出{break; }} }void Press_FR() {、、、 }void Del_FR() {、、、 }void setup() {// put your setup code here, to run once:key_init();u8g2.begin();finger.begin(57600);u8g2.clearBuffer(); // 清屏u8g2.setFont(u8g2_font_gb16st_t_2); // 選擇字體u8g2.drawXBMP(1,0,128,16,State1); //顯示字模漢字 /* 指紋模塊測試程序 128x16 */u8g2.drawXBMP(40,16,64,16,State2); u8g2.drawXBMP(40,32,64,16,State3); u8g2.drawXBMP(40,48,64,16,State4);u8g2.drawStr(22,30,"K1"); // write something to the internal memoryu8g2.drawStr(22,46,"K3"); // write something to the internal memoryu8g2.drawStr(22,62,"K5"); // write something to the internal memoryu8g2.sendBuffer(); // 發(fā)送顯示}void loop() {key_num = key_scan(0);if(key_num == 1){key_num = 0;Add_FR();u8g2.clearBuffer(); // 清屏u8g2.setFont(u8g2_font_gb16st_t_2); // 選擇字體u8g2.drawXBMP(1,0,128,16,State1); //顯示字模漢字 /* 指紋模塊測試程序 128x16 */u8g2.drawXBMP(40,16,64,16,State2); u8g2.drawXBMP(40,32,64,16,State3); u8g2.drawXBMP(40,48,64,16,State4);u8g2.drawStr(22,30,"K1"); // write something to the internal memoryu8g2.drawStr(22,46,"K3"); // write something to the internal memoryu8g2.drawStr(22,62,"K5"); // write something to the internal memoryu8g2.sendBuffer(); // 發(fā)送顯示}if(key_num == 3){key_num = 0;Del_FR();u8g2.clearBuffer(); // 清屏u8g2.setFont(u8g2_font_gb16st_t_2); // 選擇字體u8g2.drawXBMP(1,0,128,16,State1); //顯示字模漢字 /* 指紋模塊測試程序 128x16 */u8g2.drawXBMP(40,16,64,16,State2); u8g2.drawXBMP(40,32,64,16,State3); u8g2.drawXBMP(40,48,64,16,State4);u8g2.drawStr(22,30,"K1"); // write something to the internal memoryu8g2.drawStr(22,46,"K3"); // write something to the internal memoryu8g2.drawStr(22,62,"K5"); // write something to the internal memoryu8g2.sendBuffer(); // 發(fā)送顯示}if(key_num == 5){key_num = 0;Press_FR();u8g2.clearBuffer(); // 清屏u8g2.setFont(u8g2_font_gb16st_t_2); // 選擇字體u8g2.drawXBMP(1,0,128,16,State1); //顯示字模漢字 /* 指紋模塊測試程序 128x16 */u8g2.drawXBMP(40,16,64,16,State2); u8g2.drawXBMP(40,32,64,16,State3); u8g2.drawXBMP(40,48,64,16,State4);u8g2.drawStr(22,30,"K1"); // write something to the internal memoryu8g2.drawStr(22,46,"K3"); // write something to the internal memoryu8g2.drawStr(22,62,"K5"); // write something to the internal memoryu8g2.sendBuffer(); // 發(fā)送顯示} }源碼部分過長,僅展示指紋添加部分(進行兩次的指紋輸入,生成特征,創(chuàng)建模板,再選擇指紋ID號保存至模塊的指紋庫中),指紋驗證和刪除部分省略了,OLED顯示語句占了將近一半,完整源碼跟字庫文件可留意末尾資源下載分享
demo2-串口指令控制
將OLED的操作提示換成串口提示,當然只能是英文輸出啦,而且簡略了選擇ID保存等操作,可以實現(xiàn)指紋添加和驗證操作。
#include <Adafruit_Fingerprint.h>//需要添加Adafruit_Fingerprint 庫#define mySerial Serial1 Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);char user_order = ' '; //存儲用戶輸入的串口指令 u8 ID_NUM = 0; //存儲添加的指紋IDvoid Add_FR() { u8 i = 0,ensure,processnum=0;Serial.println("---------------------------");while(1){switch (processnum){case 0:i++;//請按手指Serial.println("Please Press...");ensure=finger.getImage();if(ensure==FINGERPRINT_OK) {ensure=finger.image2Tz(1); //生成特征if(ensure==FINGERPRINT_OK){//指紋正常Serial.println("Press OK"); i=0;processnum=1; //跳到第二步 }else {}; }else {}; break;case 1:i++;//再按一次Serial.println("Please Press Again...");ensure=finger.getImage();if(ensure==FINGERPRINT_OK) {ensure=finger.image2Tz(2); //生成特征if(ensure==FINGERPRINT_OK){//指紋正常Serial.println("Press Again OK");i=0;processnum=2; //跳到第三步}else {}; }else {}; break;case 2:// 創(chuàng)建模板Serial.print("Finger Create...");ensure=finger.createModel();if(ensure==FINGERPRINT_OK) {Serial.println("Success");processnum=3; //跳到第四步}else{ //創(chuàng)建模板失敗Serial.println("Fail");i=0;processnum=0; //跳回第一步 }delay(500);break; case 3: //寫入指紋IDID_NUM++;ensure=finger.storeModel(ID_NUM); //儲存模板if(ensure==0x00) { //錄入指紋成功 ID打印Serial.print("Add Fingerprint Success --- ");if((ID_NUM>0) && (ID_NUM<10))Serial.print("ID = 0");if(ID_NUM >= 10)Serial.print("ID = ");Serial.println(ID_NUM);Serial.println(" ");delay(1500);return ;}else {processnum=0;} break; }delay(400);if(i==10) //超過5次沒有按手指則退出{Serial.println("Timeout !!!");break; }} }void Press_FR() {u8 ensure,i,j = 0;//請按手指Serial.println("---------------------------");Serial.print("Please Press Fingerprint...");for(i=0;i<15;i++){ensure=finger.getImage();if(ensure==0x00) //獲取圖像成功 { ensure=finger.image2Tz();if(ensure==0x00) //生成特征成功{ ensure=finger.fingerFastSearch();if(ensure==0x00) //搜索成功{ //指紋驗證成功Serial.println(" "); Serial.println("Fingerprint verification successful !!!");if((0 < finger.fingerID)&&(finger.fingerID < 10))Serial.print("Welcome ID : 0");if(finger.fingerID >= 10)Serial.print("Welcome ID : ");Serial.println(finger.fingerID); Serial.println(" ");j = 0;delay(2000);break;}else {//未搜索到指紋 Serial.println(" ");Serial.println("!!! Fingerprint not found !!!");Serial.println(" ");delay(2000);break;} }else{}}j++;delay(200);if(j >= 15){//等待超時Serial.println("Timeout !!!");Serial.println(" ");} } }void setup() {finger.begin(57600); //設(shè)置指紋模塊串口波特率57600Serial.begin(115200); //設(shè)置串口波特率115200while(finger.emptyDatabase()); //清空AS608指紋庫Serial.println("AS608 is Ready............");Serial.println(" ");Serial.println("Input 'a' to Add Fingerprint | Input 'b' to Press Fingerprint"); }void loop() {//串口指令讀取if(Serial.available())user_order = Serial.read();//串口收到字符a,執(zhí)行指紋添加操作if(user_order == 'a'){Add_FR(); //調(diào)用Add_FR函數(shù)user_order = ' '; //清空user_order指令Serial.println("Input 'a' to Add Fingerprint | Input 'b' to Press Fingerprint");}//串口收到指紋b,執(zhí)行指紋驗證操作if(user_order == 'b'){Press_FR(); //調(diào)用Press_FR函數(shù)user_order = ' '; //清空user_order指令Serial.println("Input 'a' to Add Fingerprint | Input 'b' to Press Fingerprint");} }串口操作的源碼是完整的,只需要Adafruit Fingerprint的庫
5.實驗效果
demo1
正確接線后,燒寫程序,稍作等待,可以看到OLED屏幕顯示指紋模塊測試程序,并指引了K1按鍵添加指紋,K3按鍵刪除指紋,K5按鍵驗證指紋。
指紋添加步驟稍微多,直接把顯示步驟做成九宮格,差點出來了密集恐懼癥,,,
指紋添加步驟具體如下:
按K3進行指紋刪除,如圖所示,按K2K4進行要刪除的ID號選擇,最后按K3確定刪除,或者狠一點直接按K5清除整個指紋庫。
指紋刪除步驟具體如下:
- A1.選擇需要刪除的ID號(K2 ID號-1,K4 ID號+1)
- A2.選擇了要刪除的ID號01,按下K3確認刪除
- A3.ID號01刪除成功
- B.在A1的步驟時按下K5,清除整個指紋庫
按K5進行指紋驗證,在提示按下手指時按住指紋模塊,等待驗證成功并給出指紋ID號,Score是按下的指紋跟指紋庫中對應(yīng)的2號指紋的對比度,當然按下的指紋如果在指紋庫中找不到相同特征的指紋ID,將提示“為搜索到指紋”
demo2
上傳程序后打開IDE的串口監(jiān)視器,能看到程序初始化后的操作提示,輸入字符'a' 進行指紋添加,輸入字符 'b' 進行指紋驗證(硬件連接只需要接好指紋模塊的線,這里不展示)
串口輸入 字符'a' ,看到提示“Please Press”要求按指紋
如果在限定時間內(nèi)沒手指按下的操作,程序?qū)⑼顺龅匠跏紶顟B(tài)(繼續(xù)檢測串口指令字符'a' 或'b' )
在指紋添加操作時,從指紋模塊掃描口按下手指,根據(jù)串口提示進行兩次指紋按壓操作,直到提示指紋添加成功,并獲得指紋ID。
隨后錄入的指紋ID號將以疊加的方式的方式分配(像02、03、04…)。
指紋添加成功后將返回繼續(xù)等待串口指令;這時候在監(jiān)視器發(fā)送框輸入b,進行指紋驗證操作。
同樣一定時間內(nèi)模塊沒有指紋輸入,將檢測超時返回初始狀態(tài)等待串口指令
當檢測到輸入的指紋特征在模塊指紋庫中沒有記錄時,會提示指紋沒有找到
當檢測到輸入的指紋特征能在指紋庫有對比的模板時,顯示其對應(yīng)ID號,隨后繼續(xù)回到主界面
五、結(jié)語
指紋檢測模塊在生活中越來越常見,甚至還出現(xiàn)了活體指紋檢測的設(shè)備,即活人的指紋按下才有效,盜取的指紋或者kan下來的手指去檢測都是無效的。上面提供的兩個demo在做實驗的時候都比較實用,各有所長,條件有限的不一定要OLED的
來了來了,你們要的例程資源,包含模塊用戶手冊,數(shù)據(jù)手冊,Arduino例程源碼(demo1的),AS608模塊的上位機和上位機操作視頻,夠豐富吧,有需要32例程跟51例程的評論區(qū)留言,有空就補上資源鏈接
Arduino指紋案例跳轉(zhuǎn)鏈接 — 點我點我點我
哦,對了,指紋在掃描錄入或者驗證時都是對比的指紋特征,那什么是指紋的特征呢,你可能還不清楚,上一張圖給瞅瞅,就能了解個大概了,剩下的找度娘去
總結(jié)
以上是生活随笔為你收集整理的Arduino案例实操 -- AS608光学指纹模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C4D 入门笔记(二)
- 下一篇: 马尔科夫状态转移矩阵