本帖最后由 Sarmen 于 2020-9-30 21:07 编辑
** 基于Arduino的密码+指纹智能锁(LCD1602显示器)** 设计背景:随着科技的不断进步,智能锁的使用也越来越普遍,市场上的智能锁多种多样,有单一的智能锁,比如密码锁,蓝牙锁,指纹锁,人脸识别技术开锁,甚至还有瞳孔识别等高阶智能锁;不过我们日常见到的、使用普遍的多为他们的结合体,功能并不单一。虽然智能门锁出现的时间已经比较长了,已经算是一款非常成熟的产品了,但是一款产品的发展年限,一定是永无止境的,需要开发人员不断地追求进步,才是现在的市场,因为用户的需求在不断的变化,所以产品自然会变,而产品的优点和缺点也是避免不了的。换句话说,尽管智能锁发展得很好,但是也存在一定的缺点和问题,比如安全性、稳定性、耐用度等。在这个背景下,以及对智能锁怀着好奇之心还有不可描述的兴趣,我决定自己做一个智能锁感受一下。
作为一名穷逼大学生,要做一个智能锁肯定得考虑到成本问题,密码锁虽然成本低但是我又不想只是做一个单一的密码锁,想玩点特殊的,最后决定使用光学指纹识别模块,提升智能锁的档次,光学指纹识别模块相比于其他指纹识别模块更便宜而且使用简单。
然后我们再简单了解以下指纹锁,方便我们后续对它进行设计和研究。指纹锁是在原有机械锁的技术上增加指纹开锁功能,指纹开锁的主要技术是将用户的指纹信息先储存起来,当用户用指纹验证时,指纹识别系统会把用户的指纹和储存的指纹相对比,如果验证的指纹与预先储存的指纹相匹配,门锁就会打开,如果不相匹配,会提示错误,门锁无法打开。指纹锁是通过指纹是否匹配的方法来认识主人与开锁的,那么识别指纹的真假成了指纹锁的一个重要技术指标。目前市场广泛使用识别指纹的探头可分了两类,一类是光学指纹头。较便宜,另一类是半导体指纹头灵敏度更好也更精细,当然价格也是光学指纹头的两倍多。当然,除了这两种,还有温差感应式指纹识别和生物射频指纹识别,这两种并不常见,原因是前者受温度影响较大,识别面积范围小,后者虽然很牛逼,但是老贵了。扯远了,感兴趣的话大家可以去了解一下指纹学。
指纹锁是机械锁升级过来的,其主要目的是能够保障财物安全的情况下,提高了我们生活的便利性,相比于机械锁,指纹锁是高出一个级别的,不法分子想要伪造主人的假指纹,比撬锁的难度高出几百倍。
总的来说,使用指纹锁比使用机械锁要更安全、更便捷、更舒心。大家可以放心大胆使用。密码锁就不多解释了,因为太常见了,懂得都懂。
当然,做出来的产品那得必须考虑他的实用性,做出来不能用或者不实用,只能看那就违背了产品本身的定义。设计制作这个智能锁时,我还在住在大学宿舍,那么,首当其冲的便是我们宿舍的门锁,对,我得想想怎么把普通的机械锁在不拆除的前提下改成智能锁,最后,对门锁进行点对点的受力分析,决定用舵机做传动机构,用钓鱼线做传动绳拉动门锁开关,实现开锁。因为每个人原先的机械锁都不一样,要改动的话大家根据实际情况自己设计,这里只提供一个想法,就不多解释或者上图了。当然如果要拆掉原先的锁自己换上一个锁轴那就简单多了。好,废话不多说,总之大家可以简单的理解为我是用舵机模拟开锁。 硬件部分:先给大家简单介绍以下设计所需要的硬件,之后会告诉大家怎么连线,包括仿真和实物接线图,我只是给出一个参考,大家自己设计的话完全可以根据自己的设计要求自己更改接线端口。 实物接线方法:
LCD1602的VSS,VEE,RW均接地,其中为了使显示更清晰,VEE需要串一个电位器调节电阻或者直接串上1K~2.2K左右的电阻,LCD1602的VDD端接开发板5V电源;舵机红线接开发板5V电源,灰线接地;AS608指纹模块Vi接开发板3.3V电源端,GND接开发板地。 仿真部分:Proteus仿真接线图:
因为仿真里是做不到指纹识别的,所以就没有在仿真中加入指纹识别模块,大家完全可以用某些元件代替,比如说就加个LED灯,我就懒得加了,因为我做仿真主要是想看LCD1602配合按键的效果以及我的代码能不能应付得过来,所以仿真做不做指纹模块对我来说不重要。
Proteus仿真效果图(部分):
程序设计:用Arduino做控制芯片的话,肯定都听过Arduino专门的IDE编程软件,去官网下载就好,也有Mixly图形化编程软件,但是个人还是建议用专门的IDE软件会好点,因为开源的库文件比较多。说到库文件,好像指纹识别的库文件需要自行下载并移到IDE库文件夹中的,一般是不自带的,我提供的资料里面有这次设计所需要的所有库文件,大家只需要把我里面压缩包Adafruit_Fingerprint_Sensor_Library.rar和Keypad-master.rar解压后复制到Arduino根目录的libraries文件夹内即可。
由于程序篇幅太长,这里仅提供思路,源码在我的资料包里都有。
写程序之前,得先弄清楚你要想实现什么功能,对于Arduino而言,很多代码都是开源的,可以直接复制了用,我们只需要根据自己实际电路微改一下就行。废话不多说,整个密码+指纹锁就是既能用密码开锁,也能用指纹开锁,LCD1602时刻给用户显示提示,免得用户一脸懵逼,不知道自己在干嘛,按键得充分应用起来,我是设置了按键有让用户选择开锁方式的功能,在主界面时用户可以选择开锁方式,按下指定键即可切换开锁方式,使用灵活,当密码输入正确,显示器做出提示,舵机转动;当指纹识别正确,显示器做出提示,舵机也能转动。错误的话当然会提示你错误,重新输入或者重新指纹识别啦。具体看我资料里的用户使用手册,需要强调以下,因为某些原因,我提供的这个资料只是基础版,能够基本实现其功能,供大家学习了解足以,完美版也有而且我还在不断完善,感兴趣且想要深入了解的朋友可以在讨论区留言讨论,如果针对初版有更好的想法欢迎讨论。 下面我附上部分代码: /*定义部分*/Servo myservo;
LiquidCrystal liquid_crystal_display{A5, A4, A0, A1, A2, A3,};
char password[;
char initial_password[, new_password[;
int i = 0;
char key_pressed = 0;
const byte rows = 4;
const byte columns = 4;
char hexaKeys[rows][columns] = { {'7', '8', '9', 'A'}, {'4', '5', '6', 'B'}, {'1', '2', '3', 'C'}, {'*', '0', '#', 'D'}};
byte row_pins[rows ]= {10, 11, 12, 13};
byte column_pins[columns ]= {4, 5, 6, 7}; //键盘的引脚设定
Keypad keypad_key = Keypad( makeKeymap(hexaKeys), row_pins, column_pins, rows, columns);
/*loop循环函数*/
void loop()
{
key_pressed = keypad_key.getKey();
switch (key_pressed)
{
case 'A': KeyWay(); break;
case 'B': getFingerprintID(); break;
}
}
/*KeyWay()函数循环部分*/
while (flag == 0)
{
if (t == 3 || key_pressed == 'D')
{
liquid_crystal_display.clear();
liquid_crystal_display.print("A/B select way!");
liquid_crystal_display.setCursor(0, 1);
i = 0; //清除按键按下次数的记录,避免密码判断错误
flag = 1; }
key_pressed = keypad_key.getKey();
if (key_pressed) {
password[i++ = key_pressed;
liquid_crystal_display.print(key_pressed);
if (key_pressed == 'C')
{
liquid_crystal_display.clear();
liquid_crystal_display.print("Enter again:");
liquid_crystal_display.setCursor(0, 1);
i = 0; //清除按键按下次数的记录,避免密码判断错误
key_pressed = 0;
}
while (key_pressed == '*')
{
change();
}
}
if (i == 6)
{
delay(200);
for (int j = 0; j < 6; j++)
initial_password[j ]= EEPROM.read(j);
if (!(strncmp(password, initial_password, 6))) //比较输入密码与当前密码是否一致
{
liquid_crystal_display.clear();
liquid_crystal_display.print("Password via!");
liquid_crystal_display.setCursor(0, 1);
liquid_crystal_display.print("Welcome home!");
liquid_crystal_display.setCursor(0, 2);
myservo.write(180);
delay(1000);
myservo.write(0);
liquid_crystal_display.clear();
liquid_crystal_display.print("A/B select way!");
liquid_crystal_display.setCursor(0, 1);
i = 0; //清除按键按下次数的记录,避免密码判断错误
flag = 1;
}
else {
liquid_crystal_display.clear();
liquid_crystal_display.print("Wrong Password!");
delay(1000);
liquid_crystal_display.clear();
liquid_crystal_display.print("Enter Password:");
liquid_crystal_display.setCursor(0, 1);
t++;
i = 0;
}
}
}
指纹识别函数我就不说了,因为初代版本真的就很简单,给大家个提示,我们完全可以直接在官网提供的Adafruit_Fingerprint_Sensor_Library文件里看到它的指纹载入、识别、删除函数,然后做些修改或增添就好,有C语言基础那就是小CASE。 实物效果图:
资料下载网址:我把初代,能够基本实现其功能的资料都放在那里了,里面还有使用手册,感兴趣的可以下载看看。
密码+指纹锁资料包
然后我录了视频放B站了,感兴趣的可以看一下,喜欢就点赞加关注吧!
整体效果视
|