433MHz射频发射器的Arduino代码 在示例中,我们只从发射器向接收器发送一条简单的文本消息。这将有助于了解如何使用这些模块,并可以作为更多实际实验和项目的基础。
这是我们将用于发射器的草图代码: - // Include RadioHead Amplitude Shift Keying Library
- #include <RH_ASK.h>
- // Include dependant SPI Library
- #include <SPI.h>
-
- // Create Amplitude Shift Keying Object
- RH_ASK rf_driver;
-
- void setup()
- {
- // Initialize ASK Object
- rf_driver.init();
- }
-
- void loop()
- {
- const char *msg = "Hello World";
- rf_driver.send((uint8_t *)msg, strlen(msg));
- rf_driver.waitPacketSent();
- delay(1000);
- }
复制代码
这是一个非常简短的草图,但它包含传输信号所需的全部内容。
在代码中首先包含RadioHead ASK库。我们还需要包含Arduino SPI库,因为RadioHead库依赖于它。 - #include <RH_ASK.h>
- #include <SPI.h>
复制代码接下来,我们需要创建一个ASK对象访问与RadioHead ASK库相关的特殊函数。 - // Create Amplitude Shift Keying Object
- RH_ASK rf_driver;
复制代码
在setup()函数中,我们需要初始化ASK对象。 - // Initialize ASK Object
- rf_driver.init();
复制代码
在loop()函数中,我们首先准备一条消息。它是一个简单的文本字符串,存储在一个名为msg的字符串指针中。请记住,您的消息可以是任何内容,但不应超过27个字符。并确保计算其中的字符数,因为您需要在接收器代码中进行计数。在我们的例子中,我们有11个字符。 - // Preparing a message
- const char *msg = "Hello World";
复制代码然后使用 send() 函数传输消息。它有两个参数:第一个是数据数组,第二个是要发送的字节数(数据长度)。 send() 函数之后通常是 waitPacketSent() 函数,它一直等待直到任何先前的传输数据包完成传输。之后,草图等待一秒钟,让我们的接收器有时间接收所有内容。 - rf_driver.send((uint8_t *)msg, strlen(msg));
- rf_driver.waitPacketSent();
- delay(1000);
复制代码
433MHz射频接收器的Arduino代码 将接收器的Arduino连接到计算机并加载以下代码: - // Include RadioHead Amplitude Shift Keying Library
- #include <RH_ASK.h>
- // Include dependant SPI Library
- #include <SPI.h>
-
- // Create Amplitude Shift Keying Object
- RH_ASK rf_driver;
-
- void setup()
- {
- // Initialize ASK Object
- rf_driver.init();
- // Setup Serial Monitor
- Serial.begin(9600);
- }
-
- void loop()
- {
- // Set buffer to size of expected message
- uint8_t buf[11];
- uint8_t buflen = sizeof(buf);
- // Check if received packet is correct size
- if (rf_driver.recv(buf, &buflen))
- {
-
- // Message received with valid checksum
- Serial.print("Message Received: ");
- Serial.println((char*)buf);
- }
- }
复制代码
和发射器的代码一样,接收器代码首先包含RadioHead和SPI库并创建一个ASK对象。 - #include <RH_ASK.h>
- #include <SPI.h>
- RH_ASK rf_driver;
复制代码
在setup函数中:我们初始化ASK对象并设置串口监视器,因为这是我们查看接收到的消息的方式。 - rf_driver.init();
- Serial.begin(9600);
复制代码
在loop()函数中:我们创建一个大小与传输消息相同的缓冲区。在我们的例子中,它是11,记得吗?您需要调整它以匹配您的消息长度。请务必包含任何空格和标点符号,因为它们都算作字符。 - uint8_t buf[11];
- uint8_t buflen = sizeof(buf);
复制代码
接下来,我们调用 recv() 函数。如果接收器尚未打开,这将打开接收器。如果有可用的有效消息,它将消息复制到其第一个参数缓冲区并返回 true,否则返回 false。如果函数返回 true,则草图进入if语句并在串口监视器上打印接收到的消息。 - if (rf_driver.recv(buf, &buflen))
- {
- Serial.print("Message Received: ");
- Serial.println((char*)buf);
- }
复制代码然后我们回到循环的开始,重新做一遍。
加载草图后打开串口监视器。如果一切正常,您应该会看到您的消息。
提高433MHz射频模块的通信范围 您用于发射器和接收器的天线确实会影响您使用这些射频模块可以获得的范围。事实上,如果没有天线,你会很幸运能够在一米多的距离内进行通信。
通过适当的天线设计,您将能够在50米的距离内进行通信。当然,那是在户外的空旷地方。您在室内的范围,尤其是穿过墙壁的范围会略微减弱。
天线不需要复杂。一根简单的单芯线可以为发射器和接收器制作出色的天线。只要保持天线的长度,天线直径几乎没有任何重要性。最有效的天线具有与其所使用的波的长度相同的长度。出于实际目的,该长度的一半或四分之一就足够了。
频率的波长计算如下: 频率波长 = 传输速度 (v) / 传输频率 (f)
在空气中,传输速度等于光速,准确地说是 299,792,458 m/s。因此,对于433 MHz波段,波长为: 频率波长 = 299,792,458 m/s / 433,000,000 赫兹 = 0.6924 米 = 69.24 厘米
由于全波 69.24 厘米天线是一根相当长的天线,使用起来不太实用。这就是为什么我们会选择四分之一波长天线,即17.3厘米或6.8英寸。
以防万一,如果您正在试验使用不同频率的其他无线电发射器,您可以使用相同的公式来计算所需的天线长度。很容易,对吧? |