风筝
发表于: 2023-2-23 12:08:13 | 显示全部楼层

准备好给您的下一个项目添加一双耳朵了吗?这些声音传感器价格低廉、使用简单,并且能够检测语音、拍手声或者敲门声。


您可以将它们用于各种声音反应项目,例如拍手点亮灯,或监控您的宠物。


硬件概述

声音传感器(Sound Sensor)电路板包含一个麦克风 (50Hz-10kHz) 和一些处理电路,用于将声波转换为电信号。


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

Sound-Sensor-Sensitivity-Adjustment-and-Comparator.png


该模块包括一个用于调节OUT信号灵敏度的电位器。你可以用它来设置一个阈值,这样当声音的幅度超过阈值时,模块输出LOW,否则输出HIGH。


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

Sound-Sensor-Power-and-Status-LEDs.png


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


声音传感器的引脚分布

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

Sound-Sensor-Module-Pinout.png

VCC 为传感器供电。 建议传感器由3.3V至5V供电。

GND 是接地引脚。

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


将声音传感器连接到Arduino

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


连接相当简单。首先将模块的VCC引脚连接到Arduino的5V引脚,并将GND引脚接地。最后,将OUT引脚连接到Arduino的数字引脚#8。


接线如下图所示。

Wiring-Sound-Sensor-with-Arduino.png


设置阈值

该模块有一个内置电位器,用于设置声级阈值,高于该阈值模块输出低电平,状态LED灯亮起。

Digital-Output-of-Sound-Sensor.png


现在,要设置阈值,请将手指靠近麦克风并调整电位器,直到模块的状态LED闪烁以响应您的点击。


示例 1 – 基本声音检测

以下简单示例检测拍手或啪啪声并在串口监视器上显示一条消息。

  1. #define sensorPin 8

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

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

  8. void loop() {
  9.         // Read Sound sensor
  10.         int sensorData = digitalRead(sensorPin);

  11.         // If pin goes LOW, sound is detected
  12.         if (sensorData == LOW) {
  13.                
  14.                 // If 25ms have passed since last LOW state, it means that
  15.                 // the clap is detected and not due to any spurious sounds
  16.                 if (millis() - lastEvent > 25) {
  17.                         Serial.println("Clap detected!");
  18.                 }
  19.                
  20.                 // Remember when last event happened
  21.                 lastEvent = millis();
  22.         }
  23. }
复制代码

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

Sound-Sensor-Output.png


代码说明:

首先草图声明传感器的OUT引脚连接到的Arduino引脚。

  1. #define sensorPin 8
复制代码

接下来,我们定义一个名为lastEvent的变量,用于存储先前检测到拍手的时间。 它将帮助我们减少意外的声音检测。

  1. unsigned long lastEvent = 0;
复制代码

setup()函数中,我们将传感器的OUT引脚配置为输入,并建立串口通信。

  1. pinMode(sensorPin, INPUT);
  2. Serial.begin(9600);
复制代码

loop()函数中,首先读取传感器输出。

  1. int sensorData = digitalRead(sensorPin);
复制代码

当传感器检测到声音大到超过阈值时,输出变为低电平。 但是,我们必须确保声音是由拍手声而不是背景噪音引起的。 因此,我们在输出变低后等待25毫秒。 如果输出保持低电平超过25毫秒,则串口监视器上会打印消息“Clap detected”。

  1. if (sensorData == LOW) {
  2.         if (millis() - lastEvent > 25) {
  3.                 Serial.println("Clap detected!");
  4.         }
  5.         lastEvent = millis();
  6. }
复制代码

示例 2 – 用拍手声控制设备

在下一个项目中,我们将使用声音传感器创建一个“Clapper”,通过拍手声激活交流供电设备。该项目使用单通道继电器模块控制交流供电设备。


接线连接

这个项目的接线很简单。


让我们从为传感器和继电器模块供电开始。 将它们的VCC引脚连接到Arduino的5V引脚,将GND 接地。


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


您还需要将继电器模块连接到您试图控制的交流供电设备。 您需要切断带电的交流电线路,并将切断的电线的一端连接到COM,另一端连接到NO。接线如下图所示。

Wiring-Sound-Sensor-and-Relay-with-Arduino.png


Arduino代码

以下是用拍手声控制设备的代码。

  1. #define sensorPin 7
  2. #define relayPin 8

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

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

  10. void loop() {
  11.         // Read Sound sensor
  12.         int sensorData = digitalRead(sensorPin);

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

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

  22.         // Remember when last event happened
  23.         lastEvent = millis();
  24.         }
  25. }
复制代码

完成后,声音传感器应在您每次拍手时打开或关闭设备。


代码说明:

如果将此草图与我们之前的草图进行比较,您会发现许多相似之处,但也有一些不同之处。


一开始,我们声明了继电器控制引脚 (IN) 连接到的Arduino引脚。 此外,我们定义了一个新的变量relayState来记录继电器的状态。

  1. #define relayPin 7

  2. boolean relayState = false;
复制代码

在setup()函数中,我们将 relayPin 配置为输出。

  1. pinMode(relayPin, OUTPUT);
复制代码

当我们检测到拍手声时,不是在串口监视器上打印消息,而是简单地切换继电器的状态。

  1. relayState = !relayState;
  2. digitalWrite(relayPin, relayState ? HIGH : LOW);
复制代码

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 705 | 回复: 1492



手机版|

GMT+8, 2024-11-7 22:43 , Processed in 0.038066 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表