nRF24L01 与 Arduino 连接实现无线通信
前言
在本教程中,您将借助两个示例了解 nRF24L01 Arduino 接口。在第一个示例中,我们将发送“Hello world”和一个命令来闪烁连接到另一个 Arduino 的 LED。在第二个示例中,我们将进行双向控制,并从第一个 Arduino 发送命令以在第二个 Arduino 上闪烁 LED,然后我们将从第二个 Arduino 发送命令以在第一个 Arduino 上闪烁 LED。
nRF24L01 模块
nFR24L01 是一个收发器模块,这意味着它可以发送和接收数据。这些模块非常便宜,体积更小,规格也很多。这些模块的一些规格如下:
传输过程中的功耗在12mA左右,比LED还要小。
它可以以 250Kbps 到 2 Mbps 的波特率运行。
如果在开放空间使用并带有天线,其范围可达 100 米。
它可以同时发送和接收数据。
每个模块最多可与 6 个其他模块通信。
它使用 2.4 GHz 频段。
它可以以 1 MB 的传输速率发送 1 到 25 字节的原始数据。
它有 125 个不同的频道。
nRF24L01 模块通过 SPI 通信与 Arduino 协同工作。模块的管脚如下:
该模块的工作电压为 1.9 至 3.6V,但其他引脚可承受 5V,这意味着其他引脚可以直接连接到 Arduino。
MOSI、MISO 和 SCK 是 SPI 引脚,这些需要连接到 Arduino 的 SPI 引脚。不同的 Arduino 有不同的 SPI 引脚。
CSN 和 CE 用于将模块设置为活动模式以及在命令模式和发送模式之间切换。这些可以连接到 Arduino 的任何数字引脚。
IRQ 引脚是中断引脚,您不必连接它。
示例 1 - nRF24L01 Arduino 接口
在 nRF24L01 arduino 接口的第一个示例中,我们将简单地将数据从一个 Arduino 发送到另一个 Arduino。当我们按下连接到第一个 Arduino 的按钮时,连接到第二个 Arduino 的 LED 会亮起。
第一个示例的电路图如下所示,连接如下所示。
发射机代码:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 10); // CE, CSN
const byte address[6] = "00001"; //地址
int button_pin = 2;
boolean button_state = 0;
void setup() {
pinMode(button_pin, INPUT);
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();
}
void loop()
{
button_state = digitalRead(button_pin);
if(button_state == HIGH)
{
const char text[] = "Your Button State is HIGH";
radio.write(&text, sizeof(text)); //发送数据
}
else
{
const char text[] = "Your Button State is LOW";
radio.write(&text, sizeof(text)); //发送数据
}
radio.write(&button_state, sizeof(button_state));
//发送数据
delay(1000);
}
接收方代码:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 10); // CE, CSN
const byte address[6] = "00001";//地址保持一致
boolean button_state = 0;
int led_pin = 3;
void setup() {
pinMode(6, OUTPUT);
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0, address);
radio.setPALevel(RF24_PA_MIN);
radio.startListening();
}
void loop()
{
if (radio.available()) //等待接收数据
{
char text[32] = ""; //保存数据
radio.read(&text, sizeof(text));
radio.read(&button_state, sizeof(button_state));
if(button_state == HIGH)
{
digitalWrite(6, HIGH);
Serial.println(text);
}
else
{
digitalWrite(6, LOW);
Serial.println(text);}
}
delay(5);
}
示例 2 - nRF24L01 Arduino 接口
在 nRF24L01 Arduino 接口的第二个示例中,我们将进行双向通信。首先,我们将从第一个 Arduino 发送命令以点亮连接到第二个 Arduino 的 LED,然后我们将从第二个 Arduino 发送命令以点亮连接到第一个 Arduino 的 LED。
第一个 Arduino 的代码:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 10); // CE, CSN
const byte addresses [][6] = {"00001", "00002"};
//发送地址和接收地址
int button_pin = 2;
int led_pin = 3;
boolean button_state = 0;
boolean button_state1 = 0;
void setup() {
pinMode(button_pin, INPUT);
pinMode(led_pin, OUTPUT);
radio.begin();
radio.openWritingPipe(addresses[1]);
radio.openReadingPipe(1, addresses[0]);
radio.setPALevel(RF24_PA_MIN);
}
void loop()
{
delay(5);
radio.stopListening(); //设置为发送端
button_state = digitalRead(button_pin);
radio.write(&button_state, sizeof(button_state)); //发送数据
delay(5);
radio.startListening(); //设置为接收端
while(!radio.available()); //等待接收数据
radio.read(&button_state1, sizeof(button_state1)); //读取数据
if (button_state1 == HIGH)
{
digitalWrite(led_pin, HIGH);
}
else
{
digitalWrite(led_pin, LOW);
}
}
第二个 Arduino 的代码:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 10); // CE, CSN
const byte addresses [][6] = {"00001", "00002"};
//发送地址和接收地址
int button_pin = 2;
boolean button_state = 0;
boolean button_state1 = 0;
int led_pin = 3;
void setup() {
pinMode(led_pin, OUTPUT);
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(addresses[0]);
radio.openReadingPipe(1, addresses[1]);
radio.setPALevel(RF24_PA_MIN);
}
void loop()
{
delay(5);
radio.startListening();
//设置为接收端
if (radio.available())
//等待接收数据
{
radio.read(&button_state, sizeof(button_state));
if(button_state == HIGH)
{
digitalWrite(led_pin, HIGH);
}
else
{
digitalWrite(led_pin, LOW);
}
delay(5);
radio.stopListening();
//设置为发送端
button_state1 = digitalRead(button_pin);
radio.write(&button_state1, sizeof(button_state1)); //发送数据
}
}
源代码和库文件
源代码和库文件已上传至个人主页