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

xiaoxiao2021-02-28  23

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

前言

之前就一直在想如何用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;//密码复位 } }

完善

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

转载请注明原文地址: https://www.6miu.com/read-2350251.html

最新回复(0)