本帖最后由 lxf 于 2020-8-17 13:18 编辑
第42课 NRF24L01 2.4G无线模块的使用
目标
利用NRF24L01 2.4G无线模块进行数据的传输
实验材料
Arduino UNO开发板*2 NRF24L01 2.4G无线模块*2 配套USB数据线*2 配套杜邦线若干 Arduino IDE软件
内容
利用NRF24L01 2.4G无线模块进行数据的传输,在一块Arduino UNO 上发送“Hello World”,在另一块Arduino UNO 上接收“Hello World”。
接线图
接线方式
Arduino UNO <------> NRF24L01 2.4G无线模块 3.3V <------> VCC GND <------> GND 8 <------> CSN 7 <------> CE 13 <------> SCK 11 <------> MOSI 12 <------> MISO
需要用到NRF24L01 2.4G无线模块的第三方库文件,文件名为“RF24-master”。
提取码:j6y6
下载后安装库文件
文件下载后无需解压,点击Arduino IDE菜单栏项目—加载库—添加.ZIP库...
选择RF24-master文件
程序实现代码
发送端程序 Sender.ino
- #include <SPI.h>
- #include <nRF24L01.h>
- #include <RF24.h> //NRF24L01 2.4G无线模块的库文件
- RF24 radio(7, 8); //创建一个RF24的对象CE=7, CSN=8
- const byte address[6] = "00001"; //创建一个数组,建立发送机地址,或者说两个模块将用于通信的“管道”
- void setup() {
- radio.begin(); //初始化radio对象
- radio.openWritingPipe(address); //使用radio.openWritingPipe()函数设置的发送机地址
- radio.setPALevel(RF24_PA_MIN); //设置功率放大器级别,将其设置为最小值
- radio.stopListening(); // 使用radio.stopListening()函数将模块设置为发送机
- }
- void loop() {
- const char text[] = "Hello World"; //创建一个字符数组,并为其分配消息”Hello World”
- radio.write(&text, sizeof(text)); //使用radio.write()函数将消息发送给接收机,text是要发送的字符变量,
- // sizeof(text))设置了我们要从text变量中获取的字节数
- delay(1000); //延迟等待1秒
- }
复制代码
接收端程序 Receiver.ino
- #include <SPI.h>
- #include <nRF24L01.h>
- #include <RF24.h> //NRF24L01 2.4G无线模块的库文件
- RF24 radio(7, 8); //创建一个RF24的对象CE=7, CSN=8
- const byte address[6] = "00001"; //创建一个数组,建立接收机地址,或者说两个模块将用于通信的“管道”
- void setup() {
- Serial.begin(9600);
- radio.begin(); //初始化radio对象
- radio.openReadingPipe(0, address); //使用radio.openReadingPipe()函数设置的接收机地址
- radio.setPALevel(RF24_PA_MIN); //设置功率放大器级别,将其设置为最小值
- radio.startListening(); // 使用radio..startListening()将模块设置为接收机
- }
- void loop() {
- if (radio.available()) { //判断是否有要接收的数据
- char text[32] = ""; //创建一个由32个元素组成的数组
- radio.read(&text, sizeof(text)); //读取数据,并将其存储到text变量中
- Serial.println(text); //打印变量text的数据,即接收到的数据
- delay(1000); //延迟等待1秒
- }
- }
复制代码
程序上传后点击接收方的串口监视器进行查看,每隔1秒出现“Hello World”字样
const常量
const关键字代表常量 (Constant)。它用于修改变量性质,使其变为只读状态。常量可以像任何相同类型的其他变量一样使用,但不能改变其数值。也就是说,常量的数值在建立时一旦确定以后,如果在后续的程序中尝试改变常量数值,那么程序编译时将会报错。 const关键字定义的常量与其他变量遵守相同的规则。由于使用 #define定义常量具有缺陷 ,所以用 const 关键字定义常量更加好一些。
示例
- const float pi = 3.14;
- float x;
- void setup()
- {
- x = pi * 2; // 常量可用于数学运算
- pi = 7; // 注意!常量数值不能改变。这句程序将报错。
- }
- void loop()
- {
- }
复制代码
#DEFINE 或 CONST
您可以使用 const 或 #define 创建数字或字符串常量。但要创建arrays数组常量,只能使用const定义。
byte(字节)
byte类型变量可存储8位无符号数,其存储数值范围是 0 – 255。 byte类型变量在控制LED时显得格外有用,因为Arduino控制LED亮度或色彩时常常使用的数值是在0-255之间。
示例程序
- byte b; //创建byte类型变量b
- void setup() {
- Serial.begin(9600);
- }
- void loop() {
- b++;
- Serial.print("b = ");
- Serial.println(b);
- delay(100);
- }
复制代码变量b的数值会从0开始逐1递增,在b的数值达到255时,当变量b再次执行b++操作后,变量b的数值将会复位到0,然后再次逐1递增,程序将会依次往复循环。
打开串口监视器,查看结果
指针运算符:
& 取地址运算符: 它返回其操作数(即一个变量)在内存中的实际地址。 C语言中提供了地址运算符&来获取变量的地址,其一般形式为: &变量名; 假设有整数型变量a,那么&a表示变量a的地址。再假设我们还有一个指向整型变量的指针变量p,如要把变量a的地址赋予指针变量p可以用以下方式。
int a; //建立整数型变量a
int* p; //建立整数指针变量p
p=&a; //将变量a的地址赋予指针变量p |