安全是我们日常生活中的主要问题,数字锁已成为这些安全系统的重要组成部分。有许多类型的安全系统可用于保护我们的地方。一些例子是基于PIR的安全系统,基于RFID的安全系统,数字锁系统,生物矩阵系统,电子代码锁。在这篇文章中,让我们使用 Arduino 构建一个秘密敲门检测门锁,它可以检测您的敲门模式,并且只有在敲门模式与正确模式匹配时才会打开锁。
该爆震模式检测器的电路图非常简单,其中包含用于控制整个项目过程的Arduino,按钮,蜂鸣器和伺服电机。Arduino控制整个过程,例如从蜂鸣器或传感器中获取密码,比较模式,驱动伺服打开和关闭门并将模式保存到Arduino。
按钮相对于接地直接连接到 Arduino 的引脚 D7。蜂鸣器连接在 Arduino 的模拟引脚 A0 上,相对于接地,并且在 A0 和接地之间也连接 1M 电阻。**伺服电机**也连接到Arduino的PWM引脚D3。
在本电路中,我们使用蜂鸣器或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启动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条评论
快来发表一下你的评论吧 !