当我还是个孩子的时候,我就迷上了玩具音乐车,当您拍手时会触发它,然后随着我的长大,我想知道我们是否可以使用它来切换家中的灯和风扇。只拍拍手就打开风扇和灯,而不是懒洋洋地走到配电盘,那真是太酷了。但是通常它会发生故障,因为该电路会响应环境中的任何大声噪音,例如大声的收音机或邻居的割草机。尽管构建拍手开关也是一个有趣的项目。
就在那时,我遇到了一种“哨子检测”方法,电路将在其中检测哨声。不同于其他声音的哨声在特定的持续时间内具有统一的频率,因此可以与语音或音乐区分开。因此,在本教程中,我们将学习如何通过将声音传感器与Arduino接口来检测哨声,当检测到哨声时,我们将通过继电器切换AC灯。一路上,我们还将学习麦克风如何接收声音信号以及如何使用Arduino测量频率。听起来很有趣,所以让我们开始基于Arduino的家庭自动化项目。
所需材料
- Arduino UNO
- 声音感应模块
- 继电器模块
- 交流灯
- 连接线
- 面包板
声音传感器工作
在深入研究此家庭自动化项目的硬件连接和代码之前,让我们看一下声音传感器。该模块中使用的声音传感器如下所示。尽管外观可能会有所变化,但市场上大多数声音传感器的工作原理与此相似。
众所周知,声音传感器的原始组件是麦克风。麦克风是一种将声波(声能)转换成电能的换能器。基本上,麦克风内部的振膜会振动到大气中的声波,从而在其输出引脚上产生电信号。但是这些信号将具有非常低的幅度(mV),因此无法由Arduino等微控制器直接处理。同样,默认情况下,声音信号本质上是模拟信号,因此麦克风的输出将是频率可变的正弦波,但是微控制器是数字设备,因此在方波下工作效果更好。
为了放大这些低信号正弦波并将其转换为方波,该模块使用板上的LM393比较器模块,如上所示。从麦克风输出的低电压音频通过放大器晶体管提供给比较器的一个引脚,同时使用涉及电位计的分压电路将参考电压设置在另一引脚上。当麦克风的音频输出电压超过预设电压时,比较器将以5V(工作电压)变高,否则比较器将保持在0V的低电平。这样,低信号正弦波可以转换为高压(5V)方波。下面的示波器快照显示了相同的内容,其中黄色波是低信号正弦波,而蓝色波是输出方波。的灵敏度可以通过改变模块上的电位器来控制。
在示波器上测量音频频率
该声音传感器模块会将大气中的声波转换为方波,其频率将等于声波的频率。因此,通过测量方波的频率,我们可以找到大气中声音信号的频率。为确保一切正常,我将声音传感器连接至示波器以探查其输出信号,如下视频所示。
我打开了示波器上的测量模式以测量频率,然后使用Play商店中的Android应用程序(频率声音发生器)生成已知频率的声音信号。从上面的GID中可以看到,示波器能够以相当不错的精度测量声音信号,示波器中显示的频率值非常接近我的手机上显示的频率值。现在,我们知道模块正在工作,让我们继续将声音传感器与Arduino接口。
口哨检测器Arduino电路图
下面显示了使用声音传感器的Arduino口哨检测器开关电路的完整电路图。使用Fritzing软件绘制电路。
声音传感器和继电器模块由Arduino的5V引脚供电。声音传感器的输出引脚连接到Arduino的数字引脚8,这是因为该引脚的计时器属性,我们将在编程部分讨论更多有关此的信息。继电器模块由引脚13触发,该引脚也连接到UNO板上的内置LED。
在交流电源侧,零线直接连接到继电器模块的Common(C)引脚,而相位通过交流负载(灯泡)连接到继电器的常开(NO)引脚。这样,当继电器触发时,NO引脚将与C引脚连接,从而灯泡将发光。否则,blub将保持关闭状态。建立连接后,我的硬件看起来像这样。
警告:使用交流电路可能会造成危险,在处理带电电线时要小心,避免短路。建议对电子设备不熟悉的人使用断路器或成人监督。你被警告了!!
使用Arduino测量频率
类似于我们的示波器读取输入方波的频率,我们必须对Arduino进行编程以计算频率。我们已经在频率计数器教程中使用脉冲输入功能学习了如何执行此操作。但是在本教程中,我们将使用Freqmeasure库来测量频率以获得准确的结果。该库使用引脚8上的内部计时器中断来测量脉冲保持ON的时间。一旦测量了时间,就可以使用公式F = 1 / T计算频率。但是,由于我们直接使用该库,因此无需深入了解寄存器详细信息以及如何测量频率的数学方法。可以从以下链接下载库:
- pjrc频率测量库
上面的链接将下载一个zip文件,然后您可以按照路径Sketch-> Include Library-> Add.ZIP Library将此zip文件添加到Arduino IDE 。
注意: 使用该库将禁用UNO引脚9和10上的 AnalogWrite 功能,因为该库将占用计时器。如果使用其他板,这些引脚也会改变。
编程Arduino以检测口哨声
带有演示视频的完整程序可以在本页底部找到。在本标题中,我将通过分成几个小片段来说明该程序。
与往常一样,我们通过包含所需的库并声明所需的变量来开始程序。确保已经按照上述标题中的说明添加了 FreqMeasure.h 库。可变状态代表LED的状态,可变频率和连续性分别用于输出测得的频率及其连续性。
#包括
在 void setup 功能内部,我们以9600波特率启动串行监视器以进行调试。然后使用 FreqMeasure.begin() 函数初始化用于测量频率的引脚8。我们还声明输出引脚13(LED_BUILTIN)。
void setup(){ Serial.begin(9600); FreqMeasure.begin(); //默认情况下在引脚8上进行测量 pinMode(LED_BUILTIN,OUTPUT); }
在无限 循环内 ,我们使用函数 FreqMeasure.available() 继续监听引脚8 。 如果有输入信号,我们使用 FreqMeasure.read() 测量频率 。 为避免噪声引起的误差,我们测量了100个样本并取其平均值。执行以下操作的代码如下所示。
if(FreqMeasure.available()){ //平均数次合计 求和sum = sum + FreqMeasure.read(); 计数=计数+ 1; if(count> 100){ frequency = FreqMeasure.countToFrequency(sum / count); Serial.println(frequency); 总和= 0; 计数= 0; } }
您可以在此处使用 Serial.println() 函数来检查哨声的频率值。在我的情况下,接收到的值是从1800Hz到2000Hz。大多数人的哨声频率将落在此特定范围内。但是,甚至其他声音(例如音乐或语音)也可能落在此频率之下,因此为了区分它们,我们将监视其连续性。如果频率连续3次,则我们确认它是啸叫声。因此,如果频率在1800到2000之间,则我们增加称为连续性的变量。
如果(频率> 1800 &&频率<2000) {连续性++; Serial.print(“ Continuity->”); Serial.println(continuity); 频率= 0;}
如果连续性的值达到或超过3,则我们通过切换称为状态的变量来更改LED的状态。如果状态为真,则将其更改为false,反之亦然。
if(continuity> = 3 && state == false) {state = true; 连续性= 0; Serial.println(“ Light Turned ON”); delay(1000);} if(continuity> = 3 && state == true) {state = false; 连续性= 0; Serial.println(“ Light Turned OFF”); delay(1000);}
Arduino口哨检测器工作
一旦代码和硬件准备就绪,我们就可以开始对其进行测试。确保连接正确,然后打开模块电源。打开串行监视器并开始吹口哨,您会注意到连续性值正在增加,最后打开或关闭灯泡。我的串行监视器的快照示例如下所示。
当串行监视器显示 灯点亮时 ,插针13 上 的 光 将变高,继电器将被触发以打开灯。同样,当串行监视器显示“ Light off”时, 指示灯将熄灭 。测试完工作后,您可以使用12V适配器为设置供电,并可以通过口哨开始控制AC家用电器。
可以在下面的视频中找到该项目的完整工作。希望您理解本教程并喜欢学习新知识。如果您在解决问题时遇到任何问题,请将其留在评论部分,或将我们的论坛用于其他技术需求。