声控模块

作者:hardihuang   hardihuang   
声音传感器与Arduino接口的教程

准备加入下一个项目了吗?

这些声音传感器价格低廉,易于连接,并且能够检测声音,拍手或敲门声。

您可以将它们用于各种声音反应性项目,例如,使拍手声拍手或在宠物不在时保持“耳”动。

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

麦克风内部是薄的振膜,实际上是一块电容器。第二块板是背板,背板靠近并平行于隔膜。

驻极体麦克风working.gif

当您对着麦克风讲话时,您的声音所产生的声波会​​撞击振动膜,从而引起振动。

当振动膜片响应声音而振动时,电容会随着板块彼此靠近或分开而发生变化。

随着电容的变化,板上的电压也发生变化,这可以通过测量确定声音的幅度。

硬件总览 #

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

该电信号被馈送到板载LM393高精度比较器以对其进行数字化,并通过OUT引脚提供。

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

该模块具有一个内置电位计,用于调节OUT信号的灵敏度。

您可以使用电位计来设置阈值。因此,当声音的振幅超过阈值时,模块将输出LOW,否则输出HIGH。

当您要在达到特定阈值时触发操作时,此设置非常有用。例如,当声音的振幅超过阈值时(当检测到爆震时),您可以激活继电器以控制光。你有主意!

提示

逆时针旋转旋钮增加灵敏度,顺时针旋转旋钮降低灵敏度。
声音传感器电源和状态指示灯

除此之外,该模块还具有两个LED。模块通电后,电源LED指示灯将点亮。当数字输出变低时,状态LED会亮起。

声音传感器引脚 #

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

声音传感器模块引脚

VCC引脚为传感器供电。建议以3.3V – 5V之间的电压为传感器供电。

地线 是接地连接。

出去当环境安静时,该引脚输出高电平;当检测到声音时,该引脚输出低电平。您可以将其连接到Arduino上的任何数字引脚,或直接连接到5V继电器或类似设备。

用Arduino接线声音传感器 #

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

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

现在,将OUT引脚连接到Arduino上的数字引脚#7。就是这样!

下图显示了接线。

带有arduino的布线声音传感器

校准声音传感器 #

为了从声音传感器中获取准确的读数,建议您首先对其进行校准。

该模块具有内置的电位计,用于校准数字输出(OUT)。

通过旋转电位计的旋钮,可以设置阈值。因此,当声音水平超过阈值时,状态LED会亮起,数字输出(OUT)将输出为低。

现在要校准传感器,开始在麦克风附近拍手并调节电位器,直到看到模块上的状态LED响应拍手而闪烁。

就是这样,您的传感器现在已校准并可以使用。

检测声音–基本示例 #

现在您已经连接好了声音传感器,您将需要一个草图以使其全部正常工作。

以下示例检测到拍手或咔嗒声,并在串行监视器上打印消息。继续,尝试一下草图;然后我们将对其进行详细剖析。

#define sensorPin 7

// Variable to store the time when last event happened
unsigned long lastEvent = 0;

void setup() {
	pinMode(sensorPin, INPUT);	// Set sensor pin as an INPUT
	Serial.begin(9600);
}

void loop() {
	// Read Sound sensor
	int sensorData = digitalRead(sensorPin);

	// If pin goes LOW, sound is detected
	if (sensorData == LOW) {
		
		// If 25ms have passed since last LOW state, it means that
		// the clap is detected and not due to any spurious sounds
		if (millis() - lastEvent > 25) {
			Serial.println("Clap detected!");
		}
		
		// Remember when last event happened
		lastEvent = millis();
	}
}

如果一切正常,检测到拍手时,您应该在串行监视器上看到以下输出。

声音传感器输出

解释:

草图从声明传感器的OUT引脚已连接到Arduino引脚的声明开始。

#define sensorPin 7

接下来,我们定义一个名为的变量lastEvent,用于存储从检测到拍手起的时间。这将有助于我们消除虚假声音。

unsigned long lastEvent = 0;

在“设置”部分中,我们将传感器的信号引脚声明为输入。我们还设置了串行监视器。

pinMode(sensorPin, INPUT);
Serial.begin(9600);

在循环部分,我们首先读取传感器的数字输出。

int sensorData = digitalRead(sensorPin);

当传感器检测到任何声音足以超过阈值时,输出将变为低电平。但是我们必须确保声音是由于拍手而不是杂散的背景噪声引起的。因此,我们等待25毫秒。如果输出保持LOW超过25毫秒,则声明检测到了拍手。

if (sensorData == LOW) {
	if (millis() - lastEvent > 25) {
		Serial.println("Clap detected!");
	}
	lastEvent = millis();
}

拍手控制装置 #

在我们的下一个项目中,我们将使用声音传感器作为“拍板”,通过拍手打开交流电源设备。

该项目使用一个通道中继模块来控制交流供电设备。如果您不熟悉继电器模块,请考虑阅读(至少略读)以下教程。将一个通道中继模块与Arduino接口有时您希望Arduino控制交流电源设备,例如灯,风扇或其他家用设备。但是由于Arduino的工作电压为5伏,所以…

接线

该项目的接线非常简单。

危险

此板与高交流电压相互作用。不正确或不正确的使用可能会导致严重的人身伤害甚至死亡。因此,它适用于有经验并了解高交流电压的人们。

首先,您需要为传感器和继电器模块供电。将其VCC引脚连接至Arduino的5V引脚,并将GND接地。

接下来,将声音传感器上的输出引脚(OUT)连接到Arduino上的数字引脚#7,并将继电器模块上的控制引脚(IN)连接到数字引脚#8。

您还需要将继电器模块与要控制的交流电源设备对齐。您必须切断交流电源线,并将切断电线的一端(从墙壁上引出)连接至COM,另一端连接至NO。

下图显示了接线。

用arduino接线声音传感器和继电器

Arduino代码

这是拍手控制设备的示意图。

#define sensorPin 7
#define relayPin 8

// Variable to store the time when last event happened
unsigned long lastEvent = 0;
boolean relayState = false;    // Variable to store the state of relay

void setup() {
	pinMode(relayPin, OUTPUT);  // Set relay pin as an OUTPUT pin
	pinMode(sensorPin, INPUT);  // Set sensor pin as an INPUT
}

void loop() {
	// Read Sound sensor
	int sensorData = digitalRead(sensorPin);

	// If pin goes LOW, sound is detected
	if (sensorData == LOW) {

	// If 25ms have passed since last LOW state, it means that
	// the clap is detected and not due to any spurious sounds
	if (millis() - lastEvent > 25) {
		//toggle relay and set the output
		relayState = !relayState;
		digitalWrite(relayPin, relayState ? HIGH : LOW);
	}

	// Remember when last event happened
	lastEvent = millis();
	}
}

一旦在连接硬件的情况下加载并运行该程序,传感器就会在每次鼓掌时打开或关闭设备。

解释:

如果将此草图与我们先前的草图进行比较,您会发现许多相似之处,除了几件事之外。

首先,我们声明与继电器控制引脚(IN)连接的Arduino引脚。我们还定义了一个新变量relayState来存储继电器的状态。

#define relayPin 7

boolean relayState = false;

在安装程序中,我们将定义relayPin为输出。

pinMode(relayPin, OUTPUT);

现在,当我们检测到拍手的声音时,无需在串行监视器上打印消息,只需切换继电器的状态即可。

relayState = !relayState;
digitalWrite(relayPin, relayState ? HIGH : LOW);

故障排除 #

如果声音传感器行为异常,请尝试以下步骤。

  1. 仔细检查电源是否干净。因为声音传感器是模拟电路,所以它对电源上的噪声更敏感。
  2. 声音传感器上的驻极体麦克风也对机械振动和风噪声敏感。用弹性材料安装它可以帮助吸收振动。
  3. 该声音传感器的感应范围非常小,可能为10英寸,因此您必须使噪声更近才能获得良好的响应。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注