准备好倾听您的下一个项目了吗?
这些声音传感器价格便宜、使用简单,并且能够检测声音、拍手声或敲门声。
您可以将它们用于各种声音反应项目,例如让您的灯拍手激活或在您离开时监控您的宠物。
你知道驻极体麦克风的工作原理吗?
麦克风内部有一个薄隔膜和一个背板。总的来说,它们充当电容器。
当您对着麦克风说话时,您的声音会产生声波,撞击隔膜,导致其振动。
当隔膜因声音而振动时,极板会靠近或远离,从而导致电容发生变化。结果,金属板上会产生电压,我们可以通过测量电压来确定声音的幅度。
硬件概述
声音传感器是一块小板,包含麦克风 (50Hz-10kHz) 和一些将声波转换为电信号的处理电路。
该电信号被馈送到板载 LM393 高精度比较器,该比较器将其数字化并使其可在 OUT 引脚上使用。
该模块包括一个电位器,用于调节 OUT 信号的灵敏度。
你可以用它来设置一个阈值,这样当声音的幅度超过阈值时,模块输出低电平,否则输出高电平。
此设置对于在达到特定阈值时触发操作非常有用。例如,当声音的幅度超过阈值(检测到敲击声)时,您可以激活继电器来控制灯光。
逆时针旋转旋钮可提高灵敏度,顺时针旋转可降低灵敏度。
该模块还包括两个 LED。当模块打开时,电源 LED 会亮起;当声级超过阈值时,状态 LED 会亮起。
声音传感器引脚分配
声音传感器只有三个引脚:
电压控制电路为传感器供电。建议传感器供电电压为 3.3V 至 5V。
接地是接地引脚。
出去引脚在安静条件下输出高电平,在检测到声音时输出低电平。您可以将其连接到 Arduino 上的任何数字引脚或直接连接到 5V 继电器。
将声音传感器连接到 Arduino
让我们将声音传感器连接到 Arduino。
连接相当简单。首先将模块的 VCC 引脚连接到 Arduino 的 5V 引脚,并将 GND 引脚接地。
最后,将 OUT 引脚连接到 Arduino 数字引脚 #8。就是这样!
接线如下图所示。
设置阈值
该模块有一个内置电位器,用于设置声音级别阈值,高于该阈值模块输出低电平并且状态 LED 亮起。
现在,要设置阈值,请用靠近麦克风的手指单击并调整电位器,直到模块的状态 LED 因您的单击而闪烁。
这里的所有都是它的; 您的模块现在可以使用了。
示例 1 – 基本声音检测
以下简单示例检测拍手或啪啪声并在串行监视器上显示一条消息。继续尝试草图;我们稍后会详细讨论。
<span style="color:#191919"><span style="background-color:#ffffff"><span style="background-color:#fafafa"><code class="language-c">#define sensorPin 8
<span style="color:#0d904f">// Variable to store the time when last event happened</span>
<span style="color:#3b78e7">unsigned</span> <span style="color:#3b78e7">long</span> lastEvent = <span style="color:#c53929">0</span>;
<span style="color:#3b78e7">void</span> <span style="color:#3b78e7">setup</span>() {
<span style="color:#3b78e7">pinMode</span>(sensorPin, INPUT); <span style="color:#0d904f">// Set sensor pin as an INPUT</span>
Serial.<span style="color:#3b78e7">begin</span>(<span style="color:#c53929">9600</span>);
}
<span style="color:#3b78e7">void</span> <span style="color:#3b78e7">loop</span>() {
<span style="color:#0d904f">// Read Sound sensor</span>
<span style="color:#3b78e7">int</span> sensorData = <span style="color:#3b78e7">digitalRead</span>(sensorPin);
<span style="color:#0d904f">// If pin goes LOW, sound is detected</span>
<span style="color:#3b78e7">if</span> (sensorData == LOW) {
<span style="color:#0d904f">// If 25ms have passed since last LOW state, it means that</span>
<span style="color:#0d904f">// the clap is detected and not due to any spurious sounds</span>
<span style="color:#3b78e7">if</span> (<span style="color:#3b78e7">millis</span>() - lastEvent > <span style="color:#c53929">25</span>) {
Serial.<span style="color:#3b78e7">println</span>(<span style="color:#d81b60">"Clap detected!"</span>);
}
<span style="color:#0d904f">// Remember when last event happened</span>
lastEvent = <span style="color:#3b78e7">millis</span>();
}
}</code></span></span></span>
如果一切正常,当检测到拍手声时,您应该在串行监视器上看到以下输出。
代码说明:
该草图首先声明传感器 OUT 引脚所连接的 Arduino 引脚。
<span style="color:#191919"><span style="background-color:#ffffff"><span style="background-color:#fafafa"><code class="language-c">#define sensorPin 8</code></span></span></span>
接下来,我们定义一个名为 的变量lastEvent
,用于存储先前检测到拍手的时间。它将帮助我们减少意外的声音检测。
<span style="color:#191919"><span style="background-color:#ffffff"><span style="background-color:#fafafa"><code class="language-c"><span style="color:#3b78e7">unsigned</span> <span style="color:#3b78e7">long</span> lastEvent = <span style="color:#c53929">0</span>;</code></span></span></span>
在设置部分,我们将传感器的 OUT 引脚配置为输入并建立串行通信。
<span style="color:#191919"><span style="background-color:#ffffff"><span style="background-color:#fafafa"><code class="language-c"><span style="color:#3b78e7">pinMode</span>(sensorPin, INPUT);
Serial.<span style="color:#3b78e7">begin</span>(<span style="color:#c53929">9600</span>);</code></span></span></span>
在循环部分,我们首先读取传感器输出。
<span style="color:#191919"><span style="background-color:#ffffff"><span style="background-color:#fafafa"><code class="language-c"><span style="color:#3b78e7">int</span> sensorData = <span style="color:#3b78e7">digitalRead</span>(sensorPin);</code></span></span></span>
当传感器检测到声音大到超过阈值时,输出变为低电平。但是,我们必须确保声音是由鼓掌引起的,而不是由背景噪音引起的。因此,我们在输出变低后等待 25 毫秒。如果输出保持低电平超过 25 毫秒,串行监视器上将打印消息“检测到拍手”。
<span style="color:#191919"><span style="background-color:#ffffff"><span style="background-color:#fafafa"><code class="language-c"><span style="color:#3b78e7">if</span> (sensorData == LOW) {
<span style="color:#3b78e7">if</span> (<span style="color:#3b78e7">millis</span>() - lastEvent > <span style="color:#c53929">25</span>) {
Serial.<span style="color:#3b78e7">println</span>(<span style="color:#d81b60">"Clap detected!"</span>);
}
lastEvent = <span style="color:#3b78e7">millis</span>();
}</code></span></span></span>
示例 2 – 使用 Clap 控制设备
对于我们的下一个项目,我们将使用声音传感器创建一个“Clapper”,通过拍手激活交流供电设备。
该项目使用单通道继电器模块控制交流供电设备。如果您不熟悉继电器模块,请考虑阅读下面的教程。
接线
该项目的接线很简单。
警告: |
让我们首先为传感器和继电器模块提供电源。将它们的 VCC 引脚连接到 Arduino 的 5V 引脚,并将 GND 接地。
将声音传感器的输出引脚 (OUT) 连接到 Arduino 上的数字引脚 #7,将继电器模块的控制引脚 (IN) 连接到数字引脚 #8。
您还需要将继电器模块连接到您尝试控制的交流供电设备。您需要切断带电的交流电线路,并将切断的电线(来自墙壁)的一端连接到 COM,另一端连接到 NO。
接线如下图所示。
Arduino代码
这是用拍手控制设备的代码。
<span style="color:#191919"><span style="background-color:#ffffff"><span style="background-color:#fafafa"><code class="language-c">#define sensorPin 7
#define relayPin 8
<span style="color:#0d904f">// Variable to store the time when last event happened</span>
<span style="color:#3b78e7">unsigned</span> <span style="color:#3b78e7">long</span> lastEvent = <span style="color:#c53929">0</span>;
boolean relayState = false; <span style="color:#0d904f">// Variable to store the state of relay</span>
<span style="color:#3b78e7">void</span> <span style="color:#3b78e7">setup</span>() {
<span style="color:#3b78e7">pinMode</span>(relayPin, OUTPUT); <span style="color:#0d904f">// Set relay pin as an OUTPUT pin</span>
<span style="color:#3b78e7">pinMode</span>(sensorPin, INPUT); <span style="color:#0d904f">// Set sensor pin as an INPUT</span>
}
<span style="color:#3b78e7">void</span> <span style="color:#3b78e7">loop</span>() {
<span style="color:#0d904f">// Read Sound sensor</span>
<span style="color:#3b78e7">int</span> sensorData = <span style="color:#3b78e7">digitalRead</span>(sensorPin);
<span style="color:#0d904f">// If pin goes LOW, sound is detected</span>
<span style="color:#3b78e7">if</span> (sensorData == LOW) {
<span style="color:#0d904f">// If 25ms have passed since last LOW state, it means that</span>
<span style="color:#0d904f">// the clap is detected and not due to any spurious sounds</span>
<span style="color:#3b78e7">if</span> (<span style="color:#3b78e7">millis</span>() - lastEvent > <span style="color:#c53929">25</span>) {
<span style="color:#0d904f">//toggle relay and set the output</span>
relayState = !relayState;
<span style="color:#3b78e7">digitalWrite</span>(relayPin, relayState ? HIGH : LOW);
}
<span style="color:#0d904f">// Remember when last event happened</span>
lastEvent = <span style="color:#3b78e7">millis</span>();
}
}</code></span></span></span>
完成后,每次拍手时传感器都会打开或关闭设备。
代码说明:
如果将此草图与我们之前的草图进行比较,您会发现许多相似之处,但也有一些差异。
首先,我们声明继电器控制引脚 (IN) 连接的 Arduino 引脚。此外,我们定义了一个新变量relayState
来跟踪继电器的状态。
<span style="color:#191919"><span style="background-color:#ffffff"><span style="background-color:#fafafa"><code class="language-c">#define relayPin 7
boolean relayState = false;</code></span></span></span>
在设置中,我们将其配置relayPin
为输出。
<span style="color:#191919"><span style="background-color:#ffffff"><span style="background-color:#fafafa"><code class="language-c"><span style="color:#3b78e7">pinMode</span>(relayPin, OUTPUT);</code></span></span></span>
当我们检测到拍手声时,我们只需切换继电器的状态,而不是在串行监视器上打印消息。
<span style="color:#191919"><span style="background-color:#ffffff"><span style="background-color:#fafafa"><code class="language-c">relayState = !relayState;
<span style="color:#3b78e7">digitalWrite</span>(relayPin, relayState ? HIGH : LOW);</code></span></span></span>
故障排除
如果声音传感器出现异常,请尝试以下步骤。
- 确保电源清洁。由于声音传感器是模拟电路,因此对电源噪声比较敏感。
- 该传感器还对机械振动和风噪声敏感。将传感器安装到固体基板上可以减少其中一些振动。
- 该声音传感器的感应范围非常短,可能只有 10 英寸,因此您需要让噪音离它更近才能获得可靠的读数。