現在大部分汽車都配備了無鑰匙進入和一鍵式點火系統,您只需將鑰匙放在口袋里,只需將手指放在門把手上的電容式傳感器上即可打開車門。在此項目中,我們通過使用 RFID 和指紋傳感器為該系統添加了更多安全功能。RFID 傳感器將驗證用戶的許可證,指紋傳感器僅允許授權人員進入車輛。
對于這個基于指紋的汽車點火系統,我們使用帶有 R305 指紋傳感器和 EM18 RFID 閱讀器的 Arduino。
使用的材料
Arduino納米
R305 指紋傳感器
EM18 RFID閱讀器
16*2 字母數字液晶屏
直流電機
L293D電機驅動IC
Veroboard 或面包板(無論哪個可用)
連接線
12V直流電池
EM18 RFID閱讀器模塊
RFID代表射頻識別。它指的是一種技術,其中數字數據被編碼在 RFID 標簽中,并且可以由 RFID 閱讀器使用無線電波對其進行解碼。RFID 類似于條形碼,其中來自標簽的數據由設備解碼。RFID技術用于各種應用,如安全系統、員工考勤系統、 RFID門鎖、基于RFID的投票機、收費系統等。
EM18 Reader是一個可以讀取存儲在RFID標簽中的ID信息的模塊。RFID 標簽存儲一個 12 位唯一編號,當標簽進入讀取器的范圍內時,該編號可由 EM18 讀取器模塊解碼。該模塊以 125 kHz 的頻率運行,具有內置天線,并使用 5 伏直流電源供電。
它提供串行數據輸出,范圍為 8-12 厘米。串行通信參數為 8 個數據位、1 個停止位和 9600 波特率。
EM18 特點:
工作電壓:+4.5V 至 +5.5V DC
電流消耗:50mA
工作頻率:125KHZ
工作溫度:0-80℃
通訊波特率:9600
閱讀距離:8-12厘米
天線:內置
EM18 引腳排列:
引腳說明:
VCC:4.5-5V直流電壓輸入
GND:接地引腳
蜂鳴器:蜂鳴器或 LED 引腳
TX:EM18 串行數據發送引腳,用于 RS232(輸出)
SEL:使用 RS232 必須為 HIGH(如果使用 WEIGAND,則為 LOW)
數據0:WEIGAND數據0
數據 1:WEIGAND 數據 1
要了解有關 RFID 和標簽的更多信息,請查看我們以前 基于 RFID 的項目。
使用 Arduino 找出 RFID 標簽唯一的 12 位代碼
在為Arduino 汽車點火系統編程 Arduino 之前,首先,我們需要找出 12 位 RFID 標簽的唯一代碼。正如我們之前所討論的,RFID 標簽包含一個 12 位的唯一代碼,可以使用 RFID 閱讀器對其進行解碼。當我們在閱讀器附近刷RFID標簽時,閱讀器將通過輸出串口給出唯一代碼。首先,根據電路圖將 Arduino 連接到 RFID 閱讀器,然后將以下給定代碼上傳到 Arduino。
整數計數 = 0;
?
char card_no[12]; 無效設置() { 序列號.開始(9600); } 無效循環() { 如果(串行。可用()) { 計數 = 0; 而(Serial.available() && 計數 < 12) { card_no[count] = Serial.read(); 計數++; 延遲(5); } 序列號.print(card_no); } }
?
成功上傳代碼后,打開串口監視器,將波特率設置為9600。然后在讀卡器附近刷卡。然后 12 位代碼將開始顯示在串行監視器上。對所有使用過的 RFID 標簽執行此過程,并記下它以供將來參考。
電路原理圖
該基于指紋的點火系統的電路圖如下所示:
就我而言,我已將完整的電路焊接在 perf 板上,如下所示:
指紋傳感器模塊
指紋傳感器模塊或指紋掃描儀 是一個模塊,它捕獲指紋圖像,然后將其轉換為等效模板,并由 Arduino 將它們保存到其內存中的選定 ID(位置)上。在這里,所有過程都由 Arduino 控制,例如拍攝指紋圖像、將其轉換為模板、存儲位置等。
我們之前使用相同的 R305 傳感器構建了投票機、考勤系統、安全系統等。您可以在此處查看所有基于指紋的項目。
將指紋注冊到傳感器:
在繼續程序之前,我們需要安裝指紋傳感器所需的庫。在這里,我們使用“ Adafruit_Fingerprint.h ”來使用 R305 指紋傳感器。所以首先使用下面給出的鏈接下載庫:
Adafruit 指紋傳感器庫
成功下載后,在 Arduino IDE 中,轉到文件》 工具 》 包含庫 》 添加 .zip 庫,然后選擇 zip 文件位置以安裝庫。
成功安裝庫后,請按照以下步驟在傳感器內存中注冊新指紋。
1.在 Arduino IDE 中,轉到文件》示例》 Adafruit 指紋 傳感器 庫》注冊。
2.將代碼上傳到Arduino,打開串口監視器,波特率為9600。
重要提示:將程序中的軟件串行引腳更改為 SoftwareSerial mySerial(12, 11)。
3.您應該輸入要存儲指紋的指紋 ID。因為這是我的第一個指紋,所以我在左上角輸入 1,然后單擊發送按鈕。
4.然后指紋傳感器上的燈會閃爍,表示您應該將手指放在傳感器上,然后按照串行監視器上顯示的步驟操作,直到它確認您成功注冊。
RFID無鑰匙點火編程
此生物識別點火系統的完整代碼在本教程的末尾給出。在這里,我們將解釋代碼的幾個重要部分。
首先是包含所有必需的庫。在我的例子中,我包含了“?Adafruit_Fingerprint.h?”用于使用 R305 指紋傳感器。然后配置將連接指紋傳感器的串行端口。就我而言,我已將 12 聲明為 RX 引腳,將 11 聲明為 TX 引腳。
?
#include#include SoftwareSerial mySerial(12,11); Adafruit_Fingerprint 手指 = Adafruit_Fingerprint(&mySerial);
?
在下一步中,聲明將在整個代碼中使用的所有變量。然后用 Arduino 定義 LCD 連接引腳,然后聲明LiquidCrystal類的對象。
?
字符輸入[12]; 整數計數 = 0; 整數a = 0; const int rs = 6, en = 7, d4 = 2, d5 = 3, d6 = 4, d7 = 5; LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
?
接下來,在loop() 中,編寫代碼以獲取 RFID 標簽的唯一 12 位代碼,并將它們存儲在一個數組中。在這里,數組的元素將與內存中存儲的唯一代碼進行匹配,以獲取經過身份驗證的人員詳細信息。
?
計數 = 0; while (Serial.available() && count < 12) { input[count] = Serial.read(); 計數++; 延遲(5); }
?
然后,將接收到的數組與存儲的標簽代碼進行比較。如果代碼匹配,那么許可證被認為是有效的,這允許用戶放置有效的指紋。否則,它將顯示無效的許可證。
?
if ((strncmp(input, "3F009590566C", 12) == 0) && (a == 0)) { lcd.setCursor(0, 0); lcd.print("許可證有效"); lcd.setCursor(0, 1); lcd.print("歡迎"); 延遲(1000); a = 1; 指紋(); }
?
在下一步中,將編寫一個函數getFingerprintID?,該函數將為已注冊的指紋返回一個有效的指紋 ID。
?
int getFingerprintID() { uint8_t p = finger.getImage(); 如果(p!= FINGERPRINT_OK)返回-1; p = 手指.image2Tz(); 如果(p!= FINGERPRINT_OK)返回-1; p = finger.fingerFastSearch(); 如果(p!= FINGERPRINT_OK)返回-1; 返回finger.fingerID; }
?
在RFID 匹配成功后調用的函數指紋()內部,調用getFingerprintID函數以獲取有效的指紋 ID。然后使用if-else 循環進行比較,得到經過身份驗證的人員數據的信息,如果數據匹配,則車輛被點燃,否則將提示輸入錯誤的指紋。
?
int指紋ID = getFingerprintID(); 延遲(50); if (fingerprintID == 1) { lcd.setCursor(0, 0); lcd.print("已授予訪問權限"); lcd.setCursor(0, 1); lcd.print("車輛啟動"); 數字寫入(9,高); 數字寫入(10,低); 而(1); }
?
這就是這個RFID 汽車點火系統的工作原理,它為您的汽車增加了兩層安全性。
#include#include 字符輸入[12]; 整數計數 = 0; 整數a = 0; const int rs = 6, en = 7, d4 = 2, d5 = 3, d6 = 4, d7 = 5; LiquidCrystal lcd(rs, en, d4, d5, d6, d7); SoftwareSerial mySerial(12,11); Adafruit_Fingerprint 手指 = Adafruit_Fingerprint(&mySerial); 無效設置() { pinMode(9,輸出); pinMode(10,輸出); 數字寫入(9,低); 數字寫入(10,低); 序列號.開始(9600); lcd.begin(16, 2); lcd.setCursor(0, 0); lcd.print("歡迎來到"); lcd.setCursor(0, 1); lcd.print("電路文摘"); 延遲(2000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("請刷卡"); lcd.setCursor(0, 1); lcd.print("你的許可證"); } 無效循環() { if (Serial.available()) { 計數 = 0; while (Serial.available() && count < 12) { 輸入[計數] = Serial.read(); 計數++; 延遲(5); } 如果(計數 == 12) { if ((strncmp(input, "3F009590566C", 12) == 0) && (a == 0)) { lcd.setCursor(0, 0); lcd.print("許可證有效"); lcd.setCursor(0, 1); lcd.print("歡迎"); 延遲(1000); a = 1; 指紋(); } 否則 if ((strncmp(input, "0B0028883E95", 12) == 0) && (a == 0)) { lcd.setCursor(0, 0); lcd.print("許可證有效"); lcd.setCursor(0, 1); lcd.print("歡迎"); 延遲(1000); a = 1; 指紋(); } 別的 { 如果 (a != 1) { lcd.setCursor(0, 0); lcd.print("許可證無效"); lcd.setCursor(0, 1); lcd.print("再試一次!!!"); 延遲(2000); lcd.clear(); lcd.setCursor(0, 0); lcd.print("請刷卡"); lcd.setCursor(0, 1); lcd.print("你的許可證"); } } } } } int getFingerprintID() { uint8_t p = finger.getImage(); 如果(p!= FINGERPRINT_OK)返回-1; p = 手指.image2Tz(); 如果(p!= FINGERPRINT_OK)返回-1; p = finger.fingerFastSearch(); 如果(p!= FINGERPRINT_OK)返回-1; 返回finger.fingerID; } 無效指紋() { 手指.開始(57600); 而(a==1) { int指紋ID = getFingerprintID(); 延遲(50); 如果(指紋 ID == 1) { lcd.setCursor(0, 0); lcd.print("已授予訪問權限"); lcd.setCursor(0, 1); lcd.print("車輛啟動"); 數字寫入(9,高); 數字寫入(10,低); 而(1); } else if (fingerprintID == 2) { lcd.setCursor(0, 0); lcd.print("已授予訪問權限"); lcd.setCursor(0, 1); lcd.print("車輛啟動"); 數字寫入(9,高); 數字寫入(10,低); 而(1); } 別的 { lcd.setCursor(0, 0); lcd.print("請放置一個"); lcd.setCursor(0, 1); lcd.print("有效手指"); } } }
?
評論
查看更多