/*
nRF24L01多对一试验
本试验可以实现5个发送端向1个接收端发数据
接收端程序,节点编号为6(不需要修改)
侦听所有接收地址(发送端的 talking pipes,也就是发送端的发送地址)
接到数据后,发送反馈到发送信息的发送端的接收地址(发送端指定 listening pipe)
*/
#include
#include
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
// 硬件设置
// 将nRF24L01模块的CE脚插到 D9,CSN脚插到 D10
//创建对象
RF24 radio(9,10);
//地址清单,接收端和发送端的程序里地址清单要完全相同。
//地址到底是什么字符组成并不重要,重要的是各不相同。关键是节点编号的设置,千万记住,接收端节点设置为6,发送端节点设置为1-5。
const uint64_t talking_pipes[5] = { 0xF0F0F0F0A1LL, 0xF0F0F0F0A2LL, 0xF0F0F0F0A3LL, 0xF0F0F0F0A4LL, 0xF0F0F0F0A5LL }; //接收端指定5个通道的接收地址(或称本地地址)
const uint64_t listening_pipes[5] = { 0x3A3A3A3AB1LL, 0x3A3A3A3AB2LL, 0x3A3A3A3AB3LL, 0x3A3A33AB4LL, 0x3A3A3A3AB5LL };//每个发送端指定一个接收地址(或称本地地址)
//定义节点编号变量
uint8_t node_address;
void setup(void)
{
//设置节点编号(不需要修改)
node_address = 6;
// 打印标题
Serial.begin(57600);
printf_begin();
//printf("\n\rRF24L01_R_Multi/\n\r");
//printf("ADDRESS: %i\n\r",node_address);
radio.begin();//启动并初始化nRF24L01
//radio.setPALevel(RF24_PA_MIN);//修改发射功率
//RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm,RF24_PA_MED=-6dBM, and RF24_PA_HIGH=0dBm.
//radio.setChannel(118); //修改频道,0~127都可以
//radio.setPayloadSize(32); //修改有效载荷大小(传输数据长度),最大为32字节
// 打开通道给其他节点进行通讯
radio.openReadingPipe(1,talking_pipes[0]);//给通道1分配接收地址
radio.openReadingPipe(2,talking_pipes[1]);//给通道2分配接收地址
radio.openReadingPipe(3,talking_pipes[2]);//给通道3分配接收地址
radio.openReadingPipe(4,talking_pipes[3]);//给通道4分配接收地址
radio.openReadingPipe(5,talking_pipes[4]);//给通道5分配接收地址
// 开始侦听
radio.startListening();
// 打印设置结果,供调试用
radio.printDetails();
}
void loop(void)
{
// 如果有接收到数据
uint8_t pipe_num;
if ( radio.available(&pipe_num) )
{
//有数据传入,获取通道编号(通道编号就是节点编号)
unsigned long got_time;
bool done = false;
while (!done)
{
// 读取数据
done = radio.read( &got_time, sizeof(unsigned long) );
// 打印数据和节点编号
printf("Got payload %lu from node %i...",got_time,pipe_num);
}
//停止侦听,准备反馈数据
radio.stopListening();
//设置正确的反馈地址
radio.openWritingPipe(listening_pipes[pipe_num-1]);
//获取反馈地址后4位
uint16_t pipe_id = listening_pipes[pipe_num-1] & 0xffff;
//发送反馈,打印地址
radio.write( &got_time, sizeof(unsigned long) );
printf("Sent response to %04x.\n\r",pipe_id);
radio.startListening();//恢复侦听
}
delay(1000);
}