现在大部分汽车都配备了无钥匙进入和一键式点火系统,您只需将钥匙放在口袋里,只需将手指放在门把手上的电容式传感器上即可打开车门。在此项目中,我们通过使用 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 #includeSoftwareSerial 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("有效手指"); } } }