吴忠躺衫网络科技有限公司

電子發燒友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次下載  |  免費
娱乐场| 百家乐官网哪条下路好| 百家乐官网是哪个国家| 百家乐官网概率怎么算| 缅甸百家乐官网玩假吗| 百家乐官网赌场娱乐网规则| 哪家百家乐官网优惠最好且信誉不错| 百家乐官网自动投注| 百家乐翻天qvod| 百家乐桌码合| 水果机破解器| 波音网址| 真人百家乐官网海立方| 鼎龙百家乐官网的玩法技巧和规则 | 百家乐投注秘笈| 百家乐策略介绍| 棋牌游戏| 博E百百家乐官网现金网| 如何玩百家乐官网的玩法技巧和规则 | 百家乐大天堂| 大发888缺少casino组件common| 贞丰县| 模拟百家乐官网的玩法技巧和规则| 百家乐官网的路单怎样看| 有钱人百家乐官网的玩法技巧和规则| 粤港澳百家乐娱乐| 金皇冠娱乐城| 赌场百家乐官网打法| 百家乐扑克桌布| 大发888pt| 定制百家乐官网桌垫| 百家乐波音平台开户导航| 德州扑克发牌视频| 百家乐官网赢足球博彩皇冠| 百家乐打庄技巧| 大发888客户端安装| 百家乐官网游戏平台排名| 川宜百家乐注册号| 易玩棋牌怎么样| 百家乐官网007| 百家乐游戏大|