資料介紹
描述
聲音探測器感知聲音。本教程中使用的聲音檢測器類型是數字聲音檢測器,當在環境中檢測到一定級別的聲音時,它會被激活。傳感器板連接到一個小麥克風以拾取聲音
本教程允許您學習如何創建一個帶有聲音檢測器的系統,該系統允許您快速連續兩次打開或關閉導聯。它類似于名為 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聲音傳感器 模擬資料匯總 2次下載
- 一種基于檢測器集層次聚類的否定選擇算法 13次下載
- NDIR氣體檢測器解決方案和PID氣體檢測器解決方案
- 使用Arduino制作檢測PM2.5檢測器的程序詳細資料免費下載 9次下載
- 電阻式溫度檢測器(RTD)基礎知識及參考設計
- 車輛檢測器的低功耗設計 14次下載
- 基于Arduino的PM2_5和溫濕度實時檢測器設計_葉金晶 17次下載
- 電路檢測器和電流檢測器的區別 1013次閱讀
- 手機檢測器電路圖 手機檢測器的功能和應用 1919次閱讀
- 簡單的檢測器電路圖分享 2158次閱讀
- 什么是過零檢測器 過零檢測器的原理 3130次閱讀
- 過零檢測器的原理 3983次閱讀
- 采用Arduino開發板、火焰傳感器和蜂鳴器構建火感檢測器系統 2751次閱讀
- 基于555的聲光數字電平檢測器電路 3016次閱讀
- dfrobotUSB Serial Light Adapter下載器簡介 1384次閱讀
- 熒光檢測器工作原理及特點 5w次閱讀
- 地磁車輛檢測器的應用領域_地磁車輛檢測器與其他車輛檢測技術的優劣對比 4611次閱讀
- 地磁車輛檢測器主要組成部分 4957次閱讀
- 微波運動檢測器 4242次閱讀
- 酸雨檢測器 1.6w次閱讀
- 過零檢測器電路圖2 4604次閱讀
- 過零檢測器電路圖1 5273次閱讀
下載排行
本周
- 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次下載 | 免費
評論
查看更多