Arduino 用声音传感器制作简单的“声纹锁”

2018-11-17  本文已影响0人  hk_shao

前言

之前就一直在想如何用Arduino制作一个门锁,简单廉价,又可以很方便的开门,最后想了一个办法,就是使用一个声音传感器,制作一个“声纹锁”,以后没带钥匙,根据设定好的节拍敲门,门就开了,是不是很方便?


材料

名称 数量
Arduino UNO 一个
声音传感模块 一个
舵机或继电器 一个
面包版 一个
跳线 数根

“声纹锁”原理

当声音传感器检测到一次振动后开始计时,接着第二次振动时算出间隔时间,如果间隔时间满足预先设定好的节拍,并且连续正确到节拍结束,就控制继电器或者舵机打开门。

关于安全性

经过我的测试,节拍长度最好大于10个,另外密码容错最好低于400,声音传感器的灵敏度调低点,就非常安全。再这样的情况,就算是你长时间的随机尝试密码,也不会撞对的。并且,市面上基本没人卖声纹锁,别人做梦也想不到开门的方式是敲门敲对节拍的。

Arduino代码

#include <Servo.h>//声明调用Servo.h库 

#define THRESHOLD 200//密码容错范围

unsigned long t = 0;//基准时间
int key[5][9] = {
  {400, 991, 313, 304, 343, 274, 271, 272, 663},
  {329, 1108, 293, 272, 283, 254, 254, 278, 721},
  {341, 1141, 295, 298, 343, 244, 272, 310, 741},
  {352, 922, 284, 290, 314, 258, 256, 321, 588},
  {559, 1240, 415, 421, 411, 401, 331, 419, 938}
};//声纹密码,义勇军进行曲前10个词的间隔,除去开始的第一个,含有5个节拍是为了适应不同的情况,让识别率更高

int i = 0;//输入的密码位数
Servo servo;//创建一个舵机对象

void setup()
{
  servo.attach(9);//将引脚9上的舵机与声明的舵机对象连接起来
  t = millis();
}

void loop()
{
  int dt = millis() - t;

  if (dt > 2000) {//如果长时间无响应
    t = millis();//时间复位
    i = 0;//密码复位
    servo.write(0);//舵机复位
    return;
  }

  if (analogRead(A0) < 200 && dt > 200) {//检测到声音并且间隔大于200毫秒
    t = millis();
    bool b = false;

    for (int a = 0; a < sizeof(key) / sizeof(key[0]); a++) {
      b = (key[a][i - 1] - THRESHOLD < dt && dt < key[a][i - 1] + THRESHOLD);
      if (b) break;
    }

    if (i == 0 || b) {//判断声音间隔是否落在密码区间
      if (++i > sizeof(key[0]) / sizeof(key[0][0])) {//如果密码输入完成
        i = 0;//密码复位
        servo.write(180);//舵机旋转180度
      }
      return;
    }

    i = 0;//密码复位
  }
}

完善

使用声音做密钥确实是不错的选择,当然你也可以提高密钥的级别,加以判断响度,音调,节奏等等方面,这样的话,才是真正的声纹锁,绝对是非常安全的。

上一篇下一篇

猜你喜欢

热点阅读