风筝
发表于: 2019-12-21 21:37:24 | 显示全部楼层

我们都知道有线门铃系统需要电线和合适的插座才能正常工作。由于有线门铃系统需要复杂的布线,因此需要有经验的人来完成工作,并且无论从工作还是在外观上都做得不好。另一个问题是,如果要为现有房屋安装有线门铃系统,则需要更多的精力和时间来安装。由于温度和湿度以及其他环境因素,电线会损坏,并会导致短路。这是些正是无线门铃系统的优势。尽管无线门铃系统的成本较高,但与有线门铃系统相比,无线门铃系统的常规维护成本较低,前者需要经验丰富的人员进行维护。安装时,无线门铃系统的安装非常简单,不需要任何经验的人员。除此之外,无线门铃系统还具有摄像头,录像机等其他功能,外观时尚,并且完全是无线的,因此可以轻松安装在房屋的任何地方。


在本篇文章中,我们将使用Arduino制作一个无线门铃。我们将使用一个按键,按下该按键时将无线播放我们选择的旋律,以指示有人在门口。对于无线连接,我们将使用433 MHz RF模块。通常,RF模块必须始终随附有解码器和编码器模块,但代替解码器和编码器模块,我们还可以使用本文中使用的微控制器,例如Arduino。


所需的硬件

●    射频模块

●    Arduino

●    蜂鸣器

●    按键式

●    面包板

●    连接线


433 MHz射频模块

我们将在这个Arduino无线门铃中使用433 MHz无线RF模块。射频模块(Radio Frequency)由两个模块组成,一个模块接收数据,称为接收器;另一个模块发送数据,称为发射器。

433MHz-RF-transmitter-and-receiver-module.jpg


射频发射器:

发射器包括一个SAW谐振器(可调谐至433MHz频率)、一个开关电路和一些无源元件。

Transmitter-Circuit-Diagram.png

当数据引脚的输入为高电平时,开关将充当短路,并且振荡器运行,并在一定的时间段“ t”内产生固定幅度的载波和固定频率。当数据引脚的输入为低电平时,开关充当开路,输出为零。这也称为幅移键控(Amplitude shift keying / ASK)。我们将在本文后面对此进行更多讨论。


射频接收电器:

RF接收器是一个由RF调谐电路、放大器电路和锁相环电路组成的简单电路。

Receiver-Circuit-Diagram.png

RF调谐器用于将电路调谐到需要满足发射频率的特定频率。放大器电路用于从所有其他信号中放大特定频率并增加该特定频率的灵敏度。


锁相环电路(PLL)是一种用于某些类型的设备的电路,在这些设备中,我们希望从低频参考信号中获得高度稳定的频率。 PLL是一种负反馈系统,它由压控振荡器和相位比较器组成,其连接方式应使振荡器频率始终与输入信号匹配,如下所示。

Phase-Loop-Lock-Circuit-Diagram.png


在PLL电路中,两个信号,即来自参考信号的信号和来自压控振荡器(VCO)的信号,被提供给相位检测器,而相位检测器的输出则是两个输入之间的差,该输出为两个信号的相位差。该输出包含频率成分,即信号的和与差。因此,此输出作为低通滤波器的输入,低通滤波器仅允许低频,而不允许高频信号通过。低通滤波器的输出被馈送到压控振荡器(VCO),并且该输入充当VOC的值,必须对其进行更改以减小两个信号之间的相位差。 VCO的变化一直持续到相位差最小或相位检测器的输出具有恒定的误差输出为止。这导致回路锁定。


通过所有这些组件,接收器从天线接收信号,然后通过RF调谐电路对其进行调谐,并使用运算放大器放大此弱信号,然后将该放大后的信号用作PLL的输入,从而使解码器锁定到输入的数字位上,从而产生噪声较小的输出。


调制是将数据转换为电信号的过程,这些调制信号用于传输。我们调制信号,以便我们可以将必要的信号与其他信号分开。如果不进行调制,所有具有相同频率的信号将被混合,这将导致错误。调制类型很多,流行的是模拟调制、数字调制、脉冲调制和扩频。


在这些无线传输中,最受欢迎的是数字调制。常见的数字调制技术是幅度移键控、频率移键控、相移键控和正交幅度调制。


在振幅移位键调制中,正弦载波将继续生成连续的高频载波,并且要调制的信号将处于二进制序列,并且这些信号使切换电路的输入为高电平或低电平。

ASK-Modulation.png

如上图所示,当输入为低电平时,开关将充当开路,而输出将为零。当开关的输入为高电平时,输出将为载波信号。


Arduino射频发射器电路图

我们的无线门铃项目将需要一个发射器和接收器电路,每个电路都具有自己的Arduino开发板。门铃发射器的电路图如下所示

Wireless-Doorbell-Transmitter-Circuit-Diagram.png

Arduino引脚5连接到门铃开关的一端,而开关的另一端连接到电源电压。如图所示,一个10kohm的下拉电阻连接到引脚5。引脚11连接到发送器模块的数据引脚。 Vcc连接到电源电压,变送器模块的接地引脚接地。

Wireless-Doorbell-using-Arduuino.jpg

在这里,我使用了一块面包板来连接模块,并使用一个按键作为门铃开关。


Arduino射频接收器电路图

同样,在接收器端,我们需要将另一个Arduino板与RF接收器模块一起使用。然后Arduino门铃接收器电路有一个蜂鸣器,当按下按钮时会发出一些旋律。

Wireless-Doorbell-Receiver-Circuit-Diagram.png

在这里,我们将Arduino的引脚7连接到蜂鸣器的正极端子,负极端子接地。 VCC的电源电压提供给接收器模块,并且该模块的GND引脚接地。接收器模块的out引脚连接到Arduino的第12引脚。

Arduino-Wireless-Doorbell-using-RF-Module.jpg

接收器模块由4个引脚组成,其中一个引脚接地,另一个引脚用于提供VCC电源,其余两个引脚用于数据传输。在上图中,蜂鸣器连接到Arduino的数字7引脚,而Arduino的第12引脚连接到接收器模块输出引脚。


Arduino发射器代码说明

Arduino发射器部分的完整代码在本页底部提供。代码说明如下。


这些是使用RF模块发送或接收数据时需要包含的头文件。这些库使Arduino与模块之间的连接变得简单。没有这些,您必须手动编写用于将RF模块与Arduino连接的代码。创建一个对象“驱driver”以访问用于发送和接收数据的命令。您可以从Github下载Arduino的Radio Head Library

  1. #include <RH_ASK.h>
  2. #include <SPI.h> // Not actually used but needed to compile
  3. RH_ASK driver;
复制代码

Serial.begin()用于监测射频发射器模块是否正常工作,将数字引脚5初始化为输入引脚,并将其用作门铃开关。

  1. void setup()
  2. {
  3.    Serial.begin(9600); // Debugging only
  4.    pinMode(5,INPUT);
复制代码

当RF TX模块在程序启动时未初始化成功,以下代码用于打印“init failed””消息,并且运行一次。

  1.    if (!driver.init())
  2.         Serial.println("init failed");
复制代码

以下if函数检查该引脚是逻辑高电平还是低电平,即门铃开关处于打开状态还是处于关闭状态。指针msg包含我们要通过发送器发送的消息。需要注意的是,我们必须知道需要发送的字符数。这将有助于编写接收器代码。

  1.    if(digitalRead(5)==HIGH){
  2. const char *msg = "a";
复制代码

strlen()命令检查消息的长度,这里的长度为1。 driver.send()命令将数据发送到tx模块,然后将其转换为波形。driver.waitPacketSent()命令用于等待数据发送完毕。

  1. driver.send((uint8_t *)msg, strlen(msg));
  2. driver.waitPacketSent();
复制代码

Arduino接收器代码说明

本文末尾的也提供了接收程序的代码,您可以直接在硬件上使用它。代码说明如下。


这些是使用RF模块发送或接收数据时需要包含的头文件。这些库使Arduino与RF模块之间的连接变得简单。没有这些,您必须手动编写用于将RF模块与Arduino连接的代码。

  1. #include <RH_ASK.h>
  2. #include <SPI.h> // Not actually used but needed to compile
复制代码

以下是为代码创建的头文件,以将频率值等同于特定音符并获取音符值以获得音乐音调。

  1. #include "pitches.h" //add Equivalent frequency for musical note
  2. #include "themes.h" //add Note vale and duration
复制代码

创建一个对象“driver”以访问用于发送和接收数据的命令。

  1. RH_ASK driver;
复制代码

在串口监视器中打印消息。然后,if条件检查初始化是否失败。

  1. void setup()
  2. {
  3.     Serial.begin(9600);      // Debugging purpose
  4.   if (!driver.init())
  5.          Serial.println("init failed");
  6.      else
  7.         Serial.println("done");
复制代码

以下整个代码处理所需旋律的音符、音高和持续时间

  1. void Play_Pirates()
  2. {
  3.   for (int thisNote = 0; thisNote < (sizeof(Pirates_note)/sizeof(int)); thisNote++) {
  4.     int noteDuration = 1000 / Pirates_duration[thisNote];//convert duration to time delay
  5.     tone(8, Pirates_note[thisNote], noteDuration);
  6.     int pauseBetweenNotes = noteDuration * 1.05; //Here 1.05 is tempo, increase to play it slower
  7.     delay(pauseBetweenNotes);
  8.     noTone(8); //stop music on pin 8
  9.     }
  10. }
复制代码

uint8_t buf [1]命令将buf初始化为长度为8位的无符号整数,并且buf变量的大小为1。

  1. void loop()
  2. {
  3.         uint8_t buf[1];
  4.     uint8_t buflen = sizeof(buf);
复制代码

此代码检查我们是否接收到正确的数据,如果接收到的信号正确,它会播放歌曲。

  1.     if (driver.recv(buf, &buflen)) // Non-blocking
  2.       Serial.println("Selected -> 'He is a Pirate' ");
  3.       Play_Pirates();
  4.       Serial.println("stop");
复制代码

无线Arduino门铃的工作过程

发射器模块和Arduino一起连接在门附近,接收器模块和Arduino可以安装在房间的任何地方。当有人按下开关时,它会将高脉冲发送到Arduino的第5引脚,该引脚与发射器模块一起连接在门附近。在我们的接收器代码中,我们编写了一个命令digitalRead(5),该命令使Arduino继续读取该引脚。当此引脚变为高电平时,Arduino通过发送器发送数据,这些信号被接收器接收。连接到蜂鸣器的Arduino读取这些信号,并在接收到所需的数据时,满足if函数,代码将启动该函数Play_Pirates()然后开始播放音乐。

Arduino-Wireless-Doorbell-using-RF-Module-Setup.jpg


以上就是基于Arduino的无线门铃的完整内容。希望您理解该项目,如果有任何疑问,请在本帖下面进行回复。


代码

完整的代码如下所示: Arduino-wireless-door-bell-code.zip (18.4 KB, 下载次数: 29)

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

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-22 21:39 , Processed in 0.044145 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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