简易密码锁的制作-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 26810|回复: 14

简易密码锁的制作

[复制链接]
发表于 2018-10-29 16:28 | 显示全部楼层 |阅读模式
本帖最后由 chemistry 于 2018-11-8 16:57 编辑

一款简易密码锁
一、功能:
将密码显示在lcd屏上,正常状态下电磁锁处于锁定状态,当输入密码与原设定密码一致时,打开电磁锁。同时可改变密码。
工作原理:
正常状态下继电器通电,常开闭合,电磁锁有电压,状态闭合
当密码正确时,10引脚输出低电平,继电器断电,电路开路,密码锁打开。

三、需要的组件:
Arduino uno x1
lcd 1602 x1
4x4矩阵键盘x1
电源
SRD-05VDC-SL-C继电器x1
电磁锁x1
导线若干



四、硬件连接:
4x4矩阵键盘的连接:
1-8脚分别连接arduino的2 3 A5-A0 8个引脚

lcd1602屏幕的连接:
vss v0接电源负极,vdd接+5v,RS RW E分别接引脚4 5 6
D4-D7分别接引脚8 9 11 12,背光A接3.3v K接GND

继电器的连接:
线圈两端一端接GND一端接10脚
公共端接电源负极  常开端接电磁锁负极

电磁锁和电源的连接:
电磁锁正极连电源正  负极连接常开

五、电路原理图:


系统组成:arduino 继电器 4x4键盘 电源 电磁锁
面包板视图:

右上为电磁锁,中间为继电器,右下角为4x4键盘 从上到下为1-8脚

六、代码部分:
//首先,我们将包括用于4X4键盘,LCD和用于存储密码的库的库设定lcd和键盘的引脚
#include <Keypad.h>
#include<LiquidCrystal.h>
#include<EEPROM.h>
LiquidCrystal liquid_crystal_display{4,5,6,8,9,11,12,};
char password[4];
char initial_password[4],new_password[4];
int i=0;
int relay_pin = 10;                //设定的输出引脚
char key_pressed=0;
const byte rows = 4;
const byte columns = 4;
char hexaKeys[rows][columns] = {

{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte row_pins[rows] = {A0,A1,A2,A3};
byte column_pins[columns] = {A4,A5,3,2};       //键盘的引脚设定
Keypad keypad_key = Keypad( makeKeymap(hexaKeys), row_pins, column_pins, rows, columns);
void setup()
{
  pinMode(relay_pin, OUTPUT);                //设定引脚模式为输出
  liquid_crystal_display.begin(16,2);
  liquid_crystal_display.print("Enter Password");
  liquid_crystal_display.setCursor(0,1);
  initialpassword();
}
//按下的键存储在“ 密码 ”变量中,当按下键时,这些键显示在LCD上。然后这些键将与存储在EEPROM中的初始密码相匹配。如果按下的键与初始密码匹配,则锁定将打开,并且LCD上将打印“已接受通过”。如果密码不匹配,则会要求再次输入密码。
void loop()
{
  digitalWrite(relay_pin, HIGH);             //初始化为高电平
  key_pressed = keypad_key.getKey();

  if (key_pressed)
  {
    password[i++]=key_pressed;
liquid_crystal_display.print(key_pressed);
while(key_pressed=='*')
{
    change();
}
      }
  if(i==4)
  {
    delay(200);
    for(int j=0;j<4;j++)
      initial_password[j]=EEPROM.read(j);
    if(!(strncmp(password, initial_password,4)))              //比较输入密码与当前密码是否一致
    {
      liquid_crystal_display.clear();
      liquid_crystal_display.print("Pass Accepted");
      digitalWrite(relay_pin, LOW);                 //输出低电平
      delay(2000);
      liquid_crystal_display.clear();
      liquid_crystal_display.print("Enter Password:");
      liquid_crystal_display.setCursor(0,1);
      i=0;

    }
    else
    {

      digitalWrite(relay_pin, HIGH);
      liquid_crystal_display.clear();
      liquid_crystal_display.print("Wrong Password");
      delay(2000);
      liquid_crystal_display.clear();
      liquid_crystal_display.print("Enter Password");
      liquid_crystal_display.setCursor(0,1);
      i=0;

}
  }

}
//如果按下'*'键,它将调用' change() '函数。在更改功能中,它会要求您输入当前密码。如果当前密码正确,则会要求您输入新密码。输入新密码后,密码将被更改。
void change()                   //修改密码
{
  int j=0;
  liquid_crystal_display.clear();
  liquid_crystal_display.print("Current Password");
  liquid_crystal_display.setCursor(0,1);
  while(j<4)
  {
    char key=keypad_key.getKey();
    if(key)

    {
      new_password[j++]=key;
      liquid_crystal_display.print(key);  
    }
    key=0;
  }
  delay(500);

  if((strncmp(new_password, initial_password, 4)))
  {
    liquid_crystal_display.clear();
    liquid_crystal_display.print("Wrong Password");
    liquid_crystal_display.setCursor(0,1);
    liquid_crystal_display.print("Try Again");
    delay(1000);
  }
  else
  {
    j=0;
    liquid_crystal_display.clear();
    liquid_crystal_display.print("New Password:");
    liquid_crystal_display.setCursor(0,1);
    while(j<4)
    {

      char key=keypad_key.getKey();
      if(key)
      {
        initial_password[j]=key;
        liquid_crystal_display.print(key);
        EEPROM.write(j,key);
        j++;

      }
    }
    liquid_crystal_display.print("Pass Changed");
    delay(1000);
  }
  liquid_crystal_display.clear();
  liquid_crystal_display.print("Enter Password");
  liquid_crystal_display.setCursor(0,1);
  key_pressed=0;
}
//初始密码的设定
void initialpassword(){
  for(int j=0;j<4;j++)
   EEPROM.write(j, j+49);
  for(int j=0;j<4;j++)
    initial_password[j]=EEPROM.read(j);
}


键盘库:

[url=]keypad.zip[/url]
七、总结
通过这次项目的设计,更加清晰了代码的设计,电路的原理,对arduino的认识。       
        项目中遇到的问题:继电器的使用,用加在线圈上的电压来控制继电器的工作状态从而控制电磁锁的开关。                                                                                                                                       
附:
实物图:

IMG_20181029_162315.jpg
QQ截图20181101180317.png
QQ截图20181101184104.png

keypad.zip

37.01 KB, 下载次数: 303

keypad.zip

37.01 KB, 下载次数: 127

发表于 2018-11-23 16:44 | 显示全部楼层
你好,有问题想要请教一下???就电子锁的,目前小白,在弄电子课程设计,机电专业的,以前没有接触过arduino

点评

才看到 =。=  发表于 2019-1-18 14:05
发表于 2018-12-25 13:03 来自手机 | 显示全部楼层
你好,请问有没有编程模块
 楼主| 发表于 2019-1-18 14:03 | 显示全部楼层
阿目 发表于 2018-12-25 13:03
你好,请问有没有编程模块

什么意思 这块板子直接就下载程序啊
发表于 2019-4-8 12:09 | 显示全部楼层
感谢楼主分享!~
发表于 2019-4-17 19:37 | 显示全部楼层
大佬,我刚开始学这个,我想问问你的程序运行时出现no such file or directory是为什么呀,是因为我没有用keypad文件吗?
 楼主| 发表于 2019-4-20 11:45 | 显示全部楼层
夏目123 发表于 2019-4-17 19:37
大佬,我刚开始学这个,我想问问你的程序运行时出现no such file or directory是为什么呀,是因为我没有用k ...

那个库文件是要下载的
发表于 2019-5-26 14:49 | 显示全部楼层
大佬,这个电源具体型号是什么啊
发表于 2019-5-26 16:13 | 显示全部楼层
顶!给我很多灵感和方案!
发表于 2019-6-14 08:43 | 显示全部楼层
请问您说的电源是多少伏啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 08:48 , Processed in 0.123895 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表