实现NRF24L01自动对频功能

大家知道这个模块一个只有128个频道,那么代表着同一附近最多只能存在128个设备,不过这个环境中也很难同时存在这样的现象.
如果要制作很多个这样的设备,每个设备需要工作不同频率上,那么就需要每个设备有不同的代码(因为要修改频道)。想想就很可怕。
这也不是一个程序员做的事情。
在网上找了几天也没有找到相关技术,可能是因为商业原因吧,只能自己琢磨实现思路。
最近2天做了一个自动対频的思路,因为代码过多,很多文件都是之前博客编写过的就不上传了。关键是理解思想。


思路:
接收端:
接收端按下按键进入対频模式(在指定的频道上运行)
随机获取频道数
发送频道数给发射端
等待发射端ACK
切换到该频道(随机频道)
进行通信
保存随机频道到内部flash


发射端:
发射端按下按键进入対频模式
接收接收端发来的频道并进行校验
发送接收完毕ACK
切换到该频道(随机频道)
进行通信
保存随机频道到内部flash


整体思路如上诉。


该程序需要用到NRF基本通信功能,随机数功能,flash功能。这些功能前面博客有提到。


开发环境:keil 4
开发语言:C/C++
开发平台:STM32


下面上传代码

dui_pin.h

/*
日期:18-1-18
作者:HES

功能:实现NRF24l01自动对频功能

*/


#ifndef _DUI_PIN_H
#define _DUI_PIN_H
#include "nrf_info.h"
#include "sys.h"
#include "24l01.h"

#define DUI_PIN_LOG 1			//串口日志开关

#define DUI_PIN_CH 00			//对频使用频道

#define NULL 0

#define SEND_ACK 5		//发送的ACK
#define RECV_ACK 5		//接收的ACK

#define	 STEP1 1			//各种对频状态
#define	 STEP2 2
#define	 STEP3 3
#define	 STEP4 4

#define DUI_PIN_ID  99 //对频ID

#define DUI_PIN_FLAG 9	//对频标识

class DUI_PIN:public NRF_INFO		//继承NRF功能
{
	public:
				u8 CH;		//对频频道
				u8 state;	//对频状态
				u8 flash_buf[2];	//用于保存频道数据到falsh
				void RX_start_dui_pin();		//RX对频
				void TX_start_dui_pin();		//TX对频
				void save_ch_flash();				//保存频道到flash
				void read_ch_flash();				//对其flash中频道
};

#endif
dui_pin.c

/*
日期:18-1-18
作者:HES

功能:实现NRF24l01自动对频功能

*/

#include "dui_pin.h"
#include "serial.h" 
#include "delay.h"
#include "time.h"
#include "timer.h"
#include "stdlib.h"
#include "flash.h"


/*
日期:18-1-18
作者:HES

功能:实现接收端自动对频功能

*/
void DUI_PIN::RX_start_dui_pin()
{
	
					u8 num=0;
			#if DUI_PIN_LOG
					printf("<<---进入对频模式--->>\r\n");
			#endif
					NRF24L01_TX_Mode(1,DUI_PIN_CH);
					delay_ms(10);
					
					do
					{
						srand(Timer_Count_Value);	//随机种子Timer_Count_Value是定时器的计数值,
						
						num  = rand() % 128;    //生成0—128内的随机整数,
				#if DUI_PIN_LOG
						printf("<<---生成频道:%d--->>\r\n",num);
				#endif		
						state=STEP1;
					}while(num==DUI_PIN_CH);				//频道等于对频频道,重新获取
					
					while(1)
					{
						state=STEP2;
						NRF24L01_TX_Mode(1,DUI_PIN_CH);
						delay_ms(20);
						send_mes(num,DUI_PIN_FLAG,NULL,NULL,NULL);		//发送随机通道和对频标识
						delay_ms(10);
					
						
#if 1				
						NRF24L01_RX_Mode(1,DUI_PIN_CH);
						delay_ms(20);
						if(recv_mes())
						{
							#if DUI_PIN_LOG
							printf("<<---接收到数据--->>\r\n");
							#endif
							//TX返回ACK
							if(ID==RECV_ACK)
							{		
									CH=num;
									break;
							}
						}
#endif						
							#if DUI_PIN_LOG
						printf("<<---对频中--->>\r\n");
				#endif		
						
					}
				#if DUI_PIN_LOG
						printf("<<---TX接收频道数据完成:%d--->>\r\n",CH);
				#endif
					
					while(1)
					{
						state=STEP3;
						NRF24L01_TX_Mode(1,CH);
						delay_ms(10);
						send_mes(SEND_ACK,NULL,NULL,NULL,NULL);
						delay_ms(10);
						NRF24L01_RX_Mode(1,CH);
						delay_ms(10);
						if(recv_mes())
						{
							//TX返回ACK
							if(ID==RECV_ACK)	
							break;
						}
						#if DUI_PIN_LOG
						printf("<<---频率验证中成:%d--->>\r\n",CH);
						#endif
						
					}
					
				#if DUI_PIN_LOG
						printf("<<---对频完成:%d--->>\r\n",CH);
				#endif
					
					save_ch_flash();
					state=STEP4;
}

/*
日期:18-1-18
作者:HES

功能:实现发送端自动对频功能

*/

void DUI_PIN::TX_start_dui_pin()
{
					u8 n=0;
					u8 num=0;
			#if DUI_PIN_LOG
					printf("<<---进入对频模式--->>\r\n");
			#endif
					NRF24L01_RX_Mode(1,DUI_PIN_CH);
					delay_ms(10);
					
				
						state=STEP1;
					
					
					while(1)
					{
						state=STEP2;
						NRF24L01_RX_Mode(1,DUI_PIN_CH);
						delay_ms(20);
						if(recv_mes())
						{
							
							if(TX_voltage!=DUI_PIN_FLAG)continue;		//接收到不是对频标识则继续等待
							
							#if DUI_PIN_LOG
							printf("<<---接收到对频数据--->>\r\n");
							#endif	
							
							//TX返回ACK
							
									CH=ID;
									NRF24L01_TX_Mode(1,DUI_PIN_CH);
									delay_ms(20);
									n=10;
									while(n--!=1)												//发送10次ACK
									{
										send_mes(RECV_ACK,NULL,NULL,NULL,NULL);		
										delay_ms(100);
									}
									break;
							}
							#if DUI_PIN_LOG
							printf("<<---对频中--->>\r\n");
							#endif	
						}
						
					
				#if DUI_PIN_LOG
						printf("<<---TX接收频道数据完成:%d--->>\r\n",CH);
				#endif
					
					while(1)
					{
						state=STEP3;
						NRF24L01_RX_Mode(1,CH);
						delay_ms(20);
						if(recv_mes())
						{
							//TX返回ACK
							if(ID==RECV_ACK)	
							break;
						}
					#if DUI_PIN_LOG
						printf("<<---频率验证:%d--->>\r\n",CH);
					#endif
					}
					
									NRF24L01_TX_Mode(1,CH);
									delay_ms(20);
									n=10;
									while(n--!=1)
									{
										send_mes(RECV_ACK,NULL,NULL,NULL,NULL);
										delay_ms(20);
									}
					
				#if DUI_PIN_LOG
						printf("<<---对频完成:%d--->>\r\n",CH);
				#endif
					
				save_ch_flash();
									
				state=STEP4;					
					
}
/*
日期:18-1-18
作者:HES

功能:实现保存频道到内部flash

*/
void DUI_PIN::save_ch_flash()
{
	flash_buf[0]=CH;
	flash_buf[1]=1;
	
	FLASH_WriteByte(ADDR,flash_buf,2);
	
}
/*
日期:18-1-18
作者:HES

功能:实现读取内部flash中频道

*/
void DUI_PIN::read_ch_flash()
{
	
	FLASH_ReadByte(ADDR,flash_buf,2);
	
	CH=flash_buf[0];
	
}
主函数测试:

	接收端主函数调用测试:

	DUI_PIN dui_pin //定义功能对象

	main()
	{
		/*
			之前一定要初始化NRF基本通信功能,随机数功能,flash功能。三大板块功能

		 */
		dui_pin.RX_start_dui_pin();
		printf("RX対频完成\r\n");
	}

	发射端主函数调用测试:

	DUI_PIN dui_pin //定义功能对象

	main()
	{
		/*
			之前一定要初始化NRF基本通信功能,随机数功能,flash功能。三大板块功能

		 */
		dui_pin.TX_start_dui_pin();
		printf("TX対频完成\r\n");
	}
接收端效果:

<<---对频中--->>
<<---对频中--->>
<<---对频中--->>
<<---接收到数据--->>
<<---TX接收频道数据完成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---频率验证中成:95--->>
<<---对频完成:95--->>





nRF24L01是一种低功耗2.4GHz无线通信模块,可以广泛应用于无线传感器网络、远距离数据传输等领域。nRF24L01模块的配对是指将两个或多个模块进行连接和通信的过程。 要进行nRF24L01的配对,需要以下步骤: 1. 硬件连接:首先,需要将两个nRF24L01模块与Arduino等主控设备相连接。其中一个模块作为发送端,另一个作为接收端。 2. 编程设置:使用相应的编程语言和开发环境,编写代码来控制nRF24L01模块的工作。发送端的代码负责将数据发送到接收端,接收端的代码负责接收和解析发送端的数据。 3. 地址匹配:nRF24L01模块有一个可配置的地址,包括发送地址(TX地址)和接收地址(RX地址)。在配对过程中,需要确保发送端和接收端的地址是一致的,以便正确地进行通信。 4. 信道设置:nRF24L01模块有多个信道可供选择。在进行配对时,需要确保发送端和接收端选择了相同的信道,以便它们能够在同一个率上进行通信。 5. 数据传输:通过编程设置发送端和接收端的工作模式和数据传输方式,可以实现数据的双向传输。发送端将需要传输的数据发送给接收端,接收端接收到数据后进行相应的处理或反馈。 6. 通信测试:完成以上步骤后,可以进行一些测试来验证nRF24L01模块的配对是否成功。可以发送一些简单的数据或指令,观察接收端是否能够正确接收并执行相应的操作。 通过以上步骤,可以实现nRF24L01模块的配对,使其能够进行有效的无线通信。在实际应用中,可以根据需要添加更多的功能和安全措施,以确保通信的稳定性和可靠性。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值