我们都知道有线门铃系统需要电线和合适的插座才能令人满意地工作。由于有线门铃系统需要复杂的布线,需要有经验的人才能完成工作,无论是工作还是外观都不好。它的另一个问题是,如果您想为现有房屋安装有线门铃系统,则安装需要更多的精力和时间。由于温度和湿度以及其他环境因素,电线会损坏并导致短路。这就是无线门铃系统发挥作用的地方。尽管无线门铃系统的成本更高,但与有线门铃系统相比,无线门铃系统的定期维护比有线门铃系统低,这需要有经验的人进行维护。在安装方面,无线门铃系统的安装非常简单,无需经验人员即可安装。除此之外,无线门铃系统还具有摄像头、录像机等附加功能,外观时尚,完全无线,可以轻松安装在房子的任何地方。
在这个项目中,我们将使用 Arduino 构建一个无线门铃。我们将有一个按钮,按下该按钮将无线播放我们选择的旋律,以指示有人在门口。对于无线连接,我们将使用 433 MHz 射频模块。一般来说,RF 模块必须始终伴随着解码器和编码器模块,但我们也可以使用本教程中使用的 Arduino 等微控制器来代替解码器和编码器模块。
所需硬件:
射频模块
阿杜诺
蜂鸣器
按钮
面包板
连接线
433 MHz 射频模块:
对于我们基于 Arduino 的无线门铃,我们将使用 433 MHz 无线射频模块。RF模块,即射频模块,由两个模块组成,一个接收数据的模块称为接收器,一个传输数据的模块称为发射器。
射频发射器:
发射器由一个调谐到 433MHz 频率的 SAW 谐振器、一个开关电路和一些无源元件组成。
当数据引脚的输入为高电平时,开关将起到短路作用,振荡器运行,在一段时间内产生固定幅度的载波和固定频率。当数据引脚的输入为低电平时,开关作为开路,输出为零。这也称为幅移键控 (ASK)。我们将在本文后面讨论更多
接收电路:
射频接收器是一个简单的电路,由射频调谐电路、放大器电路和锁相环电路组成。
RF调谐器用于将电路调谐到特定频率,该频率需要满足发射频率。放大器电路用于从所有其他信号放大特定频率并增加特定频率的灵敏度。
锁相环电路:
锁相环电路 (PLL) 是一种用于我们希望从低频参考信号中获得高度稳定频率的设备类型的电路。PLL 是一个负反馈系统,由一个压控振荡器和一个相位比较器组成,其连接方式使振荡器频率始终与输入信号匹配,如下所示。
在 PLL 电路中,两个信号,即来自参考信号和来自压控振荡器 (VCO) 的信号,作为相位检测器的输入,相位检测器的输出是两个输入之间的差异,这个输出是两个信号的相位差。该输出包含频率分量,它们是信号的和和差。所以,这个输出作为低通滤波器的输入,它只允许低频,不允许高频信号通过。低通滤波器的输出被馈送到压控振荡器 (VCO),这个输入充当 VOC 的一个值,必须改变它以减小两个信号之间的相位差。VCO 发生变化,直到相位差最小,或者相位检测器的输出具有恒定的误差输出。这会导致循环锁定情况。
通过所有这些组件,接收器接收来自天线的信号,然后通过射频调谐电路进行调谐,并使用 OP-Amp 放大这个微弱的信号,并将这个放大的信号进一步用作 PLL 的输入,从而使解码器锁定到输入的数字位上,这会产生噪声较小的输出。
调制:
调制是将数据转换为电信号的过程,这些调制后的信号用于传输。我们调制信号,以便我们可以将必要的信号与其他信号分开。如果没有调制,所有具有相同频率的信号将混合在一起,这将导致错误。调制方式有很多种,流行的有模拟调制、数字调制、脉冲调制和扩频。
其中,无线传输中最常用的一种是数字调制。流行的数字调制技术是幅移键控、频移键控、相移键控、正交幅度调制。
幅移键控 (ASK) 调制:
在幅移键调制中,正弦载波会不断产生连续的高频载波,被调制的信号是二进制序列,这些信号使输入到开关电路的信号为高电平或低电平。
如上图所示,当输入为低电平时,开关将作为开路,输出为零。当开关的输入为高电平时,输出将是载波信号。
Arduino射频发射器电路图
我们的无线门铃项目需要一个发射器和接收器电路,每个电路都有自己的 Arduino 板。门铃发射器的电路图如下所示
Arduino管脚5接门铃开关的一端,开关的另一端接电源电压。一个10kohm的下拉电阻连接到引脚5,如图所示。引脚 11 连接到发射器模块的数据引脚。Vcc 连接到电源电压,发射器模块的接地引脚接地。
在这里,我使用面包板连接模块,按钮用作门铃开关。
Arduino射频接收器电路图
同样,在接收器端,我们需要使用另一个带有射频接收器模块的 Arduino 板。然后Arduino门铃接收器 电路也有一个蜂鸣器,当按钮被按下时播放一些旋律。
在这里,我们将Arduino的引脚7连接到蜂鸣器正极,负极接地。VCC 的电源电压提供给接收模块,模块的 GND 引脚接地。接收模块的输出引脚连接到 Arduino 的第 12引脚。
接收模块由 4 个引脚组成,其中一个引脚接地,另一个引脚用于提供 VCC 电源,其余两个引脚用于数据传输。在上图中,一个蜂鸣器连接到 Arduino 的数字 7 引脚,而 Arduino 的第 12 引脚连接到接收模块输出引脚。
Arduino发射器代码说明
本页底部给出了 Arduino 发射器部分的完整代码。代码解释如下。
这些是使用 RF 模块发送或接收数据所需的头文件。这些库使 Arduino 和模块之间的连接变得简单。如果没有这些,您必须手动编写将 RF 模块与 Arduino 连接的代码。创建一个对象“驱动程序”以访问用于发送和接收数据的命令。您可以从 Github下载适用于 Arduino 的 Radio Head Library。
#include #include // 没有实际使用,但需要编译 RH_ASK 驱动程序;
Serial.begin() 用于查找 RF 发射器模块是否工作,我已将 PIN 5(数字引脚 5)初始化为输入引脚,它充当门铃开关。
无效设置() { 序列号.开始(9600);// 仅调试 pinMode(5,输入);
此代码用于在程序启动时 RF TX 模块未初始化并且仅运行那些时打印消息“init failed”。
如果 (!driver.init()) Serial.println("初始化失败");
if函数检查引脚是逻辑高电平还是低电平,即门铃开关是打开状态还是关闭状态。指针 msg 包含我们要通过发送器发送的消息。需要注意的是,我们必须知道需要发送的字符数。这将有助于编写接收器代码。
如果(数字读取(5)==高){ const char *msg = "a";
strlen()命令检查消息的长度,在本例中为 1。driver.send() 命令将数据发送到 tx 模块,然后将其转换为波形。命令 driver.waitPacketSent() 用于等待数据发送完毕。
driver.send((uint8_t *)msg, strlen(msg)); driver.waitPacketSent();
Arduino接收器代码说明
Receiver 程序也在本页末尾的 Transmitter 代码下方给出,或者可以从这里下载。您可以直接将它与您的硬件一起使用;代码解释如下。
这些是使用 RF 模块发送或接收数据所需的头文件。这些库使 Arduino 和 RF 模块之间的连接变得简单。如果没有这些,您必须手动编写将 RF 模块与 Arduino 连接的代码。
#include #include // 没有实际使用,但需要编译
这些是为代码创建的头文件,用于将频率值等同于特定音符并获取音符值以获取音调。如果您想了解更多有关 pitches.h 或如何使用 Arduino 和蜂鸣器演奏旋律的信息,您可以参考这个Melody using Tone() FuncTIon教程。
#include "pitches.h" //为音符添加等效频率 #include "themes.h" //添加注释值和持续时间
创建一个对象“驱动程序”以访问用于发送和接收数据的命令。
RH_ASK 驱动程序;
在串行监视器中打印消息。然后 if 条件检查初始化是否失败。
无效设置() { 序列号.开始(9600);// 调试目的 如果 (!driver.init()) Serial.println("初始化失败"); 别的 Serial.println("完成");
整个代码处理所需旋律的音符、音高和持续时间
无效 Play_Pirates() { for (int thisNote = 0; thisNote
命令uint8_t buf[1]将buf初始化为长度为 8 位的无符号整数,buf变量的大小为 1,正如我之前告诉你的,我们应该发送多少位并获取buf变量的长度以二进制形式。
无效循环() { uint8_t buf[1]; uint8_t buflen = sizeof(buf);
此代码检查我们是否接收到正确的数据,如果接收到的信号正确,它会播放歌曲。
if (driver.recv(buf, &buflen)) // 非阻塞 Serial.println("选中 -> '他是海盗'"); Play_Pirates(); Serial.println("停止");
无线Arduino门铃工作
发射器模块和 Arduino 一起连接在门附近,接收器模块和 Arduino 一起可以安装在房间的任何地方。当有人按下开关时,它会向Arduino的第5个引脚发送高脉冲,该引脚与发射器模块一起连接在门附近。在我们的接收器代码中,我们编写了一个命令——digitalRead(5),这个命令使 Arduino 继续读取这个引脚。当该引脚变为高电平时,Arduino 通过发送器发送数据,这些信号被接收器接收。连接蜂鸣器的 Arduino 读取这些信号,当接收到所需数据时,满足 if 函数,代码将启动函数Play_Pirates()并开始播放音乐。
门铃发射器代码
// ask_transmitter.pde
// -*- 模式:C++ -*-
// 如何使用 RadioHead 传输消息的简单示例
// 以非常简单的方式使用简单的 ASK 发送器。
// 使用 TX-C1 模块实现单工(单向)发送器
#include
#include // 没有实际使用,但需要编译
RH_ASK 驱动程序;
// RH_ASK 驱动程序(2000, 2, 4, 5); // ESP8266 或 ESP32:不要使用 pin 11
无效设置()
{
序列号.开始(9600);// 仅调试
pinMode(5,输入);
如果 (!driver.init())
Serial.println("初始化失败");
}
无效循环()
{
如果(数字读取(5)==高){
const char *msg = "a";
driver.send((uint8_t *)msg, strlen(msg));
driver.waitPacketSent();
延迟(200);
}
}
门铃接收器代码
#include
#include // 没有实际使用但需要编译
#include "pitches.h" //为音符添加等效频率
#include "themes.h" //添加注释值和持续时间
RH_ASK 驱动程序;
无效设置()
{
序列号.开始(9600);// 仅调试
如果 (!driver.init())
Serial.println("初始化失败");
别的
Serial.println("完成");
}
无效 Play_Pirates()
{
for (int thisNote = 0; thisNote < (sizeof(Pirates_note)/sizeof(int)); thisNote++) {
int noteDuration = 1000 / Pirates_duration[thisNote];//将持续时间转换为时间延迟
音调(8, Pirates_note[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.05; //这里1.05是节奏,增加播放更慢
延迟(pauseBetweenNotes);
无音(8);//停止8号针上的音乐
}
}
无效循环()
{
uint8_t buf[1];
uint8_t buflen = sizeof(buf);
if (driver.recv(buf, &buflen)) // 非阻塞
{
Serial.println("选中 -> '他是海盗'");
Play_Pirates();
Serial.println("停止");
}
}