电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示
电子发烧友网>电子资料下载>电子资料>Arduino Light Clapper使用声音检测器

Arduino Light Clapper使用声音检测器

2022-11-11 | zip | 0.11 MB | 次下载 | 免费

资料介绍

描述

声音探测器感知声音。教程中使用的声音检测器类型是数字声音检测器,当在环境中检测到一定级别的声音时,它会被激活。传感器板连接到一个小麦克风以拾取声音

本教程允许您学习如何创建一个带有声音检测器的系统,该系统允许您快速连续两次打开或关闭导联。它类似于名为 Clapper 的市售产品,这是一种声音电子开关,可以在用户拍手时激活或禁用与其连接的灯。

原理图,示意图

 

poYBAGNtnzGAK2_ZAAFEz-dB1LI357.png
Arduino 轻拍器
 

 

  • 将声音检测器上的 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);
}
}
}
}
} 

 


下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1山景DSP芯片AP8248A2数据手册
  2. 1.06 MB  |  532次下载  |  免费
  3. 2RK3399完整板原理图(支持平板,盒子VR)
  4. 3.28 MB  |  339次下载  |  免费
  5. 3TC358743XBG评估板参考手册
  6. 1.36 MB  |  330次下载  |  免费
  7. 4DFM软件使用教程
  8. 0.84 MB  |  295次下载  |  免费
  9. 5元宇宙深度解析—未来的未来-风口还是泡沫
  10. 6.40 MB  |  227次下载  |  免费
  11. 6迪文DGUS开发指南
  12. 31.67 MB  |  194次下载  |  免费
  13. 7元宇宙底层硬件系列报告
  14. 13.42 MB  |  182次下载  |  免费
  15. 8FP5207XR-G1中文应用手册
  16. 1.09 MB  |  178次下载  |  免费

本月

  1. 1OrCAD10.5下载OrCAD10.5中文版软件
  2. 0.00 MB  |  234315次下载  |  免费
  3. 2555集成电路应用800例(新编版)
  4. 0.00 MB  |  33566次下载  |  免费
  5. 3接口电路图大全
  6. 未知  |  30323次下载  |  免费
  7. 4开关电源设计实例指南
  8. 未知  |  21549次下载  |  免费
  9. 5电气工程师手册免费下载(新编第二版pdf电子书)
  10. 0.00 MB  |  15349次下载  |  免费
  11. 6数字电路基础pdf(下载)
  12. 未知  |  13750次下载  |  免费
  13. 7电子制作实例集锦 下载
  14. 未知  |  8113次下载  |  免费
  15. 8《LED驱动电路设计》 温德尔著
  16. 0.00 MB  |  6656次下载  |  免费

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935054次下载  |  免费
  3. 2protel99se软件下载(可英文版转中文版)
  4. 78.1 MB  |  537798次下载  |  免费
  5. 3MATLAB 7.1 下载 (含软件介绍)
  6. 未知  |  420027次下载  |  免费
  7. 4OrCAD10.5下载OrCAD10.5中文版软件
  8. 0.00 MB  |  234315次下载  |  免费
  9. 5Altium DXP2002下载入口
  10. 未知  |  233046次下载  |  免费
  11. 6电路仿真软件multisim 10.0免费下载
  12. 340992  |  191187次下载  |  免费
  13. 7十天学会AVR单片机与C语言视频教程 下载
  14. 158M  |  183279次下载  |  免费
  15. 8proe5.0野火版下载(中文版免费下载)
  16. 未知  |  138040次下载  |  免费