Arduino使用433MHz RF射频发射器和接收器的方法

本教程介绍如何使用Arduino开发板和433MHz RF模块创建一个简易的无线气象站。项目包含一个温湿度传感器和显示屏,能够无线传输环境数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考网址:Arduino开发板使用RF 433M发送器/接收器模块的方法

Arduino开发板使用433MHz RF射频发射器和接收器的方法

原文地址:https://www.yiboard.com/forum.php?mod=viewthread&tid=1535

在制作基于微控制器的项目时,有时会需要在两个设备之间进行通信,要么是基于双工/收发器的操作(两个设备都可以同时发送和接收),要么是基于半双工的操作,其中通信是一个单向的(正在接收的设备无法发送,以及正在发送数据的设备无法接收)。

有很多方式可以实现上述两种通信模式中的任何一种,并且这些选择通常取决于项目的需求,尤其是设备之间的距离和成本。对于两个微控制器之间的短距离、低预算的通信方式,其中一种最优选使用的方式是使用433MHz RF发送器和接收器模块的射频通信。在本篇文章中,我们将介绍如何使用这些模块在两个Arduino开发板之间建立通信。

433 MHz发射器和接收器模块
在这里插入图片描述
这些模块因其低成本和易用性在创客和DIY爱好者中非常受欢迎。它们用于两个微控制器之间的所有短距离、半双工的通信形式,其中一个微控制器用作发送器,另一个微控制器用作接收器。这些模块是ASK(幅移键控)或OOK(开关键控)型RF模块,这意味着它们在发送逻辑“零”时通常不消耗功率,因此消耗的功率非常低。这种低功耗使其在基于电池的实施中非常有用。下面列出了一些发射器和接收器模块的规格。

433MHz发射器模块的规格

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H2NKCWFI-1620701067313)(C:/Users/Administrator/Pictures/typora/164202ztx595z4ccu5acgo.jpg)]

  • √ 工作电压:3V – 12V
  • √ 工作电流:最大小于40mA,最小9mA
  • √ 谐振模式:(SAW)
  • √ 调制模式:ASK
  • √ 工作频率:433.92MHz
  • √ 发射功率:25mWF
  • √ 频率误差:+ 150kHz(max)
  • √ 通讯速率:小于10Kbps
  • √ 发射范围:90m(在开放空间)

433MHz接收器模块规格
在这里插入图片描述

  • √ 工作电压:5.0VDC + 0.5V
  • √ 工作电流:≤5.5mAmax
  • √ 调制模式:OOK / ASK
  • √ 工作频率:433.92MHz
  • √ 带宽:2MHz
  • √ 灵敏度:超过–100dBm(50Ω)

为了演示使用这些模块可以轻松地将无线功能添加到项目中,我们将制作一个带有远程数据显示的气象站。气象站将主要由温湿度传感器和433 RF发射器模块组成。它将测量环境的温度和湿度,并将其通过RF发送器发送到ST7735 1.8寸彩色TFT显示屏上的显示单元(通过RF接收器模块接收)。

所需的组件
● Arduino Uno开发板
● 433Mhz射频套件
● DHT22温湿度传感器
● 1.8寸彩色TFT显示屏
● 面包板
● 跳线

原理图
该项目有两个原理图。第一个用于发送器,该发送器获取环境的温度和湿度,并将其发送到项目的接收器,后者在显示屏上显示数据。

发送器电路原理图
发送器电路包括一个Arduino开发板、DHT22温湿度传感器以及433MHz RF发送器模块。当Arduino与计算机断开连接时,可以使用电池组为Arduino提供电源。如下图所示连接组件。
在这里插入图片描述
接收器电路原理图

接收器电路由433 MHz射频接收器模块、ST7735 1.8寸彩色TFT显示屏和Arduino Uno开发板组成。如下图所示连接组件。
在这里插入图片描述
完成所有连接后,我们现在可以为该项目编写代码。

代码

就像我们必须搭建两个设备一样,我们将为该项目编写两个不同的代码。其中一个代码是控制发送器,另一种代码是控制接收器。为了轻松编写本文的代码,我们将使用可轻松驱动项目各部分的库。对于RF模块,我们将使用virtual wire库来发送和接收数据,而对于接收到的数据的显示,我们将使用Adafruit GFXAdafruit ST7735库来轻松更新ST7735 LCD显示屏。我们将使用Adafruit DHT传感器库轻松地从DHT22传感器获取温度和湿度数据。

代码背后的算法很简单。对于发射器,从DHT22获取温度和湿度值,然后通过RF发射器发送到接收器。对于接收器,使用RF接收器模块获取由发送器发送的温度和湿度值,然后在LCD上显示。与往常一样,我们将对这两个项目的代码进行简要说明。

发射器的代码

首先包含将在代码中使用的库。

//Written by Nick Koumaris 
//info@educ8s.tv  
#include <VirtualWire.h> 
#include "DHT.h"

之后,我们声明将DHT连接到的Arduino的引脚,并指定要使用的DHT的类型。

#define DHTPIN 4 
#define DHTTYPE DHT22

接下来,我们定义Arduino的引脚,该引脚将用作我们的数据传输引脚(连接到RF发送器模块的数据引脚),然后创建将一个用于发送数据的结构体package。

const int led_pin = 13;
const int transmit_pin = 12;

struct package
{
  float temperature ;
  float humidity ;
};

接下来,我们定义一个package实例,并创建DHT类的实例以处理DHT传感器。

typedef struct package Package;
Package data;

DHT dht(DHTPIN, DHTTYPE);

完成这些操作后,我们转到***void setup()***函数,在其中设置TX引脚和其他参数以初始化RF模块。

void setup()
{
    // Initialise the IO and ISR
    vw_set_tx_pin(transmit_pin);
    vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(500);       // Bits per sec
    pinMode(led_pin, OUTPUT);
}

接下来是***void loop()***函数,我们可以使用 readSensor()函数获取温度和湿度。获取数据后,使用vw_send()函数发送数据。延迟2000毫秒,以在数据之间创建一段时间间隔,并确保发送前另一个已发送完成。

void loop()
{
  digitalWrite(led_pin, HIGH); // Flash a light to show transmitting
  readSensor();
  vw_send((uint8_t *)&data, sizeof(data));
  vw_wait_tx(); // Wait until the whole message is gone
  digitalWrite(led_pin, LOW);
  delay(2000);
}

接收器的代码

首先包含将要使用的库。

//Written by Nick Koumaris
//info@educ8s.tv

#include <VirtualWire.h>
#include <Adafruit_ST7735.h>
#include <Adafruit_GFX.h>

接下来,我们声明与LCD引脚相连的Arduino引脚。

#define TFT_CS     10
#define TFT_RST    8                     
#define TFT_DC     9
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);

// Option 2: use any pins but a little slower
#define TFT_SCLK 13   // set these to be whatever pins you like!
#define TFT_MOSI 11   // set these to be whatever pins you like!

接下来,我们声明RF接收器模块的数据引脚所连接的Arduino引脚(receive_pin),并创建char型变量来保存温度和湿度值。

const int receive_pin = 12;
char temperatureChar[10];
char humidityChar[10];

接下来,我们创建一个类似于发射器代码中的结构体package。

struct package
{
  float temperature = 0.0;
  float humidity = 0.0;
};

完成此操作后,我们转到void setup()函数,在该函数中我们初始化显示屏,RF接收器模块设置比特率并启动接收器。

void setup()
{
    tft.initR(INITR_BLACKTAB);
    tft.fillScreen(ST7735_BLACK);
    printUI();
    delay(1000);

    // Initialise the IO and ISR
    vw_set_rx_pin(receive_pin);
    vw_setup(500);   // Bits per sec
    vw_rx_start();       // Start the receiver PLL running
}

接下来,是***void loop()*函数。通过使用*vw_have_message()***函数检查是否已收到消息。如果收到消息,我们将从中提取温度和湿度数据,并将其显示在LCD上。

void loop()
{
    uint8_t buf[sizeof(data)];
    uint8_t buflen = sizeof(data);

if (vw_have_message())  // Is there a packet for us?
  {
    vw_get_message(buf, &buflen);
    memcpy(&data,&buf,buflen);

    Serial.print("\nPackage:");
    Serial.print(data.temperature);
    String temperatureString = String(data.temperature,1);
    temperatureString.toCharArray(temperatureChar,10);
    tft.fillRect(10,20,80,30,ST7735_BLACK);
    printText(temperatureChar, ST7735_WHITE,10,20,3);

    String humidityString = String(data.humidity,1);
    humidityString.toCharArray(humidityChar,10);
    tft.fillRect(10,95,80,100,ST7735_BLACK);
    printText(humidityChar, ST7735_WHITE,10,95,3);

    Serial.print("\n");
    Serial.println(data.humidity);
  }
}

该代码还包括一些用于以更用户友好的方式显示结果的函数。

void printText(char *text, uint16_t color, int x, int y,int textSize)
{
  tft.setCursor(x, y);
  tft.setTextColor(color);
  tft.setTextSize(textSize);
  tft.setTextWrap(true);
  tft.print(text);
}

void printUI()
{
    printText("TEMPERATURE", ST7735_GREEN,30,5,1);  // Temperature Static Text
    printText("o", ST7735_WHITE,90,13,2);
    printText("C", ST7735_WHITE,105,20,3);

    printText("HUMIDITY", ST7735_BLUE,30,80,1);  // Temperature Static Text
    printText("%", ST7735_WHITE,90,95,3);
}

效果演示

将相应的代码上传到每个Arduino开发板。 两个Arduino开发板都可以使用电池组供电。 开机后几分钟,您应该会在LCD上看到温度和湿度数据。

433MHz发射器和接收器模块的范围通常很小,但是通过焊接外部天线,它们的通讯范围可以增大。以上就是本文的所有内容,如有任何疑问,请随时在本帖下面进行回复。

使用Arduino解码并发送433MHz RF无线射频信号 [复制链接]

### 回答1: Arduino RF 433接收模块是一种用于接收无线信号的模块,频率为433MHz。它可以与Arduino开发板一起使用,用于接收来自其他无线设备的信号,并将其转换成可用的数据。 Arduino RF 433接收模块的工作原理是接收来自发射器发送的无线信号。当接收到信号时,它会将信号转换成数字信号,并通过Arduino开发板进行处理。用户可以使用Arduino的开发环境编写程序,根据接收到的信号进行相应的操作。 Arduino RF 433接收模块的应用非常广泛。它可以用于远程控制、无线通信、安防系统、智能家居等领域。例如,我们可以使用Arduino RF 433接收模块来控制家庭电器的开关,监测温度传感器发送的数据,或者接收来自无线遥控器的指令。 使用Arduino RF 433接收模块时,我们需要注意一些事项。首先,模块的天线需要正确连接,并确保天线没有被遮挡,以保证接收信号的效果。其次,我们需要了解所使用的无线频率,并选择合适的库程序来接收信号。最后,我们还需要进行合适的信号调试测试,以确保接收到的信号正确且稳定。 总之,Arduino RF 433接收模块是一种功能强大且易于使用的无线接收模块。通过与Arduino开发板的配合,我们可以实现很多有趣实用的应用,以满足不同的需求。 ### 回答2: Arduino RF 433接收模块是一种用于接收无线信号的设备,可以通过无线电频率433MHz接收来自其他设备或无线传输器发送的信号。 该模块通常由一个RF接收器一个天线组成。RF接收器可以接收到其他设备通过433MHz频率发送的信号,并将其转换为数字信号,以便Arduino可以读取处理。 要使用Arduino RF 433接收模块,我们首先需要通过连接天线将其与Arduino开发板相连。然后,我们可以通过编写Arduino代码来初始化配置该模块,并在接收到信号时执行相应的操作。 使用Arduino库中的相关函数,我们可以设置接收模块的引脚,使其接收解码来自发射器的信号。一旦接收到信号,我们可以使用Arduino的逻辑来处理数据,并根据需要执行相应的任务。例如,我们可以将接收到的信号用于控制其他设备,或将其存储到内存中以供将来使用Arduino RF 433接收模块在无线遥控、安全系统以及物联网等应用中具有广泛的应用。它可以与其他Arduino模块传感器进行配合使用,以实现许多有趣创造性的项目。 总之,Arduino RF 433接收模块是一种非常有用的设备,可用于接收处理来自其他设备或无线传输器的无线信号,并通过Arduino来执行相应的操作。 ### 回答3: Arduino RF 433接收模块是一种能够接收无线信号的模块。它通过射频信号接收器来接收从发射器发送过来的无线信号,并将信号转换为数字信号,以便被Arduino或其他微控制器读取处理。 Arduino RF 433接收模块通常由一个外部接收天线一个RF接收芯片组成。接收天线用于接收来自发射器的无线信号,并将其传递到RF接收芯片。RF接收芯片负责解码转换接收到的射频信号,将其转换为数字信号。 在使用Arduino RF 433接收模块时,我们需要首先将模块与Arduino连接。通常,我们需要将模块的VCC引脚连接到Arduino的5V引脚,将GND引脚连接到Arduino的GND引脚,将DATA引脚连接到Arduino的数字引脚。之后,我们可以使用Arduino编写代码来读取处理接收到的射频信号。 通过编写适当的代码,我们可以将Arduino RF 433接收模块用于许多实际应用。例如,我们可以将其用于无线遥控器,将接收到的信号用于控制电机、灯光或其他设备。我们也可以将其用于无线传感器网络,接收传感器节点发送过来的数据。 总之,Arduino RF 433接收模块是一种功能强大的模块,可以接收处理无线信号。它在各种物联网通信应用中具有重要的作用,为我们的项目创意提供了更多的可能性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值