风筝
发表于: 2019-6-25 17:54:47 | 显示全部楼层

在很小的时候,我被一个玩具音乐车迷住了,当你拍手时会触发音乐,然后我长大之后,我想知道我们是否可以使用相同的功能来开关家中的灯光和风扇。只需拍手就可以打开我的风扇和灯光,而不是将懒惰的自己带到开关板上。但通常它会发生故障,因为这个电路会响应环境中的任何巨响,比如大声的收音机或我邻居的割草机。虽然建立一个拍手开关也是一个有趣的项目。


就在那时,当我遇到这种口哨检测方法时,电路会检测到口哨。与其他声音不同的是,哨声在特定持续时间内具有均匀的频率,因此可以与语音或音乐区分开。因此,在本篇文章中,我们将学习如何通过将声音传感器与Arduino连接来检测哨音,当检测到哨声时,我们将通过继电器开关AC灯。在此过程中,我们还将了解麦克风如何接收声音信号以及如何使用Arduino测量频率。听起来很有趣,让我们开始使用基于Arduino的家庭自动化项目。


所需材料

●    Arduino UNO开发板

●    声音传感器模块

●    继电器模块

●    AC交流电灯

●    连接线

●    面包板


声音传感器工作

在我们深入了解这个家庭自动化项目的硬件连接和代码之前,让我们来看看声音传感器。本模块中使用的声音传感器如下所示。市场上大多数声音传感器的工作原理与此类似,尽管外观可能会有所改变。

Sound-Sensor-Module.jpg


我们知道声音传感器中的原始组件是麦克风。麦克风是一种将声波(声能)转换成电能的换能器。基本上麦克风内的振膜振动到大气中的声波,在其输出引脚上产生电信号。但是这些信号的幅度非常低(mV),因此不能像Arduino这样的微控制器直接处理。此外,默认声音信号本质上是模拟的,因此麦克风的输出将是具有可变频率的正弦波,但微控制器是数字设备,因此方波效果更好。

Schematic-for-Arduino-Whistle-Detector-Switch-using-Sound-Sensor.png


为放大这些低信号正弦波并将其转换为方波,模块使用板载LM393比较器模块,如上所示。来自麦克风的低压音频输出通过放大器晶体管提供给比较器的一个引脚,而使用包括电位计的分压器电路在另一个引脚上设置参考电压。当麦克风的音频输出电压超过预设电压时,比较器会以5V(工作电压)变为高电平,否则比较器将保持低电平为0V。这样低信号正弦波可以转换为高压(5V)方波。下面的示波器快照显示黄色波是低信号正弦波,蓝色开的是输出方波。可以通过改变模块上的电位计来控制灵敏度。

Arduino-Output-for-Whistle-Detector-Switch.png


在示波器上测量音频

该声音传感器模块将大气中的声波转换为方波,其频率将等于声波的频率。因此,通过测量方波的频率,我们可以找到大气中声音信号的频率。为了确保工作正常,我将声音传感器连接到示波器以探测其输出信号。


在示波器上打开测量模式来测量频率,并使用Play商店中的Android应用程序(频率声音发生器)生成已知频率的声音信号。正如您在上面的GID中所看到的,示波器能够以相当不错的精度测量声音信号,示波器中显示的频率值非常接近我手机上​​显示的频率值。现在,我们知道模块正在运行,让我们继续将声音传感器与Arduino连接起来。


口哨探测器Arduino电路图

使用声音传感器的Arduino口哨探测器开关电路的完整电路图如下所示。使用Fritzing软件绘制电路。

Circuit-Diagram-for-Arduino-Whistle-Detector-Switch-using-Sound-Sensor.png


声音传感器和继电器模块由Arduino的5V引脚供电。声音传感器的输出引脚连接到Arduino的数字引脚8,这是因为该引脚的定时器属性,我们将在编程部分讨论更多相关信息。继电器模块由引脚13触发,引脚13也连接到UNO板上的内置LED。


在交流电源侧,中性线直接连接到继电器模块的公共(C)引脚,而相通过交流负载(灯泡)连接到继电器的常开(NO)引脚。这样,当继电器被触发时,NO引脚将与C引脚连接,因此灯泡将发光。否则blub将保持关闭状态。一旦建立连接,我的硬件看起来像这样。

Circuit-Hardware-for-Arduino-Whistle-Detector-Switch-using-Sound-Sensor.jpg


用Arduino测量频率

类似于读取输入方波频率的示波器,我们必须编制Arduino来计算频率。在本文中,我们将使用Freqmeasure库来测量频率以获得准确的结果。该库使用引脚8上的内部定时器中断来测量脉冲保持ON的时间长度。一旦测量了时间,我们就可以使用公式F = 1 / T来计算频率。但是,由于我们直接使用库,因此我们无需深入了解寄存器详细信息以及如何测量频率的数学。库文件可以从以下链接下载:

●   dpjrc的频率测量库

上面的链接将下载一个zip文件,然后您可以按照路径Sketch  - > Include Library  - > Add .ZIP Library将此zip文件添加到Arduino IDE中。

注意:使用该库将禁用UNO上引脚9和10上的analogWrite功能,因为定时器将被此库占用。如果使用其他电路板,这些引脚也会改变。


编程Arduino以检测口哨

完整程序可以在本页底部找到。在本章节中,我将通过将其分成小片段来解释该程序。


首先我们包含所需的库,并声明所需的变量。确保已按上述标题中的说明添加了FreqMeasure.h库。state变量表示LED的状态,变量frequency和continuity分别用于输出测量频率及其连续性。

  1. #include <FreqMeasure.h>//https://github.com/PaulStoffregen/FreqMeasure
  2. double sum=0;
  3. int count=0;
  4. bool state = false;
  5. int frequency;
  6. int continuity =0;
复制代码

在void setup函数中,我们以9600波特率开始串行监视器进行调试。然后使用FreqMeasure.begin()函数初始化引脚8以测量频率。我们还声明输出引脚13(LED_BUILTIN)。

  1. void setup() {
  2.   Serial.begin(9600);
  3.   FreqMeasure.begin(); //Measures on pin 8 by default
  4.   pinMode(LED_BUILTIN, OUTPUT);
  5. }
复制代码

在loop函数内,我们使用函数FreqMeasure.available()继续监听引脚8。如果有输入信号,我们使用FreqMeasure.read()测量频率。为了避免由于噪声引起的误差,我们测量了100个样本并取其平均值。执行相同操作的代码如下所示。

  1.   if (FreqMeasure.available()) {
  2.     // average several reading together
  3.     sum = sum + FreqMeasure.read();
  4.     count = count + 1;
  5.     if (count > 100) {
  6.       frequency = FreqMeasure.countToFrequency(sum / count);
  7.       Serial.println(frequency);
  8.       sum = 0;
  9.       count = 0;
  10.     }
  11.   }
复制代码

您可以在此处使用Serial.println()函数来检查哨子的频率值。本例中,收到的值是1800Hz到2000Hz。大多数人的哨声频率将落在这个特定的范围内。但即使是音乐或语音之类的其他声音也可能属于这个频率,因此为了区分它们,我们将监视连续性。如果频率连续3次,那么我们确认它是哨声。因此,如果频率在1800到2000之间,那么我们增加continuity变量。

  1.     if (frequency>1800 && frequency<2000)
  2.     { continuity++; Serial.print("Continuity -> "); Serial.println(continuity); frequency=0;}
复制代码

如果continuity的值达到或超过三,那么我们通过切换state变量来改变LED的状态。如果state已经为真,我们将其更改为false,反之亦然。

  1.     if (continuity >=3 && state==false)
  2.       {state = true; continuity=0; Serial.println("Light Turned ON"); delay(1000);}

  3.     if (continuity >=3 && state==true)
  4.       {state = false; continuity=0; Serial.println("Light Turned OFF"); delay(1000);}
复制代码

Arduino口哨探测器工作

一旦代码和硬件准备就绪,我们就可以开始测试了。确保连接正确并为模块加电。打开串行监视器并开始吹口哨,您可以注意到continuity值增加,最后打开或关闭灯泡。串行监视器的示例快照如下所示。

Arduino-Output-for-Whistle-Detector-Switch-using-Sound-Sensor.png


当串行监视器显示灯亮时,引脚13将变为高电平,继电器将被触发打开灯泡。同样,当串行监视器指示灯关闭时,电灯泡将关闭。测试完工作后,您可以使用12V适配器为设置供电,并使用口哨开始控制家用电器。

Arduino-Whistle-Detector-Switch-using-Sound-Sensor.jpg


希望你理解这个教程并喜欢学习新东西。如果您在工作中遇到任何问题,请在本帖下面进行回复。


代码

以下是本文使用的完整代码: main.rar (678 Bytes, 下载次数: 50)

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

本版积分规则

主题 700 | 回复: 1483



手机版|

GMT+8, 2024-5-11 10:46 , Processed in 0.037816 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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