这篇文章是关于使用 Arduino 的流行 RF 433MHz 发射器/接收器模块的指南。我们将解释它们的工作原理并分享一个 Arduino 项目示例,您可以将其应用到您自己的项目中。
目录
描述
在本教程中,我们将使用 FS1000A 发射器和相应的接收器,但提供的说明也适用于以类似方式工作的其他 433MHz 发射器/接收器模块。这些 RF 模块在 Arduino 爱好者中非常受欢迎,并用于需要无线控制的各种应用。
这些模块非常便宜,您可以将它们与任何微控制器一起使用,无论是 Arduino、ESP8266 还是 ESP32。
规格 RF 433MHz 接收器
- 频率范围:433.92 MHz
- 调制方式:ASK
- 输入电压:5V
规格 RF 433MHz 发射器
- 频率范围:433.92MHz
- 输入电压:3-12V
带有 RF 433MHz 发射器/接收器模块的 Arduino
在本节中,我们将构建一个简单的示例,使用 433 MHz 将消息从 Arduino 发送到另一个 Arduino 板。Arduino 板将连接到 433 MHz 发射器并发送“Hello World!” 信息。另一个 Arduino 板将连接到 433 MHz 接收器以接收消息。
所需零件
对于此示例,您需要以下组件:
- 2 x Arduino
- RF 433MHz 接收器/发射器
- 面包板
- 跳线
安装 RadioHead 库
RadioHead库提供了一种通过 Arduino 使用 433 MHz 发射器/接收器的简单方法。请按照以下步骤在 Arduino IDE 中安装该库:
该库非常棒,它适用于市场上几乎所有的射频模块。
变送器电路
按照下图将发射器模块连接到Arduino。
重要提示:请务必检查您正在使用的发射器模块的引脚排列。通常,引脚旁边有标签。或者,您也可以查看模块的数据表。
发射机程序
将以下代码上传到将充当发射器的Arduino板。这是基于 RadioHead 库提供的示例之一。
#include <RH_ASK.h>
#include <SPI.h> // Not actually used but needed to compile
RH_ASK driver;
void setup()
{
Serial.begin(9600); // Debugging only
if (!driver.init())
Serial.println("init failed");
}
void loop()
{
const char *msg = "Hello World!";
driver.send((uint8_t *)msg, strlen(msg));
driver.waitPacketSent();
delay(1000);
}
发射机程序的工作原理
首先,包括 RadioHead ASK 库。
#include <RH_ASK.h>
此库需要 SPI 库才能工作。因此,您还需要包含 SPI 库。
#include <SPI.h>
之后,创建一个名为 driver 的 RH_ASK 对象。
在 setup() 中,使用 init() 方法初始化 RH_ASK 对象。
Serial.begin(9600); // Debugging only
if (!driver.init())
Serial.println("init failed");
在 loop() 中,我们编写并发送消息。消息保存在 msg 变量上。请注意,消息的类型必须为 char。
const char *msg = "Hello World!";
此消息包含“Hello World!”消息,但您可以发送任何您想要的内容,只要它是 char 格式即可。
最后,我们发送如下消息:
driver.send((uint8_t *)msg, strlen(msg));
driver.waitPacketSent();
消息每秒发送一次,但您可以调整此undefined时间。
delay(1000);
接收器电路
按照下图将接收器模块连接到另一个Arduino。
重要提示:请务必检查您正在使用的发射器模块的引脚排列。通常,引脚旁边有标签。或者,您也可以查看模块的数据表。
接收器程序
将下面的代码上传到连接到接收器的Arduino。
接收器程序的工作原理
与前面的程序类似,首先要包含必要的库:
#include <RH_ASK.h>
#include <SPI.h>
创建一个名为 driver 的RH_ASK对象:
RH_ASK driver;
在 setup() 中,初始化 RH_ASKobject。
void setup(){
Serial.begin(9600); // Debugging only
if (!driver.init())
Serial.println("init failed");
}
在 loop() 中,我们需要设置一个与我们将接收的消息大小相匹配的缓冲区。“Hello World!”有 12 个字符。您应该根据您将收到的消息相应地调整缓冲区大小(空格和标点符号也计算在内)。
uint8_t buf[12];
uint8_t buflen = sizeof(buf);
然后,检查您是否收到了有效的消息。如果收到有效消息,请在串行监视器中打印该消息。
if (driver.recv(buf, &buflen)) {
int i;
// Message with a good checksum received, dump it.
Serial.print("Message: ");
Serial.println((char*)buf);
}
示范
在这个项目中,发射器通过射频向接收器发送消息“Hello World!”。这些消息显示在接收方的串行监视器中。下图显示了您应该在 Arduino IDE 串行监视器中看到的内容。
总结
使用此模块时,您需要有一些切合实际的期望。当接收器和发射器彼此靠近时,它们工作得很好。如果将它们分开太远,您将失去通信。通信范围会有所不同。这取决于您为发射器模块提供多少电压、环境中的射频噪声以及您是否使用外部天线。