這個項目將教你如何在 Arduino 中使用 KY-037 聲音檢測傳感器,并且測量環(huán)境中聲音強度的變化。
能夠?qū)W到什么
KY-037聲音檢測傳感器介紹
KY-037聲音檢測模塊如何配合Arduino使用
KY-037聲音檢測傳感器
該模塊由一個用于檢測聲音的靈敏電容麥克風和一個放大電路組成。該模塊的輸出是模擬和數(shù)字的。數(shù)字輸出作為一個鍵,當聲音強度達到一定閾值時激活。靈敏度閾值可以通過傳感器上的電位器進行調(diào)整。
模擬輸出電壓隨麥克風接收到的聲音強度而變化。您可以將此輸出連接到 Arduino 模擬引腳并處理輸出電壓。
將 KY-037 聲音檢測模塊與 Arduino 連接
要將此模塊與 Arduino 一起使用,只需連接模塊的電源電壓,然后根據(jù)需要將其模擬或數(shù)字引腳連接到 Arduino。
這里我們使用模擬輸出。
電路
如下圖將傳感器連接到 Arduino
代碼
連接電路后,請執(zhí)行以下步驟:
第 1 步:在您的 Arduino 板上上傳以下代碼:
void setup() {
Serial.begin(9600); // setup serial
}
void loop() {
Serial.println(analogRead(A0));
delay(100);
}?
第 2 步:打開串行監(jiān)視器窗口
現(xiàn)在轉(zhuǎn)動電位器以關閉數(shù)字輸出上的 LED。在 LED 熄滅后立即記下串行監(jiān)視器中顯示的數(shù)字。
在圖表上顯示傳感器的模擬輸出
將傳感器的模擬輸出連接到 Arduino A0 引腳并在您的 Arduino 板上上傳以下代碼。然后從工具菜單中選擇串行繪圖儀。
第 3 步:在以下代碼中寫下您之前記下的數(shù)字(作為閾值變量)并將代碼上傳到您的板上。
/*
KY-037 Sound Detection Sensor + Arduino
modified on 16 Apr 2019
by Mohammadreza Akbari @ Electropeak
https://electropeak.com/learn/
*/
int sensor_value = 0;
int threshold = 540; //Enter Your threshold value here
int abs_value = 0;
int ledCount = 10; //number of Bargraph LEDs
int bargraph[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // Bargraph pins
void setup() {
Serial.begin(9600); // setup serial
for (int i = 0; i <= ledCount; i++) // Define bargraph pins OUTPUT
{
pinMode(bargraph[i], OUTPUT);
}
for (int i = 0; i <= 9; i++)
{
digitalWrite(i, LOW);
}
}
void loop() {
sensor_value = analogRead(A0);
abs_value = abs(sensor_value - threshold);
int ledLevel = map(abs_value, 0, (1024 - threshold), 0, ledCount);
for (int i = 0; i < ledCount; i++) {
// if the array element's index is less than ledLevel,
// turn the pin for this element on:
if (i < ledLevel) {
digitalWrite(bargraph[i], HIGH);
Serial.println(i);
}
// turn off all pins higher than the ledLevel:
else {
digitalWrite(bargraph[i], LOW);
}
}
}
未來可能的拓展
當聲音達到特定閾值時,設備開始自動存儲聲音。(可以使用VS1053等模塊來存儲音頻。)
傳感器部分:
/*
KY-037 Sound Detection Sensor + Arduino
modified on 16 Apr 2019
by Mohammadreza Akbari @ Electropeak
https://electropeak.com/learn/
*/
int sensor_value = 0;
int threshold = 540; //Enter Your threshold value here
int abs_value = 0;
int ledCount = 10; //number of Bargraph LEDs
int bargraph[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // Bargraph pins
void setup() {
Serial.begin(9600); // setup serial
for (int i = 0; i <= ledCount; i++) // Define bargraph pins OUTPUT
{
pinMode(bargraph[i], OUTPUT);
}
for (int i = 0; i <= 9; i++)
{
digitalWrite(i, LOW);
}
}
void loop() {
sensor_value = analogRead(A0);
abs_value = abs(sensor_value - threshold);
int ledLevel = map(abs_value, 0, (1024 - threshold), 0, ledCount);
for (int i = 0; i < ledCount; i++) {
// if the array element's index is less than ledLevel,
// turn the pin for this element on:
if (i < ledLevel) {
digitalWrite(bargraph[i], HIGH);
Serial.println(i);
}
// turn off all pins higher than the ledLevel:
else {
digitalWrite(bargraph[i], LOW);
}
}
}
評論
查看更多