单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14372|回复: 4
打印 上一主题 下一主题
收起左侧

Arduino DIY输入密码,门闩自开的数字锁

[复制链接]
跳转到指定楼层
楼主


市面上有很多种类的锁,它们保护着你的房屋、办公室的安全。不过,一个锁动辄上使用Linkit,我们用很少的钱就可以制作一个数字密码锁。所有的锁系统,就算是生物基质的锁或者应用传感器的锁,都是在门的外面上锁,但是如果用到蓝牙装置,锁就可以在门里面控制。这个教程就是来做一个锁。另外,总是使用一个密码是很危险的,所以我们定期要更换密码。这次制作的这个密码锁也可以按照我们的要求更换密码。
第一步:材料清单


1)PCB板1型号
2)带有蓝牙天线的Linkit one
3)PCB按钮
4)伺服电机
5)安卓手机
6)蓝牙控制应用,可以在谷歌上免费下载,我在之前的帖子里也有说明。
7)门栓型锁
8)PCB连接器
9)电线
10)焊接设备
那么,Arduino UNO需要些什么呢?这个比较复杂,我会在后面的步骤里解释。
第二步:设备连接

这并非一个复杂的线路,还是很好理解的。按照图示,将一个按钮连接到12号引脚,作为输入口,按照图纸用电阻连接基本按钮。然后,将伺服电机连接在9号引脚上作为伺服电机连接器。伺服电机有三条线,第一条是黑色或者是棕色,把它接到地线上;第二条是红色的,把它接到5V线上;第三条是橙色,把它接到信号线上(9号或3号引脚,因为它们是PWM引脚)
第三步:焊接硬件部分

1)焊接电路板,作为防护罩
2)把按钮焊接在PCB板的顶部
3)把它连接到数字引脚12
4)把3号引脚的PCB公线连接器焊接到PCB板上的伺服上
5)从GND、+5V、D9中拉出线来
6)将电路板固定在Linkit one 板
硬件部分完成。
第四步:编码
1)这个项目需要三个库。
     A)蓝牙库
      B)EEPROM库
      C)伺服库
2)蓝牙库用来提供密码,并控制锁的开关。另外,也要用来存储新的密码。这些功能都通过蓝牙控制应用来完成。
3)EEPROM库用来存储现有的密码(这样即使重启了系统,还是可以记住密码)。同时,它还能存储门锁最后的状态。在开机或重启时,它会检查这两个数据。
4)伺服库用来控制伺服电机。
相关代码如下:
  1. #include
  2. #include
  3. #include
  4. #include  

  5. int readval;
  6. Servo myservo;

  7. int resultvalue;
  8. int checktime=0;

  9. String readpassword;
  10. String Password;
  11. String msg;

  12. const int buttonPin = 12;
  13. const int ledPin =  13;

  14. boolean firstconn;
  15. boolean changepass;
  16. int Doorstatus;
  17. int Dooraddress=100;

  18. void setup() {
  19. if(!LBTServer.begin((uint8_t*)"Sivam_LIO"))
  20. {
  21. return;
  22. }  
  23. //  writepass("123456");
  24.   Doorstatus=EEPROM.read(Dooraddress);
  25. //  Serial.begin(9600);
  26.   pinMode(ledPin, OUTPUT);
  27.   pinMode(buttonPin, INPUT);
  28.   firstconn=false;
  29.   changepass=false;
  30.   readpassword="";
  31.   Password=readpass();
  32.   myservo.attach(9);
  33.   delay(100);
  34. }

  35. void servocommand()
  36. {
  37.   if (Doorstatus==0)
  38.   {
  39.     myservo.write(0);
  40.     delay(100);
  41.   }
  42.   else
  43.   {
  44.     myservo.write(180);   
  45.     delay(100);
  46.   }
  47. }

  48. void loop() {
  49. uint8_t buf[1];
  50. int bytesRead;
  51. if(LBTServer.connected())
  52. {
  53.    if (firstconn==false)
  54.    {
  55.      firstconn=true;
  56.      delay(200);     
  57.      LBTServer.write("Hello Welcome");     
  58.      delay(100);
  59.      if (Doorstatus==0)
  60.      {
  61.        LBTServer.write("Door is close");            
  62.        delay(100);      
  63.        LBTServer.write("Type Password to open");
  64.        delay(100);      
  65.      }
  66.      else
  67.      {
  68.        LBTServer.write("Door is open");            
  69.        delay(100);      
  70.        LBTServer.write("Type Password to close");
  71.        delay(100);              
  72.      }
  73.    }
  74.    if (digitalRead(buttonPin) == HIGH && Doorstatus==0 && changepass==false)
  75.    {     
  76.      changepass=true;
  77.      LBTServer.write("Type new password");
  78.      readpassword="";
  79.      delay(100);
  80.    }
  81.    else if (digitalRead(buttonPin) == LOW && changepass==true)
  82.    {
  83.      changepass=false;
  84.      LBTServer.write("Exit from password change");
  85.      readpassword="";
  86.      delay(100);     
  87.    }
  88.    while(true)
  89.    {
  90.      bytesRead = LBTServer.readBytes(buf, 1);
  91.      if(!bytesRead)
  92.      break;
  93.      readval = buf[0];
  94.      readpassword = readpassword + char(readval);
  95.      checktime=0;
  96. //     msg = "U type -" + readpassword;
  97. //     LBTServer.write(msg);   
  98. //      Serial.println(readpassword);
  99.      if (readpassword.length()==6)
  100.      {
  101.        if (changepass==false)
  102.        {
  103.          if (readpassword.equals(Password))
  104.          {
  105.            if (Doorstatus==0)
  106.            {
  107.              Doorstatus=1;
  108.              servocommand();
  109.              EEPROM.write(Dooraddress,1);
  110.              LBTServer.write("Door Open");
  111.            }
  112.            else
  113.            {
  114.              Doorstatus=0;
  115.              servocommand();
  116.              EEPROM.write(Dooraddress,0);           
  117.              LBTServer.write("Door Close");           
  118.            }
  119.          }
  120.          else
  121.          {
  122.            LBTServer.write("Invalid Password");              
  123.          }  
  124.        }      
  125.       else
  126.       {
  127.         writepass(readpassword);
  128.         Password=readpassword;
  129.         LBTServer.write("Password Changed");
  130.         delay(100);
  131.         LBTServer.write("Remove Your hand");
  132.         delay(100);
  133.       }
  134.        readpassword="";
  135.      }     
  136.    }
  137.    delay(100);

  138.   if (readpassword!="")
  139.   {
  140.    checktime=checktime+1;
  141.    if (checktime>5)
  142.    {
  143.      readpassword="";
  144.      changepass=false;
  145.      checktime=0;
  146.       LBTServer.write("Time out. Try again");
  147.       delay(100);     
  148.    }
  149.   }
  150.   
  151.   }
  152.   else
  153.   {
  154.      readpassword="";
  155.      firstconn=false;
  156.      changepass=false;
  157.      LBTServer.accept(5);
  158.   }
  159.   
  160. //  if (digitalRead(buttonPin) == HIGH) {
  161. //    Serial.println(2);
  162. //    digitalWrite(ledPin, HIGH);
  163. //  }
  164. //  else {
  165. //    Serial.println(3);
  166. //    digitalWrite(ledPin, LOW);
  167. //  }  
  168.   
  169.   delay(100);
  170. }


  171. String readpass()
  172. {
  173.   String mempass;
  174.   int memval;
  175.   int memadd;
  176.   mempass="";
  177.   for(int i=0;i<6;i++)
  178.   {
  179.     memadd=200+i;
  180.     memval=EEPROM.read(memadd);
  181.     if (memval>9)
  182.     {
  183.       memval=0;
  184.     }
  185.     mempass=mempass + memval;
  186.   }
  187.   return mempass;
  188. }
  189. void writepass(String passw)
  190. {
  191.   String mempass;
  192.   int memval;
  193.   int memadd;
  194.   for(int i=0;i<6;i++)
  195.   {
  196.     mempass=passw.substring(i,i+1);
  197.     memval=mempass.toInt();
  198.     memadd=200+i;
  199.     EEPROM.write(memadd,memval);
  200.   }
  201. }
复制代码




第五步:测试



1)没有伺服电机的情况下,我发现编码工作正常,手机显示所有状态正常。
2)但是主要问题在于伺服电机无法正常工作。
重新检查了所有设备之后,发现伺服电机还是无法正常工作。在检查的过程中,因为我的错误操作,导致伺服电机被烧坏了,所以我买了一个新的并继续检查。我做了如下工作:
A)更新固件
B)检查3号引脚
C)从外部提供一个5V的电源。检查了很久,最后伺服电机开始工作了,但是非常缓慢,需要间隔很长时间。然后我用Arduino检查后,它终于正常工作了。
第六步:用Arduino连接并更改编码
1)计划一下如何连接Linkit one 和Arduino
2)将Linkit one的10号引脚连接到Arduino的12号引脚。连接Linkit one和Arduino的Gnd,使用电阻来保护引脚并作为按钮输入口。然后,连接伺服的9号引脚和Arduino
3)在Linkit one板上载入BTlockerWA( FH6O1X6IHCBVNR8.rar (1.29 KB, 下载次数: 4)
4)在Arduino板上载入伺服控制( FQ1KW53IHCBVNR9.rar (314 Bytes, 下载次数: 4)
5)接着把伺服连接到Arduino上
6)在这个系统里,当开门锁时,Linkit one的10号引脚会设定成“高”,Arduino从12号引脚读取这个信息,然后门锁就开了。
7)同样的,当关上门锁时,Linkit one的10号引脚会设定成“低”,Arduino从12号引脚读取这个信息,然后门锁就关了。
第七步:开关测试

1)在安卓手机上打开蓝牙控制应用
2)改变密码的数值,密码数字范围设为1-9
3)点击扫描,查看主板的名称
4)在列表中选择主板名称
5)收到一个欢迎短信,里面显示了门锁的状态。请求输入密码来开/关门
6)输入密码。密码是6位数字。所以当你输入最后一个数字时:
7)如果密码错误,手机屏幕里会显示“无效密码”
8)如果密码正确,伺服电机会启动打开关闭的门。并将门的状态显示在屏幕上
9)如果门现在是开的,再输入一次密码关上门
第八步:超时测试

1)当你设定密码时,每个数字的间隔时间不要太久
2)系统设定是不能等待的。可能几秒后,它会显示“超时,请重试”
3)你得从一开始就键入密码
第九步:改换密码测试


1)按下主板上的按钮
2)手机会显示“输入新密码”
3)在按下主板按钮的同时,另一只手在手机上输入新密码
4)输入好6个新的数字后,系统会储存现有的这个新密码并替换旧密码,这时就可以松开手机了。
5)然后,松开主板按钮
6)系统自动退出密码更改程序
7)注意:如果当键入密码时,松开主板按钮,系统会跳到第六步,新密码不会被设置,旧密码依然可用。


第十步:组装门锁

1)取出滑动锁
2)拆下所有的连接处
3)在滑动锁的滑动杆下面,有一个弹簧。拿走这个弹簧,这样可以使得锁的移动非常顺滑。
4)磨光滑动杆不平整的表面
5)在滑动杆和锁之间做一个连接
6)来回移动一下,检查顺滑程度
第十一步:完成

1)在把锁固定进门上之前,我用两个分独立的木板检查了它
2)将滑动活塞连接到滑动阀的短边。这样它就有空间可以移动
3)多次检查整个系统直到它可以正常工作
好了,看看我们的作品吧!





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 转播转播 分享分享 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
王顺 发表于 2016-1-6 21:38 来自手机 | 只看该作者
Linkit one ,这个
回复

使用道具 举报

板凳
王顺 发表于 2016-3-2 12:23 | 只看该作者
请问一下带有蓝牙天线的Linkit one这个哪里有卖的?
回复

使用道具 举报

地板
王顺 发表于 2016-3-15 21:06 | 只看该作者
头文件呢?
回复

使用道具 举报

5#
lgx1213 发表于 2017-12-15 14:54 | 只看该作者
一个类别的实现不了吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|单片机论坛 |51黑电子论坛技术交流 QQ 管理员QQ:125739409;技术交流QQ群636986012

Powered by 单片机教程网

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