将声音传感器与 Arduino 连接并通过 Clap 控制设备

声音传感器与 Arduino 接口教程

准备好倾听您的下一个项目了吗?

这些声音传感器价格便宜、使用简单,并且能够检测声音、拍手声或敲门声。

您可以将它们用于各种声音反应项目,例如让您的灯拍手激活或在您离开时监控您的宠物。

你知道驻极体麦克风的工作原理吗?

麦克风内部有一个薄隔膜和一个背板。总的来说,它们充当电容器。

驻极体麦克风工作.gif

当您对着麦克风说话时,您的声音会产生声波,撞击隔膜,导致其振动。

当隔膜因声音而振动时,极板会靠近或远离,从而导致电容发生变化。结果,金属板上会产生电压,我们可以通过测量电压来确定声音的幅度。

硬件概述

声音传感器是一块小板,包含麦克风 (50Hz-10kHz) 和一些将声波转换为电信号的处理电路。

该电信号被馈送到板载 LM393 高精度比较器,该比较器将其数字化并使其可在 OUT 引脚上使用。

声音传感器灵敏度调节和比较

该模块包括一个电位器,用于调节 OUT 信号的灵敏度。

你可以用它来设置一个阈值,这样当声音的幅度超过阈值时,模块输出低电平,否则输出高电平。

此设置对于在达到特定阈值时触发操作非常有用。例如,当声音的幅度超过阈值(检测到敲击声)时,您可以激活继电器来控制灯光。

逆时针旋转旋钮可提高灵敏度,顺时针旋转可降低灵敏度。

声音传感器电源和状态 LED

该模块还包括两个 LED。当模块打开时,电源 LED 会亮起;当声级超过阈值时,状态 LED 会亮起。

声音传感器引脚分配

声音传感器只有三个引脚:

声音传感器模块引脚排列

电压控制电路为传感器供电。建议传感器供电电压为 3.3V 至 5V。

接地是接地引脚。

出去引脚在安静条件下输出高电平,在检测到声音时输出低电平。您可以将其连接到 Arduino 上的任何数字引脚或直接连接到 5V 继电器。

将声音传感器连接到 Arduino

让我们将声音传感器连接到 Arduino。

连接相当简单。首先将模块的 VCC 引脚连接到 Arduino 的 5V 引脚,并将 GND 引脚接地。

最后,将 OUT 引脚连接到 Arduino 数字引脚 #8。就是这样!

接线如下图所示。

用arduino接线声音传感器

设置阈值

该模块有一个内置电位器,用于设置声音级别阈值,高于该阈值模块输出低电平并且状态 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连接声音传感器和继电器

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 英寸,因此您需要让噪音离它更近才能获得可靠的读数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值