资料介绍
描述
声音探测器感知声音。本教程中使用的声音检测器类型是数字声音检测器,当在环境中检测到一定级别的声音时,它会被激活。传感器板连接到一个小麦克风以拾取声音
本教程允许您学习如何创建一个带有声音检测器的系统,该系统允许您快速连续两次打开或关闭导联。它类似于名为 Clapper 的市售产品,这是一种声音电子开关,可以在用户拍手时激活或禁用与其连接的灯。
原理图,示意图
- 将声音检测器上的 VCC 引脚连接到 Arduino 的 3.3-V 引脚。
- 将声音探测器上的 GND 引脚连接到 Arduino 的 GND 引脚。
- 将声音探测器上的输出引脚连接到 Arduino 的数字引脚 8。
- 将 LED 的负极连接到 Arduino 的 GND 引脚。
- 将 LED 的正极连接到 Arduino 的数字引脚 7
程序
int NumberSounds = 0;
int SoundPin = 8;
int RawValue = 0;
int NumberClaps = 0;
int LightOn = 0;
unsigned long SoundDetectedTime = 0;
unsigned long PreviousSoundDetectedTime = 0;
int UniqueClapMinTime = 100;
int LEDPin = 7;
unsigned long PreviousClapTime = 0;
unsigned long CurrentClapTime = 0;
unsigned long MaxTimeBetweenClaps = 2000;
void setup()
{
pinMode(SoundPin, INPUT);
pinMode(LEDPin, OUTPUT);
Serial.begin(9600);
Serial.println("The Light Clapper ...");
}
int IsSoundPartOfUniqueClap()
{
int result = 0;
unsigned long ElapsedTime =
SoundDetectedTime -
PreviousSoundDetectedTime;
if (ElapsedTime >= UniqueClapMinTime)
{
result = 1;
}
return result;
}
int CheckTurnOnOffLight()
{
int result = 0;
unsigned long ElapsedTime =
CurrentClapTime - PreviousClapTime;
if (ElapsedTime <= MaxTimeBetweenClaps)
{
if (NumberClaps == 2)
{
result = 1;
NumberClaps = 0;
}
}
else
{
NumberClaps = 1;
}
return result;
}
void loop()
{
RawValue = digitalRead(SoundPin);
if (RawValue == 0)
{
Serial.print("SOUND DETECTED ... ");
Serial.print(", Sound Number: ");
Serial.print(NumberSounds);
Serial.print(", RawValue: ");
Serial.println(RawValue);
NumberSounds++;
// Process raw data for claps
PreviousSoundDetectedTime =
SoundDetectedTime;
SoundDetectedTime = millis();
if(IsSoundPartOfUniqueClap())
{
NumberClaps++;
// Update Clap Times
PreviousClapTime =
CurrentClapTime;
CurrentClapTime = millis();
// Turn Light ON/OFF as needed
if (CheckTurnOnOffLight())
{
LightOn = ~LightOn;
if (LightOn)
{
digitalWrite(LEDPin, HIGH);
}
else
{
digitalWrite(LEDPin, LOW);
}
}
}
}
}
程序分析
自程序启动并初始化为 0 以来,声音检测器检测到的声音数量是变量 NumberSounds:
int NumberSounds = 0;
声音探测器上的输出引脚分配给 Arduino 的数字引脚 8:
int SoundPin = 8;
RawValue 变量保存声音检测器的状态并初始化为 0:
int RawValue = 0;
NumberClaps 变量存储当前的掌声计数,以切换 LED 灯所需的两次。这是开始 0 拍手:
int NumberClaps = 0;
如果 LED 已打开,则 LightOn 变量为非零,否则为 0。这里初始化为0:
int LightOn = 0;
SoundDetectedTime 变量存储最后检测到的声音的时间,并用于计算不同拍手的数量,因为单个拍手可以生成多个正的声音检测器读数。此变量的初始值为 0:
unsigned long SoundDetectedTime = 0;
PreviousSoundDetectedTime 变量保存上一次检测到的声音的时间,并用于确定唯一拍手的数量:
unsigned long PreviousSoundDetectedTime = 0;
UniqueClapMinTime 变量存储检测到的声音之间的最小时间间隔(以毫秒为单位),程序必须将其识别为唯一的拍手:
int UniqueClapMinTime = 100;
LEDPin 变量代表数字引脚 7,它连接到 LED 的正极端子:
int LEDPin = 7;
PreviousClapTime 变量保存上一次拍手发生的时间(以毫秒为单位)并初始化为 0:
unsigned long PreviousClapTime = 0;
CurrentClapTime 变量保存当前拍手发生的时间(以毫秒为单位)并初始化为 0:
unsigned long CurrentClapTime = 0;
MaxTimeBetweenClaps 变量指定可用于切换 LED 灯的两次连续拍手之间的最长时间。默认情况下,超时值设置为 2、000 毫秒或 2 秒。
unsigned long MaxTimeBetweenClaps = 2000;
setup() 函数初始化程序并:
1. 将连接到声音检测器输出引脚的 Arduino 引脚设置为输入引脚,以便可以测量电压。
2. 将连接到 LED 正极端子的 Arduino 引脚设置为输出引脚,它可以向 LED 提供电压并驱动 LED。
3. 初始化串行监视器并将通信速度设置为 9、600 波特。
4. 向串行监视器打印一条指示程序已启动的文本消息。
void setup()
{
1.pinMode(SoundPin, INPUT);
2. pinMode(LEDPin, OUTPUT);
3. Serial.begin(9600);
3. Serial.println("The Light Clapper ...");
}
IsSoundPartOfUniqueClap() 函数确定声音检测器检测到的声音是新的唯一拍手的开始还是当前拍手的继续。这是通过以下方式实现的:
计算自检测到上一个声音以来经过的时间。
如果此时间大于或等于识别唯一拍手所需的最短时间,则该函数返回 1。
否则,函数返回 0。
int IsSoundPartOfUniqueClap()
{
int result = 0;
unsigned long ElapsedTime =
SoundDetectedTime -
PreviousSoundDetectedTime;
if (ElapsedTime >= UniqueClapMinTime)
{
result = 1;
}
return result;
}
CheckTurnOnOffLight() 函数通过在两秒内检测到两次连续拍手来确定是否应切换 LED。这是通过以下方式实现的:
计算当前检测到的拍手和之前检测到的拍手之间的经过时间。
如果经过的时间小于或等于拍手之间的最大允许时间,则如果检测到的拍手次数为 2,则将返回值设置为 1,这意味着应切换 LED 开/关状态,并重置检测到的拍手次数为 0。
如果经过的时间大于拍手之间的最大允许时间,则将检测到的拍手数设置为 1,以指示当前检测到的拍手是两次拍手打开/关闭序列的唯一有效拍手。
如果应该切换 LED,则返回 1,否则返回 0。
int CheckTurnOnOffLight()
{
int result = 0;
unsigned long ElapsedTime =
CurrentClapTime - PreviousClapTime;
if (ElapsedTime <= MaxTimeBetweenClaps)
{
if (NumberClaps == 2)
{
result = 1;
NumberClaps = 0;
}
}
else
{
NumberClaps = 1;
}
return result;
}
loop() 函数读取声音检测器的输出,确定检测到的声音是唯一的拍手还是先前拍手的延续,确定是否检测到两次拍手序列,如果是,则切换 LED 灯。这是通过以下方式实现的:
读取声音检测器的状态。
如果读取的值等于 0,表示检测到声音,则函数:
将一些调试信息打印到串行监视器。
更新跟踪当前声音检测事件和先前声音检测事件的时间的变量。
如果此声音检测事件是新的独特鼓掌的一部分,则函数:
将检测到的拍手次数增加 1。
更新前一次拍手和当前拍手的时间。
如果在 2 秒内发生了两次连续拍手,则函数:
通过对 LightOn 变量执行按位非运算来切换 LED 状态变量。
如果 LightOn 变量的计算结果为真(非零),则打开 LED。
如果 LightOn 变量的计算结果为假(零),则关闭 LED。
void loop()
{
RawValue = digitalRead(SoundPin);
if (RawValue == 0)
{
Serial.print("SOUND DETECTED ... ");
Serial.print(", Sound Number: ");
Serial.print(NumberSounds);
Serial.print(", RawValue: ");
Serial.println(RawValue);
NumberSounds++;
// Process raw data for claps
PreviousSoundDetectedTime =
SoundDetectedTime;
SoundDetectedTime = millis();
if(IsSoundPartOfUniqueClap())
{
NumberClaps++;
// Update Clap Times
PreviousClapTime =
CurrentClapTime;
CurrentClapTime = millis();
// Turn Light ON/OFF as needed
if (CheckTurnOnOffLight())
{
LightOn = ~LightOn;
if (LightOn)
{
digitalWrite(LEDPin, HIGH);
}
else
{
digitalWrite(LEDPin, LOW);
}
}
}
}
}
- 带LCD的Arduino EMF鬼检测器
- 使用Arduino和雨滴传感器的雨量检测器
- Arduino音乐:音符和和弦检测器
- Arduino声音检测传感器项目 2次下载
- ARDUINO LPG气体泄漏检测器 0次下载
- Arduino使用KY-003或KY-035的磁场检测器
- 使用arduino UNO的轴检测器
- Arduino Uno掉电检测器和记录器
- arduino声音传感器 模拟资料汇总 0次下载
- 一种基于检测器集层次聚类的否定选择算法 13次下载
- NDIR气体检测器解决方案和PID气体检测器解决方案
- 使用Arduino制作检测PM2.5检测器的程序详细资料免费下载 9次下载
- 电阻式温度检测器(RTD)基础知识及参考设计
- 车辆检测器的低功耗设计 13次下载
- 基于Arduino的PM2_5和温湿度实时检测器设计_叶金晶 17次下载
- 电路检测器和电流检测器的区别 319次阅读
- 手机检测器电路图 手机检测器的功能和应用 651次阅读
- 简单的检测器电路图分享 1650次阅读
- 什么是过零检测器 过零检测器的原理 2755次阅读
- 过零检测器的原理 3669次阅读
- 采用Arduino开发板、火焰传感器和蜂鸣器构建火感检测器系统 2381次阅读
- 基于555的声光数字电平检测器电路 2856次阅读
- dfrobotUSB Serial Light Adapter下载器简介 1241次阅读
- 荧光检测器工作原理及特点 4.9w次阅读
- 地磁车辆检测器的应用领域_地磁车辆检测器与其他车辆检测威廉希尔官方网站 的优劣对比 4517次阅读
- 地磁车辆检测器主要组成部分 4833次阅读
- 微波运动检测器 4083次阅读
- 酸雨检测器 1.6w次阅读
- 过零检测器电路图2 4386次阅读
- 过零检测器电路图1 5060次阅读
下载排行
本周
- 1山景DSP芯片AP8248A2数据手册
- 1.06 MB | 532次下载 | 免费
- 2RK3399完整板原理图(支持平板,盒子VR)
- 3.28 MB | 339次下载 | 免费
- 3TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 4DFM软件使用教程
- 0.84 MB | 295次下载 | 免费
- 5元宇宙深度解析—未来的未来-风口还是泡沫
- 6.40 MB | 227次下载 | 免费
- 6迪文DGUS开发指南
- 31.67 MB | 194次下载 | 免费
- 7元宇宙底层硬件系列报告
- 13.42 MB | 182次下载 | 免费
- 8FP5207XR-G1中文应用手册
- 1.09 MB | 178次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33566次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21549次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6656次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537798次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420027次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191187次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183279次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多