日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Arduino案例实操 -- AS608光学指纹模块

發布時間:2024/3/26 编程问答 72 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Arduino案例实操 -- AS608光学指纹模块 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

指紋,也叫手印,即是表皮上突起的紋線。由于人的指紋是遺傳與環境共同作用產生的,因而指紋人人皆有,卻各不相同。由于指紋重復率極小,大約150億分之一,故其稱為“人體身份證”。

目錄指引

      • 一.指紋概念
        • 1.指紋的由來
        • 2.指紋的唯一性
      • 二、指紋檢測
        • 1.獲取方式
        • 2.指紋識別
          • 優點:
          • 缺點:
      • 三、光學指紋模塊
        • 1.ATK-AS608 光學指紋模塊
        • 2.技術指標
        • 3.硬件接口
        • 4.系統資源
          • 緩沖區與指紋庫
          • 用戶記事本
          • 隨機數產生器
        • 5.軟件開發指南
          • 模塊地址(大小:4bytes,屬性:讀寫)
          • 模塊口令(大小:4bytes,屬性:寫)
          • 數據包大小設置(大小:1bytes,屬性:讀寫)
          • 波特率系數 N 設置(大小:1bytes,屬性:讀寫)
          • 安全等級 level 設置(大小:1bytes,屬性:讀寫)
      • 四、指紋管理系統(程序)
        • 1.實驗說明
        • 2.實驗器材
        • 3.器件接線
        • 4.實驗源碼
          • demo1-按鍵管理
          • demo2-串口指令控制
        • 5.實驗效果
          • demo1
          • demo2
        • 五、結語


一.指紋概念

1.指紋的由來

指紋是人類手指末端指腹上由凹凸的皮膚所形成的紋路,在胎兒第三四個月便開始產生,到六個月左右就形成了。當嬰兒長大成人,指紋也只不過放大增粗,紋樣終生不會發生改變。指紋能使手在接觸物件時增加摩擦力,從而更容易發力及抓緊物件,它是人類進化過程中自然形成的。
伸出手,仔細觀察,可以發現小小的指紋也分三種類型:有同心圓或螺旋紋線,看上去像水中漩渦的,叫斗形紋(whorl);有的紋線是一邊開口的,即像簸箕似的,叫箕形紋(loop);有的紋形像弓一樣,叫弓形紋(arch)。除總體形狀不同之外,各人指紋紋形的多少、長短也不同。

2.指紋的唯一性

由于每個人的遺傳基因均不同,故指紋也不同。然而,指紋的形成雖然主要受到遺傳影響,但是也有環境因素(5%),當胎兒在母體內發育三至四個月時,指紋就已經形成,兒童在成長期間指紋會略有改變,直到青春期14歲左右時才會定型。在皮膚發育過程中,雖表皮、真皮,以及基質層都在共同成長,但柔軟的皮下組織長得比相對堅硬的表皮快。 有人說骨髓移植后指紋會改變,那是不對的。除非是植皮或者深達基底層的損傷,否則指紋是不會變的。
并且它們的復雜度足以提供用于鑒別的足夠特征。指紋除了具有唯一性外,還具有遺傳性和不變性。尚未發現有不同的人擁有相同的指紋,所以每個人的指紋也是不一樣的。由于指紋是每個人獨有的標記,近幾百年來,罪犯在犯案現場留下的指紋,均成為警方追捕疑犯的重要線索。現今鑒別指紋方法已經電腦化,使鑒別程序更快更準。

二、指紋檢測

1.獲取方式

光學識別技術
借助光學技術采集指紋是歷史最久遠、使用最廣泛的技術。將手指放在光學鏡片上,手指在內置光源照射下,用棱鏡將其投射在電荷耦合器件(CCD) 上,進而形成脊線(指紋圖像中具有一定寬度和走向的紋線)呈黑色、谷線(紋線之間的凹陷部分)呈白色的數字化的、可被指紋設備算法處理的多灰度指紋圖像。
溫差感應式識別技術
它的優點是可在0.1s內獲取指紋圖像,而且傳感器體積和面積最小,即通常所說的滑動式指紋識別儀就是采用該技術。缺點是:受制于溫度局限,時間一長,手指和芯片就處于相同的溫度了。
半導體硅感技術(電容式技術)
半導體電容傳感器根據指紋的嵴和峪與半導體電容感應顆粒形成的電容值大小不同,來判斷什么位置是嵴什么位置是峪。其工作過程是通過對每個像素點上的電容感應顆粒預先充電到某一參考電壓。當手指接觸到半導體電容指紋表現上時,因為嵴是凸起、峪是凹下,根據電容值與距離的關系,會在嵴和峪的地方形成不同的電容值。然后利用放電電流進行放電。因為嵴和峪對應的電容值不同,所以其放電的速度也不同。嵴下的像素(電容量高)放電較慢,而處于峪下的像素(電容量低)放電較快。根據放電率的不同,可以探測到嵴和峪的位置,從而形成指紋圖像數據。
超聲波技術
超聲波技術所使用的超聲波頻率為1×104Hz-1×109Hz,能量被控制在對人體無損的程度(與醫學診斷的強度相同)。超聲波技術產品能夠達到最好的精度,它對手指和平面的清潔程度要求較低,但其采集時間會明顯地長于前述兩類產品,而且價格昂貴,也并不能做到活體指紋識別,故使用稀少。

2.指紋識別

指紋識別技術作為一個新的IT技術領域,自身具有許多新的概念。了解指紋識別技術的概念有助于準確的理解指紋識別技術。
識別系統
指紋識別系統經過人工識別到機器識別的發展之后,進入自動識別階段,稱為自動指紋識別系統(AFIS)。一個典型的自動指紋識別系統,包括與人交互的前端子系統――自動指紋采集設備、完成指紋圖像處理和特征值提取的后臺子系統,以及用于指紋庫存儲的數據庫子系統。當后臺子系統用于指紋注冊過程時,可以稱為指紋注冊子系統。當它用于指紋辨識過程時,稱為指紋辨識子系統。
注冊匹配
指紋注冊又叫指紋登記。這是從指紋圖像中提取指紋特征值,形成指紋特征值模板,并與人的身份信息結合起來,存儲在指紋識別系統中的過程。它相當于為指紋報戶口。所以指紋注冊的時候,需要保證指紋與身份信息之間的正確對應。尤其對于政府、社團、公司等單位進行指紋注冊時,防止冒名頂替,避免指紋與身份信息關聯錯誤,這是非常重要的。因此在這類指紋應用中,指紋登記的過程,需要現場督導人員參與。甚至把督導人的指紋采集到系統中,作為注冊者指紋特征值模板的組成部分,以示職責之重要,并為后續責任審計提供依據。
識別驗證
識別與驗證并不是指紋識別算法領域的問題,而是指紋識別系統的問題。指紋識別是指在1:N模式下匹配指紋特征值。它是從多個指紋模板中識別出一個特定指紋的過程。其結果是,“有”或者“沒有”。有時會給出“是誰”的信息。
指紋驗證是指在1:1模式下匹配指紋特征值。它是拿待比對的指紋特征模板與事先存在的另一個指紋特征模板進行一次匹配的過程。其結果是“是不是”。在一個系統中既可以采用1:1模式也可以采用1:N模式,這是取決于應用系統的特點和要求。有時候還可以業務模式的需要,把1:N模式轉化為1:1模式以提高系統安全性和比對速度。

優點:

1.指紋是人體不一樣的的特征,并且它們的復雜度足以提供用于鑒別的足夠特征;
2.如果要增加可靠性,只需登記更多的指紋、鑒別更多的手指,最多可以多達十個,而每一個指紋都是不一樣的;
3.掃描指紋的速度很快,使用非常方便;
4.讀取指紋時,用戶必需將手指與指紋采集頭相互接觸,與指紋采集頭直接;
5.接觸是讀取人體生物特征最可靠的方法;
6.指紋采集頭可以更加小型化,并且價格會更加的低廉;

缺點:

1.某些人或某些群體的指紋特征少,難成像;
2.過去因為在犯罪記錄中使用指紋,使得某些人害怕“將指紋記錄在案”。
3.實際上指紋鑒別技術都可以不存儲任何含有指紋圖像的數據,而只是存儲從指紋中得到的加密的指紋特征數據;
4.每一次使用指紋時都會在指紋采集頭上留下用戶的指紋印痕,而這些指紋痕跡存在被用來復制指紋的可能性。

三、光學指紋模塊

1.ATK-AS608 光學指紋模塊

ATK-AS608 指紋識別模塊是 ALIENTEK 推出的一款高性能的光學指紋識別模塊。ATK-AS608 模塊采用了國內著名指紋識別芯片公司杭州晟元芯片技術有限公司(Synochip)的 AS608 指紋識別芯片。芯片內置 DSP 運算單元,集成了指紋識別算法,能高效快速采集圖像并識別指紋特征。模塊配備了串口、USB 通訊接口,用戶無需研究復雜的圖像處理及指紋識別算法,只需通過簡單的串口、USB 按照通訊協議便可控制模塊。本模塊可應用于各種考勤機、保險箱柜、指紋門禁系統、指紋鎖等場合。

2.技術指標

3.硬件接口

模塊接口采用 8 芯 1.25 mm 間距單排插座,PCB 如圖 2.1.1 所示。模塊內部內置了手指 探測電路,用戶可讀取狀態引腳(WAK)判斷有無手指按下,模塊接線口如下圖左側所示。

接著是模塊引腳描述。

還有模塊的實物圖和標配的防呆頭排線,7腳8腳的兩根線有的商家會預留,有的商家給的排線上抽掉了這兩根線,大概模塊主要還是以串口數據收發為主。

4.系統資源

緩沖區與指紋庫

系統內設有一個 72K 字節的圖像緩沖區與二個 512bytes 大小的特征文件緩沖區,名字 分別稱為:ImageBuffer,CharBuffer1 和 CharBuffer2。用戶可以通過指令讀寫任意一個緩沖區。 CharBuffer1 或 CharBuffer2 既可以用于存放普通特征文件也可以用于存放模板特征文件。通過 UART 口上傳或下載圖像時為了加快速度,只用到像素字節的高 4 位,即將兩個像素合 成一個字節傳送。通過 USB 口則是整 8 位像素。 指紋庫容量根據掛接的 FLASH 容量不同而改變,系統會自動判別。指紋模板按照序號 存放,序號定義為:0—(N-1)( N 為指紋庫容量)。用戶只能根據序號訪問指紋庫內容。

用戶記事本

系統在 FLASH 中開辟了一個 512 字節的存儲區域作為用戶記事本,該記事本邏輯上被 分成 16 頁,每頁 32 字節。上位機可以通過 PS_WriteNotepad 指令和 PS_ReadNotepad 指令 訪問任意一頁。注意寫記事本某一頁的時候,該頁 32 字節的內容被整體寫入,原來的內容 被覆蓋。

隨機數產生器

系統內部集成了硬件 32 位隨機數生成器(不需要隨機數種子),用戶可以通過指令讓模 塊產生一個隨機數并上傳給上位機。

5.軟件開發指南

模塊地址(大小:4bytes,屬性:讀寫)

模塊的默認地址為0xFFFFFFFF,可通過指令修改,數據包的地址域必須與該地址相配, 命令包/數據包才被系統接收。注:與上位機通訊必須是默認地址 0xFFFFFFFF!

模塊口令(大小:4bytes,屬性:寫)

系統默認口令為 0,可通過指令修改。若默認口令未被修改,則系統不要求驗證口令, 上位機和 MCU 與芯片通訊;若口令被修改,則上位機與芯片通訊的第一個指令必須是驗證 口令,只有口令驗證通過后,芯片才接收其它指令。注:不建議修改口令!

數據包大小設置(大小:1bytes,屬性:讀寫)

發送數據包和接收數據包的長度根據該值設定。

波特率系數 N 設置(大小:1bytes,屬性:讀寫)

USART 波特率=N×9600,N=1~12。

安全等級 level 設置(大小:1bytes,屬性:讀寫)

系統根據安全等級設定比對閥值,level=1~5。安全等級為 1 時認假率最高,拒認率最低。 安全等級為 5 時認假率最低,拒認率最高。
注:以上設置均可通過指令修改,詳細指令配置請參考 ATK-AS608 指紋識別模塊資料文件 夾中的 AS60x 指紋識別 SOC 通訊手冊 v1.0。
通訊協議、模塊上位機測試等資料較繁雜就不寫上了,有需要的留意末尾的資源下載分享

四、指紋管理系統(程序)

1.實驗說明

實現一套指紋管理系統,對用戶指紋的添加錄入、對模塊指紋庫中的指紋進行擦除、對用戶指紋
進行特征驗證,使用到5個功能按鍵和OLED顯示屏來進行系統管理。

2.實驗器材

  • Arduino Mega2560 *1
  • AS608光學指紋模塊 *1
  • 0.96寸 12864 OLED顯示屏(IIC) *1
  • 輕觸按鍵 *5
  • 面包板 *1
  • 杜邦線若干

不用多說還有usb線和指紋模塊的通訊排線了,板子博主用的2560,用uno也可。

3.器件接線

直接上圖,面包板的按鍵一端共地,另一端接入數字引腳2、3、4、5、6;OLED模塊5V供電,另外就是SDA接2560的SDA,SCL接SCL,不是問題

指紋模塊接線單獨發一張,串口接2560的TX1,RX1,收對發,發對收

指紋模塊需要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); /* 字串 創建模板 64x16 */ u8g2.sendBuffer();ensure=finger.createModel();if(ensure==FINGERPRINT_OK) {u8g2.clearBuffer(); // 清屏u8g2.drawXBMP(16,24,96,16,State9); /* 字串 模板創建成功 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(); // 發送顯示}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(); // 發送顯示}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(); // 發送顯示}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(); // 發送顯示} }

源碼部分過長,僅展示指紋添加部分(進行兩次的指紋輸入,生成特征,創建模板,再選擇指紋ID號保存至模塊的指紋庫中),指紋驗證和刪除部分省略了,OLED顯示語句占了將近一半,完整源碼跟字庫文件可留意末尾資源下載分享

demo2-串口指令控制

將OLED的操作提示換成串口提示,當然只能是英文輸出啦,而且簡略了選擇ID保存等操作,可以實現指紋添加和驗證操作。

#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:// 創建模板Serial.print("Finger Create...");ensure=finger.createModel();if(ensure==FINGERPRINT_OK) {Serial.println("Success");processnum=3; //跳到第四步}else{ //創建模板失敗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); //設置指紋模塊串口波特率57600Serial.begin(115200); //設置串口波特率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,執行指紋添加操作if(user_order == 'a'){Add_FR(); //調用Add_FR函數user_order = ' '; //清空user_order指令Serial.println("Input 'a' to Add Fingerprint | Input 'b' to Press Fingerprint");}//串口收到指紋b,執行指紋驗證操作if(user_order == 'b'){Press_FR(); //調用Press_FR函數user_order = ' '; //清空user_order指令Serial.println("Input 'a' to Add Fingerprint | Input 'b' to Press Fingerprint");} }

串口操作的源碼是完整的,只需要Adafruit Fingerprint的庫

5.實驗效果

demo1

正確接線后,燒寫程序,稍作等待,可以看到OLED屏幕顯示指紋模塊測試程序,并指引了K1按鍵添加指紋,K3按鍵刪除指紋,K5按鍵驗證指紋。

指紋添加步驟稍微多,直接把顯示步驟做成九宮格,差點出來了密集恐懼癥,,,

指紋添加步驟具體如下:

  • 按一次指紋
  • 指紋讀取成功
  • 再按一次指紋
  • 指紋二次讀取成功
  • 創建指紋模板
  • 模板創建成功
  • 選擇指紋ID號(按K4 ID號+1,按K2 ID號-1)
  • 確定要保存的ID號,按K3保存
  • 指紋成功錄入模塊指紋庫
  • 按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是按下的指紋跟指紋庫中對應的2號指紋的對比度,當然按下的指紋如果在指紋庫中找不到相同特征的指紋ID,將提示“為搜索到指紋”

    demo2

    上傳程序后打開IDE的串口監視器,能看到程序初始化后的操作提示,輸入字符'a' 進行指紋添加,輸入字符 'b' 進行指紋驗證(硬件連接只需要接好指紋模塊的線,這里不展示)

    串口輸入 字符'a' ,看到提示“Please Press”要求按指紋

    如果在限定時間內沒手指按下的操作,程序將退出到初始狀態(繼續檢測串口指令字符'a' 或'b' )

    在指紋添加操作時,從指紋模塊掃描口按下手指,根據串口提示進行兩次指紋按壓操作,直到提示指紋添加成功,并獲得指紋ID。

    隨后錄入的指紋ID號將以疊加的方式的方式分配(像02、03、04…)。
    指紋添加成功后將返回繼續等待串口指令;這時候在監視器發送框輸入b,進行指紋驗證操作。

    同樣一定時間內模塊沒有指紋輸入,將檢測超時返回初始狀態等待串口指令

    當檢測到輸入的指紋特征在模塊指紋庫中沒有記錄時,會提示指紋沒有找到

    當檢測到輸入的指紋特征能在指紋庫有對比的模板時,顯示其對應ID號,隨后繼續回到主界面

    五、結語

    指紋檢測模塊在生活中越來越常見,甚至還出現了活體指紋檢測的設備,即活人的指紋按下才有效,盜取的指紋或者kan下來的手指去檢測都是無效的。上面提供的兩個demo在做實驗的時候都比較實用,各有所長,條件有限的不一定要OLED的


    來了來了,你們要的例程資源,包含模塊用戶手冊,數據手冊,Arduino例程源碼(demo1的),AS608模塊的上位機和上位機操作視頻,夠豐富吧,有需要32例程跟51例程的評論區留言,有空就補上資源鏈接
    Arduino指紋案例跳轉鏈接 — 點我點我點我


    哦,對了,指紋在掃描錄入或者驗證時都是對比的指紋特征,那什么是指紋的特征呢,你可能還不清楚,上一張圖給瞅瞅,就能了解個大概了,剩下的找度娘去

    總結

    以上是生活随笔為你收集整理的Arduino案例实操 -- AS608光学指纹模块的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。