Arduino 用声音传感器制作简单的“声纹锁”
前言
之前就一直在想如何用Arduino制作一个门锁,简单廉价,又可以很方便的开门,最后想了一个办法,就是使用一个声音传感器,制作一个“声纹锁”,以后没带钥匙,根据设定好的节拍敲门,门就开了,是不是很方便?
材料
名称数量
Arduino UNO一个声音传感模块一个舵机或继电器一个面包版一个跳线数根
“声纹锁”原理
当声音传感器检测到一次振动后开始计时,接着第二次振动时算出间隔时间,如果间隔时间满足预先设定好的节拍,并且连续正确到节拍结束,就控制继电器或者舵机打开门。
关于安全性
经过我的测试,节拍长度最好大于10个,另外密码容错最好低于400,声音传感器的灵敏度调低点,就非常安全。再这样的情况,就算是你长时间的随机尝试密码,也不会撞对的。并且,市面上基本没人卖声纹锁,别人做梦也想不到开门的方式是敲门敲对节拍的。
Arduino代码
#include <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}
};
int i =
0;
Servo servo;
void setup()
{
servo.attach(
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) {
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);
}
return;
}
i =
0;
}
}
完善
使用声音做密钥确实是不错的选择,当然你也可以提高密钥的级别,加以判断响度,音调,节奏等等方面,这样的话,才是真正的声纹锁,绝对是非常安全的。