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

**

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

**

设计背景:

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

硬件部分:

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

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

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

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

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

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

实物接线方法:

基于Arduino的密码+指纹智能锁(LCD1602显示器)_第9张图片
LCD1602的VSS,VEE,RW均接地,其中为了使显示更清晰,VEE需要串一个电位器调节电阻或者直接串上1K~2.2K左右的电阻,LCD1602的VDD端接开发板5V电源;舵机红线接开发板5V电源,灰线接地;AS608指纹模块Vi接开发板3.3V电源端,GND接开发板地。

仿真部分:

Proteus仿真接线图:
因为仿真里是做不到指纹识别的,所以就没有在仿真中加入指纹识别模块,大家完全可以用某些元件代替,比如说就加个LED灯,我就懒得加了,因为我做仿真主要是想看LCD1602配合按键的效果以及我的代码能不能应付得过来,所以仿真做不做指纹模块对我来说不重要。
基于Arduino的密码+指纹智能锁(LCD1602显示器)_第10张图片
Proteus仿真效果图(部分):
基于Arduino的密码+指纹智能锁(LCD1602显示器)_第11张图片
基于Arduino的密码+指纹智能锁(LCD1602显示器)_第12张图片
基于Arduino的密码+指纹智能锁(LCD1602显示器)_第13张图片
基于Arduino的密码+指纹智能锁(LCD1602显示器)_第14张图片

程序设计:

用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。

实物效果图:

基于Arduino的密码+指纹智能锁(LCD1602显示器)_第15张图片

基于Arduino的密码+指纹智能锁(LCD1602显示器)_第16张图片
基于Arduino的密码+指纹智能锁(LCD1602显示器)_第17张图片

基于Arduino的密码+指纹智能锁(LCD1602显示器)_第18张图片
基于Arduino的密码+指纹智能锁(LCD1602显示器)_第19张图片
基于Arduino的密码+指纹智能锁(LCD1602显示器)_第20张图片

资料下载网址:

我把初代,能够基本实现其功能的资料都放在那里了,里面还有使用手册,感兴趣的可以下载看看。
密码+指纹锁资料包.
然后我录了视频放B站了,感兴趣的可以看一下,喜欢就点赞加关注吧!
整体效果视频

你可能感兴趣的:(嵌入式学习,芯片,编程语言,机器学习,人工智能,c语言)