基于Arduino的密码+指纹智能锁(LCD1602显示器)

**

基于Arduino的密码+指纹智能锁(LCD1602显示器)

**

设计背景:

随着科技的不断进步,智能锁的使用也越来越普遍,市场上的智能锁多种多样,有单一的智能锁,比如密码锁,蓝牙锁,指纹锁,人脸识别技术开锁,甚至还有瞳孔识别等高阶智能锁;不过我们日常见到的、使用普遍的多为他们的结合体,功能并不单一。虽然智能门锁出现的时间已经比较长了,已经算是一款非常成熟的产品了,但是一款产品的发展年限,一定是永无止境的,需要开发人员不断地追求进步,才是现在的市场,因为用户的需求在不断的变化,所以产品自然会变,而产品的优点和缺点也是避免不了的。换句话说,尽管智能锁发展得很好,但是也存在一定的缺点和问题,比如安全性、稳定性、耐用度等。在这个背景下,以及对智能锁怀着好奇之心还有不可描述的兴趣,我决定自己做一个智能锁感受一下。
作为一名穷逼大学生,要做一个智能锁肯定得考虑到成本问题,密码锁虽然成本低但是我又不想只是做一个单一的密码锁,想玩点特殊的,最后决定使用光学指纹识别模块,提升智能锁的档次,光学指纹识别模块相比于其他指纹识别模块更便宜而且使用简单。
然后我们再简单了解以下指纹锁,方便我们后续对它进行设计和研究。指纹锁是在原有机械锁的技术上增加指纹开锁功能,指纹开锁的主要技术是将用户的指纹信息先储存起来,当用户用指纹验证时,指纹识别系统会把用户的指纹和储存的指纹相对比,如果验证的指纹与预先储存的指纹相匹配,门锁就会打开,如果不相匹配,会提示错误,门锁无法打开。指纹锁是通过指纹是否匹配的方法来认识主人与开锁的,那么识别指纹的真假成了指纹锁的一个重要技术指标。目前市场广泛使用识别指纹的探头可分了两类,一类是光学指纹头。较便宜,另一类是半导体指纹头灵敏度更好也更精细,当然价格也是光学指纹头的两倍多。当然,除了这两种,还有温差感应式指纹识别和生物射频指纹识别,这两种并不常见,原因是前者受温度影响较大,识别面积范围小,后者虽然很牛逼,但是老贵了。扯远了,感兴趣的话大家可以去了解一下指纹学。
指纹锁是机械锁升级过来的,其主要目的是能够保障财物安全的情况下,提高了我们生活的便利性,相比于机械锁,指纹锁是高出一个级别的,不法分子想要伪造主人的假指纹,比撬锁的难度高出几百倍。
总的来说,使用指纹锁比使用机械锁要更安全、更便捷、更舒心。大家可以放心大胆使用。密码锁就不多解释了,因为太常见了,懂得都懂。
当然,做出来的产品那得必须考虑他的实用性,做出来不能用或者不实用,只能看那就违背了产品本身的定义。设计制作这个智能锁时,我还在住在大学宿舍,那么,首当其冲的便是我们宿舍的门锁,对,我得想想怎么把普通的机械锁在不拆除的前提下改成智能锁,最后,对门锁进行点对点的受力分析,决定用舵机做传动机构,用钓鱼线做传动绳拉动门锁开关,实现开锁。因为每个人原先的机械锁都不一样,要改动的话大家根据实际情况自己设计,这里只提供一个想法,就不多解释或者上图了。当然如果要拆掉原先的锁自己换上一个锁轴那就简单多了。好,废话不多说,总之大家可以简单的理解为我是用舵机模拟开锁。

硬件部分:

先给大家简单介绍以下设计所需要的硬件,之后会告诉大家怎么连线,包括仿真和实物接线图,我只是给出一个参考,大家自己设计的话完全可以根据自己的设计要求自己更改接线端口。

  1. 控制芯片Arduino UNO
    额…这个不多说,新手的话网上有很多资料,老手的话就更不用说了,我这里就直接放上在网上看到写的比较好的之一,新手可以学习了解以下。
    Arduino UNO数据手册(新手入门)
    图片来源于上述网址,意在让大家认识一下Arduino UNO 芯片
    图片来源于上述网址,意在让大家认识一下Arduino UNO 芯片

  2. 4×4矩阵按键
    4×4矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。在行线和列线的每一个交叉点上,设置一个按键。这样键盘中按键的个数是4×4个。这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。由于单片机IO端口具有线与的功能,因此当任意一个按键按下时,行和列都有一根线被线与,通过运算就可以得出按键的坐标从而判断按键键值。
    下图是我在某宝买的矩阵键盘包括它的原理图:
    4×4矩阵按键实物图
    4×4矩阵按键原理图

  3. LCD1602显示器
    这个显示器我相信很多电子芯片爱好者肯定都有接触或了解过,要想用它来显示你总得知道它的工作原理吧,不清楚的话,前人之述备矣,网上解释得很清楚了,大家可以去了解一下,方便后续工作地进行。
    LCD1602一般是16条引脚,我也有见过14条引脚的,但与16脚的相比缺少了背光电源A(15脚)和地线K(16脚),起始功能原理差不多,常见的还是16引脚的。下面是它的功能引脚,知道这个有利于接线。还有啥其他的具体知识,网上搜一下相关数据手册就全出来了,这里就不多此一举了。
    LCD1602功能引脚

  4. AS608光学指纹识别模块
    ATK-AS608 指纹识别模块是 ALIENTEK 推出的一款高性能的光学指纹识别模块。
    ATK-AS608 模块采用了国内著名指纹识别芯片公司杭州晟元芯片技术有限公司(Synochip)
    的 AS608 指纹识别芯片。芯片内置 DSP 运算单元,集成了指纹识别算法,能高效快速采集图像并识别指纹特征。模块配备了串口、USB 通讯接口,用户无需研究复杂的图像处理及指纹识别算法,只需通过简单的串口、USB 按照通讯协议便可控制模块。本模块可应用于各种考勤机、保险箱柜、指纹门禁系统、指纹锁等场合。
    它长这样:
    AS608实物图
    PCB原理图:
    AS608PCB原理图
    模块引脚描述:
    AS608功能引脚
    大家可以去网上找一下相关数据手册,当然,我相信你要是去某宝买的话都会有数据手册给你的,只是想学习了解,没有去买,然后实在找不到的话,我最后会放在我提供的资料包里,大家下载后可学习。

  5. MG90S舵机
    我用的舵机是小规格的,俗称9g舵机,了解过舵机的都知道,舵机实际上是通过脉宽调制来控制舵机角度的,舵机的控制信号是周期20ms 的脉宽调制(PWM)信号,其中脉冲宽度从 0.5ms-2.5ms,相对应舵盘的位置为 0~180 度,呈线性变化。我用Arduino做控制的话,实际上根据舵机的原理,写代码的方式也有两种,一种是直接写角度,另一种就是写入PWM信号。代码我后面也会给大家提供出来供大家下载。具体舵机啥原理,这玩意的资料网上很多,写的也很清楚,这里不做多解释。
    MG90S舵机实物图
    图片来源于网络。附图是为了强调,舵机三条线的颜色分别表示为中间红色接开发板5V电源,灰色接地,橙色接信号端,一般都是这样的。了解一下方便后续接线。

实物接线方法:

接线方法
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[6];
char initial_password[6], new_password[6];
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站了,感兴趣的可以看一下,喜欢就点赞加关注吧!
整体效果视频

  • 70
    点赞
  • 405
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论
在这个项目中,我们将制作一个无钥匙门系统,该系统使用4X4键盘输入钥匙,并使用DC来打开或关闭门。将使用一个16X2 LCD进行显示。 每当按键被按下时,它们就会与已经存储的按键相匹配。如果按下的键与存储在EEPROM中的初始密码“ 1234”匹配,则将打开。如果密码不匹配,则它将在液晶显示屏上显示“拒绝访问”。 如果将按下“#”键,它将要求您输入当前密码,如果匹配,则将要求您输入新密码,并且密码将被更改。 首先,将4X4键盘连接到Arduino;将4X4键盘上的前六个引脚与Arduino上的A0和A5引脚连接。然后将4X4键盘模块上的最后两个引脚连接到Arduino上的数字引脚3和2。 之后,将LCD连接到Arduino。将LCDArduino连接的连接如下 将LCD上的引脚1(即VSS引脚)连接到Arduino的GND 将引脚2(即VDD引脚)连接到Arduino的5V引脚 将引脚3(即V0)连接到10k电位计的中间,并将电位计上的其他两个引脚连接到Arduino上的5V和GND。此引脚用于设置LCD的对比度。 将引脚4(即RS引脚)连接到Arduino的引脚7 将引脚5(即R / W引脚)连接到Arduino的GND引脚 将引脚6(即使能引脚)连接到Arduino的引脚6 将作为数据引脚的引脚11、12、13和14连接到Arduino的引脚5、4、3和2 通过220欧姆电阻将15针(LCD的背光灯针)连接到Arduino的5V 将Arduino的引脚16(即背光的负极)连接到Arduino的GND 最后,我们将DCArduino连接。的工作电压为7至12V,因此我们无法将其直接连接到Arduino。要将其连接到Arduino,我们将需要一个继电器和一个电池。 将继电器的信号引脚连接到Arduino的引脚10,并将的VCC和GND连接到Arduino的5V和GND。然后,在继电器的另一端,将电池的负极连接到继电器的公共端,并将继电器的NO(常开)连接到的一侧。然后将的另一端连接到电池的正极。
AS608是一款常用的指纹识别模块,可以通过Arduino进行控制,需要使用相应的库文件来实现指纹识别功能。 以下是AS608指纹识别模块的Arduino库文件使用方法: 1. 下载并安装指纹识别模块AS608的相关驱动程序和库文件。 2. 打开Arduino IDE,选择“工具”菜单,然后选择“库管理器”。 3. 在搜索框中输入“AS608”,然后选择最新版本的“AS608 Fingerprint Sensor Library”,点击“安装”按钮。 4. 在Arduino程序中,使用以下代码进行测试指纹识别功能: ``` #include <Adafruit_Fingerprint.h> //指纹识别模块的RX、TX连接Arduino的引脚 #define fingerRx 2 #define fingerTx 3 //创建指纹识别器对象 Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial1); void setup() { Serial.begin(9600); //指纹识别模块连接Arduino的串口 Serial1.begin(57600); delay(100); //检测指纹识别模块是否正常 if (finger.verifyPassword()) { Serial.println("指纹识别模块已正常连接!"); } else { Serial.println("无法连接指纹识别模块!"); while (1) { delay(1); } } } void loop() { //等待用户按下指纹 Serial.println("请放上您的指纹:"); while (! finger.getImage()) { delay(1); } //把指纹图像转换为字符模式并存储到指纹库中 int id = finger.storeTemplate(); if (id == FINGERPRINT_OK) { Serial.println("指纹已成功存储到指纹库中!"); Serial.print("指纹ID:"); Serial.println(id); } else { Serial.println("存储指纹失败!"); } } ``` 以上代码实现了读取指纹图像并将其转换为字符模式,然后存储到指纹库中。可以根据需要进行修改,实现更复杂的指纹识别功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sarmen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值