0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用Arduino构建一个智能爆震检测门锁

科技观察员 来源:circuitdigest 作者:萨达姆 2023-01-25 15:22 次阅读

安全是我们日常生活中的主要问题,数字锁已成为这些安全系统的重要组成部分。有许多类型的安全系统可用于保护我们的地方。一些例子是基于PIR的安全系统,基于RFID的安全系统,数字锁系统,生物矩阵系统,电子代码。在这篇文章中,让我们使用 Arduino 构建一个秘密敲门检测门锁,它可以检测您的敲门模式,并且只有在敲门模式与正确模式匹配时才会打开锁。

组件:

  1. Arduino Uno
  2. 按钮
  3. 蜂鸣器
  4. 1M 电阻器
  5. 权力
  6. 连接线
  7. 伺服电机

电路说明:

爆震模式检测器的电路图非常简单,其中包含用于控制整个项目过程的Arduino,按钮,蜂鸣器和伺服电机。Arduino控制整个过程,例如从蜂鸣器或传感器中获取密码,比较模式,驱动伺服打开和关闭门并将模式保存到Arduino。

1.png

按钮相对于接地直接连接到 Arduino 的引脚 D7。蜂鸣器连接在 Arduino 的模拟引脚 A0 上,相对于接地,并且在 A0 和接地之间也连接 1M 电阻。**伺服电机**也连接到Arduino的PWM引脚D3。

使用Arduino的秘密敲击检测门锁

用于基于敲击的智能锁项目的伺服

Arduino中的喂食敲击模式:

在本电路中,我们使用蜂鸣器或Peizo传感器在系统中获取爆震输入模式。在这里,我们使用一个按钮来允许从传感器获取输入并将其保存到Arduino中。该系统是通过从摩尔斯电码模式中汲取灵感而设计的,但与此并不完全相同。

在这里,我们使用了一个纸板箱进行演示。为了获取输入,我们在按下按钮后打翻了板子。在这里,我们通过牢记一个时间段来敲门,即 500 毫秒。这 500ms 是因为我们已经在代码中修复了它,并且输入模式依赖于它。此 500ms 时间段将定义输入为 1 或 0。检查下面的代码以了解此内容。

基于敲门的智能锁项目

当我们敲击它时,Arduino 开始监控第一次敲击到第二次敲击的时间,并将其放入数组中。在这个系统中,我们敲了 6 次。这意味着我们将获得 5 个时间段。

现在我们一一检查时间段。首先,我们检查第一次敲击和第二次敲击之间的时间段,如果它们之间的时间差小于 500ms,那么它将为 0,如果大于 500ms,它将为 1 并将其保存到一个变量中。现在,在它之后,我们检查第二次敲击和第三次敲击之间的时间段,依此类推。

最后,我们将获得 0 和 1 格式(二进制)的 5 位数字输出。

工作说明:

基于敲门的智能锁项目的工作很简单。首先,我们必须在系统中保存一个模式。因此,我们必须按住按钮直到敲击6次。在这个项目中,我使用了 6 次敲击,但用户可以根据需要进行更改。经过六次敲击后,Arduino找到敲击模式并将其保存在EEPROM中。现在保存输入模式后,按下并立即释放按钮,用于将输入从传感器传输到Arduino以打开锁。现在我们必须敲6次。之后,Arduino对其进行解码并与保存的模式进行比较。如果发生匹配,则Arduino通过驱动伺服电机打开门。

带Arduino和伺服的敲击模式检测器

注意:当我们按住按钮Arduino启动10秒计时器以采取所有6次敲击时。表示用户需要在此 10 秒内敲门。并且用户可以打开串行监视器以查看日志。

编程说明:

在程序中,首先,我们包含头文件并定义输入和输出引脚,并定义宏和声明的变量,如下面的代码中的完整代码部分所示。

在此之后,在设置功能中,我们向定义的引脚指示并启动伺服电机。

void setup() 
{
  pinMode(sw, INPUT_PULLUP);
  myServo.attach(servoPin);
  myServo.write(180);
  Serial.begin(9600);
}

之后,我们接受输入并将输入模式或敲门时间保存在数组中。

void loop() 
{
   int i=0;
   if(digitalRead(sw) == LOW)
   {   
      Serial.println("Start");
      delay(1000);
      long stt= millis();
      while(millis()<(stt+patternInputTime))
      {
        int temp=analogRead(A0);
        if(temp>sensitivity && flag==0 && i<=patternLenth)
        {
.... .
..... ....

之后,我们解码输入模式

for(int i=0;i1;
         if(slot[i+1]-slot[i] <500 )
            pattern[i]=0;
         else
            pattern[i]=1;
         Serial.println(pattern[i]);
      }

如果仍然按下按钮,则保存

if(digitalRead(sw) == 0)
      {
         for(int i=0;iEEPROM.write(i,pattern[i]);
         while(digitalRead(sw) == 0);
      }

如果仍然没有按下按钮,那么Arduino会将输入解码模式与保存的模式进行比较。

else
      {
         if(knok == 1)
         {
            for(int i=0;iif(pattern[i] == EEPROM.read(i))
               {
                  Serial.println(acceptFlag++);
               }

               else
               {
                    Serial.println("Break");
                    break;                
               }
            }
         }

如果任何密码匹配,则伺服打开门,否则什么也没发生,但用户可能会通过串行监视器看到结果。

Serial.println(acceptFlag);
         if(acceptFlag >=  patternLenth-1)
         {
             Serial.println(" Accepted");
             myServo.write(openGate);
             delay(5000);
             myServo.write(closeGate);
         }
         else
            Serial.println("Rejected");
      }
<p>#include<EEPROM.h><br/>
#include<Servo.h>p>
<p>#define patternLenth 5<br/>
#define patternInputTime 10000<br/>
#define sensitivity 80<br/>
#define margin 100<br/>
#define sw 7<br/>
#define servoPin 3<br/>
#define openGate 0<br/>
#define closeGate 180<br/>
long slot[patternLenth+1];<br/>
int pattern[patternLenth];<br/>
int flag=0;<br/>
int acceptFlag=0;<br/>
int knok;p>
<p>Servo myServo;p>
<p>void setup() <br/>
{<br/>
  pinMode(sw, INPUT_PULLUP);<br/>
  myServo.attach(servoPin);<br/>
  myServo.write(180);<br/>
  Serial.begin(9600);<br/>
}p>
<p>void loop() <br/>
{<br/>
   int i=0;<br/>
   if(digitalRead(sw) == LOW)<br/>
   {   <br/>
      Serial.println("Start");<br/>
      delay(1000);<br/>
      long stt= millis();<br/>
      while(millis()<(stt+patternInputTime))<br/>
      {<br/>
        int temp=analogRead(A0);<br/>
        if(temp>sensitivity && flag==0 && i<=patternLenth)<br/>
        {<br/>
             delay(10);<br/>
             flag=1;<br/>
             slot[i++]=millis()-stt;<br/>
             //Serial.println(slot[i-1] - stt);<br/>
             if(i>patternLenth)<br/>
             break;<br/>
        }p>
<p>        else if(temp == 0)<br/>
        flag=0;<br/>
      }<br/>
      <br/>
      long stp=millis();<br/>
      Serial.println("Stop");<br/>
     // Serial.println(stp-stt);<br/>
      for(int i=0;i<patternLenth;i++)<br/>
      {<br/>
         knok=1;<br/>
         if(slot[i+1]-slot[i] <500 )<br/>
            pattern[i]=0;<br/>
         else<br/>
            pattern[i]=1;<br/>
         Serial.println(pattern[i]);<br/>
      }p>
<p>      if(digitalRead(sw) == 0)<br/>
      {<br/>
         for(int i=0;i<patternLenth;i++)<br/>
            EEPROM.write(i,pattern[i]);<br/>
         while(digitalRead(sw) == 0);<br/>
      }p>
<p>      else<br/>
      {<br/>
         if(knok == 1)<br/>
         {<br/>
            for(int i=0;i<patternLenth;i++)<br/>
            {<br/>
               if(pattern[i] == EEPROM.read(i))<br/>
               {<br/>
                  Serial.println(acceptFlag++);<br/>
               }p>
<p>               else<br/>
               {<br/>
                    Serial.println("Break");<br/>
                    break;                <br/>
               }<br/>
            }<br/>
         }p>
<p>         Serial.println(acceptFlag);<br/>
         if(acceptFlag >=  patternLenth-1)<br/>
         {<br/>
             Serial.println(" Accepted");<br/>
             myServo.write(openGate);<br/>
             delay(5000);<br/>
             myServo.write(closeGate);<br/>
         }<br/>
         else<br/>
            Serial.println("Rejected");<br/>
      }p>
<p>      for(int i=0;i<patternLenth;i++)<br/>
      {<br/>
         pattern[i]=0;<br/>
         slot[i]=0;<br/>
      }<br/>
      slot[i]=0;<br/>
      acceptFlag=0;<br/>
   }<br/>
}p>
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 安全系统
    +关注

    关注

    0

    文章

    404

    浏览量

    66677
  • 蜂鸣器
    +关注

    关注

    12

    文章

    850

    浏览量

    45317
  • Arduino
    +关注

    关注

    184

    文章

    6428

    浏览量

    184848
收藏 人收藏

    评论

    相关推荐

    滤波器过滤低频段留高频段分析 跪求大神

    选用种滤波器对缸压信号过滤 由于强度和频率明显高于缸盖和机体振动的频率 进行滤波处理得到频段 分析
    发表于 04-13 15:31

    两款汽车传感器的性能测量

    作此类发动机传感器的信号调节器。 新型解决方案有时会将该功能集成到发动机 ECU 的 MCU 中,不过,这意味着可能更多地以远程方式完成该处理过程(由于微控制器较低的温度等级)
    发表于 09-10 15:02

    AGN和AGU发动机传感器

      传感器其检测数据如下表所示。  欢迎转载,信息维库电子市场网(www.dzsc.com):
    发表于 10-30 16:33

    传感器检测数据分享

      传感器检测数据如下表所示。
    发表于 10-31 17:33

    传感器波形测试

      1)标准波形特点  图1为传感器标准波形。  传感器的波形与程度有关,震动越大,
    发表于 10-31 17:30

    蓝牙智能门锁解决方案

    输入模块,触摸键盘,直流电机驱动。构建完整的智能门锁基础硬件平台,配合蓝牙门锁 APP,即可
    发表于 11-06 16:40

    汽红旗世纪星发动机传感器检测数据

      传感器检测数据如下表所示。:
    发表于 11-15 15:04

    汽红旗名仕4GE发动机传感器

      传感器其检测数据如下表所示。  欢迎转载,信息维库电子市场网(www.dzsc.com):
    发表于 11-15 16:09

    非共振型压电式传感器的识别

      非共振型压电式传感器的结构如图1所示。它由平衡重、压电元件、壳体、电气连接装置等组成。两 压电元件同极性相向对接,平衡重将加速变换成作用在压电元件上的压力,输出电压由两压电
    发表于 11-16 15:26

    与碰撞传感器概述

    电信号输入ECU,ECU根据信号对点火提前角进行修正,从而使点火提前角在任何工况下都保持 最佳值。图1为点火提前角反馈控制系统图。 图1 点火提前角反馈控制系统图 图2
    发表于 11-16 15:47

    共振型压电式传感器的识别

      共振型压电式传感器的结构如图1所示。该传感器中压电元件紧密地贴合在振荡片上,振荡片则固定在传感器的基座上。振荡片随发动机的振动而振荡,波及压电元件,使其变形产生电压信号。当发动机
    发表于 11-16 15:49

    利用示波器测量汽车传感器波形及分析

    时,其振动频率和传感器本身的固有频率致而产生共振的现象来检测是否产生。其输出信号为电压,电压值的大小表示
    发表于 07-10 15:32

    使用Arduino构建数字罗盘

    方向。在本文中,您将学习如何使用 Arduino 构建自己的数字罗盘。通过它,您将能够了解HMC5883L传感器的完整操作,来检测它的方位方向。此外,您将学习如何构建自己的电子罗盘板并
    发表于 08-25 06:11

    传感器的性能如何

    作此类发动机传感器的信号调节器。 新型解决方案有时会将该功能集成到发动机 ECU 的 MCU 中,不过,这意味着可能更多地以远程方式完成该处理过程(由于微控制器较低的温度等级)
    发表于 11-21 06:36

    如何使用Arduino构建数字键盘安全门锁

    在这个项目中,我构建了一个Arduino 键盘门锁,它可以安装到您现有的任何门上,以使用数字密码保护它们。
    发表于 08-17 15:49 3653次阅读
    如何使用<b class='flag-5'>Arduino</b><b class='flag-5'>构建</b>数字键盘安全<b class='flag-5'>门锁</b>