一种基于无线多节点组网的物品查找方案

目录

一、方案介绍

二、方案说明

2.1 设计思路

2.2 组网方式

2.3 主机

2.3.1 功能说明

2.3.1.1 发起呼叫从机的功能

 2.3.1.2 设置从机ID号码的功能

2.3.1.3响应从机呼叫的功能

2.4 从机A 

2.4.1 功能说明

2.4.1.1 发起呼叫主机的功能

 2.4.1.2 响应主机设置识别码的功能

  2.4.1.3 响应主机呼叫的功能

2.5 从机B

2.5.1 功能说明

2.5.1.1 发起呼叫主机的功能

2.5.1.2 显示主机呼叫的ID号码功能 

2.6 上位机

三、方案演示

四、资料获取


一、方案介绍

一种基于无线多节点组网的物品查找方案,是通过将多个节点组成网络,利用无线通信技术实现信息的传输和共享,从而实现对物品的快速、准确查找。该方案具备高效、可靠、灵活的特点,并可广泛应用于各种需要查找物品的场景,例如仓库管理和超市购物等。

该方案由多个节点组成,每个节点均具备无线通信和数据处理能力。节点之间通过无线连接,可以实现信息的实时传输和共享。在物品查找过程中,用户可以通过与节点进行交互,输入需要查找的物品信息。每个节点都有自己的地址信息,可以通过地址信息呼叫设备。

综上所述,基于无线多节点组网的物品查找方案是一种非常有前途的技术方案,具有广泛的应用前景和市场前景。随着技术的不断发展和进步,相信未来会有更多的应用场景和机会涌现出来。

二、方案说明

2.1 设计思路

本方案采用2.4G无线组网通信技术,以一主多从的星型组网方式构成,包括主机、从机A、从机B等三个设备。主机与电脑通过USB转Uart通信技术进行数据交互。上位机可以通过主机设置从机A的ID号码,并在需要时发出呼叫从机ID指令。从机A在接收到主机的呼叫指令后,将以灯光闪烁和蜂鸣器声音的方式提醒用户。从机B的主要功能是显示主机呼叫的ID号码。每隔一秒钟,从机B将循环显示各个从机的ID号码。

该系统设计考虑了高效性、稳定性和易用性。采用成熟的2.4G无线组网技术,确保了数据传输的稳定性和高效性。同时,一主多从的星型组网方式使得系统结构简洁明了,方便用户操作和管理。主机与电脑通过USB转Uart通信技术进行数据交互,使得用户可以通过上位机方便地设置从机A的ID号码,并在需要时发出呼叫从机ID指令。从机A和从机B的不同功能设计,使得系统能够满足用户的实际需求。

综上所述,本方案采用成熟稳定的2.4G无线组网通信技术,一主多从的星型组网方式以及简洁易用的操作方式,具有高效、稳定、易用的特点,适用于各种需要无线通信和远程管理的场景。

2.2 组网方式

2.3 主机

2.3.1 功能说明

主机具备以下三种功能:

  1. 发起呼叫从机的功能;
  2. 设置从机ID号码的功能;
  3. 响应从机呼叫的功能。
2.3.1.1 发起呼叫从机的功能

主机设计具备一次性呼叫五个从机ID的能力,并采用轮询的方式发送ID号码。在发送过程中,如果某个ID号码对应的从机做出回复,则相应的标志位置1。当五个从机ID均已回复时,发送函数才会退出。若在规定时间内尚未收到所有回复,发送函数将超时并退出。在退出后,主机会通过RGB灯的闪烁次数来显示有多少个从机ID作出了回复。

void send_id_process(uint8_t* buf)
{
	uint8_t addr[5] = {0,},i;
	
	if( (*(buf+(id_count*2)+2) != 0) || (*(buf+(id_count*2)+3) != 0) ){ //判断模块ID是否是合理
		addr[0] = 0xaa;
		addr[1] = 0xaa;
		addr[2] = 0xaa;
		addr[3] = *(buf+(id_count*2)+2);
		addr[4] = *(buf+(id_count*2)+3);
		rf_set_addr(TX_ADDR,addr,RF_ADDR_LEN); //设置标号发送地址
		rf_set_addr(RX_ADDR_P0,addr,RF_ADDR_LEN);
		rf_tx_data_noclear(buf,RF_PAYLOAD_WIDTH);
		if((rf_get_status() & TX_DS_FLAG) == TX_DS_FLAG){ //收到ACK回复
			id_buf[id_count] = 1;
		}
		rf_clear_fifo();
		rf_clear_status();
	}
	else{
		id_buf[id_count] = 1; //数据编号为0,直接置1
	}
	
	/*判断是否已经接收到五个模块ACK*/
	for(i = 0;i < 6;i++){
		if(id_buf[i] == 0) break; 
	}
	
	if(i >= 6){
		rf_rx_mode();
		send_id_flag = 0;
		rgb_duty_set(0,0,RGB_DUTY);
		set_rgb_toggle(3,0);
		memset(id_buf,0,sizeof(id_buf));
		memset(rf_tx_buf,0,sizeof(rf_tx_buf));
	}
	if(++id_count >= 6) id_count = 0;
}
 2.3.1.2 设置从机ID号码的功能

该主机具备一项重要的功能,那就是设定从机A的ID号码。通过这个功能,用户可以轻松地为每一个从机A分配一个唯一的ID,确保它们在组网系统中的正确识别。设定成功后,从机会清晰地给予相应的提示。为了确保设置ID的成功率,主机一次性发送200包。

在此情况下,我们将采用设置ID的地址向从机A发送数据。一旦完成数据发送,系统将立即切换到接收模式。

rf_tx_mode();
rf_set_addr(TX_ADDR,rf_set_id_addr,RF_ADDR_LEN);
for(i = 0;i < SET_ID_PKT_NUM;i++){
	rf_tx_data_noack(rf_tx_buf, RF_PAYLOAD_WIDTH);
}
rf_rx_mode();
2.3.1.3响应从机呼叫的功能

一旦主机接收到从机A的呼叫命令,它将置位报警标志位,同时通过主机蜂鸣器发出警报。在此过程中,从机A发送数据包时会附带包序号,以便主机可以过滤重复的包,从而防止接收重复的数据包。

/**************************接收从机呼叫*************************************/
if(rf_rx_data_ack(rf_rx_buf, rf_rx_ack_buf, RF_PAYLOAD_WIDTH))
{
	if( (rf_rx_buf[0] == 0x5a) && (rf_rx_buf[RF_PAYLOAD_WIDTH-1] == 0x5a) )
	{
		switch(rf_rx_buf[1])
		{
			case RX_CALL_STATE:
				current_call_pkt_seq_num = rf_rx_buf[RF_PAYLOAD_WIDTH-2];
				if(last_call_pkt_seq_num != current_call_pkt_seq_num){ //防止接收到重复包
					beep_flag = 1;
				}
				last_call_pkt_seq_num = current_call_pkt_seq_num;
			break;	
		}
	}
}

2.4 从机A 

2.4.1 功能说明

从机A具备以下三种功能:

  1. 发起呼叫主机的功能;
  2. 响应主机设置识别码的功能;
  3. 响应主机呼叫的功能。
2.4.1.1 发起呼叫主机的功能

在从机A上短按按键S2,可以触发对主机的呼叫。从机A将使用指定的主机地址发送数据包,主机在接收到此数据包后将发出报警提醒。如果主机在规定时间内未回复确认信号,呼叫过程将终止。

void call_master_handle(void)
{
	/**************************呼叫主机*************************************/
	if(flag_get(FLAG_KEY2_PRESS))	
	{
		if(send_call_time_count == 0){
			++tx_call_pkt_seq_num;
			rf_call_buf[RF_PAYLOAD_WIDTH-2] = tx_call_pkt_seq_num;
		}
		send_call_time_count++;
		rf_call_buf[2] = (g_config_data.config_data.mod_id>>8) & 0x00ff;
		rf_call_buf[3] = g_config_data.config_data.mod_id & 0x00ff;
		if(send_call_time_count < SEND_ID_TIMOUT){
			rf_set_addr(TX_ADDR,rf_call_addr,RF_ADDR_LEN); //设置标号发送地址
			rf_set_addr(RX_ADDR_P0,rf_call_addr,RF_ADDR_LEN);
			rf_tx_data_noclear(rf_call_buf,RF_PAYLOAD_WIDTH);
			if((rf_get_status() & TX_DS_FLAG) == TX_DS_FLAG) //收到ACK回复
			{
				rf_rx_mode();
				rf_set_addr(RX_ADDR_P0,rf_mod_addr,RF_ADDR_LEN);
				send_call_time_count = 0;
				#if(UART1_DEBUG==1)
				TX1_write2buff(0xF1);
				#endif
				flag_clr(FLAG_KEY2_PRESS);
			}
			rf_clear_fifo();
			rf_clear_status();
		}
		else{
			rf_rx_mode();
			send_call_time_count = 0;
			flag_clr(FLAG_KEY2_PRESS);
			rf_set_addr(RX_ADDR_P0,rf_mod_addr,RF_ADDR_LEN);
		}
	}
}
 2.4.1.2 响应主机设置识别码的功能

在从机A上长按按键S1,将进入设置ID逻辑。一旦接收到主机的设置命令,RGB将闪烁三秒钟,并通过EEPROM保存ID号码。随后,系统将自动退出设置状态。如果未接收到主机的命令或者想退出设置状态,可以再次长按S1。如果短按S1,则会取消主机的呼叫功能,即取消蜂鸣器和RGB的提醒功能。

if(flag_get(FLAG_KEY1_LONG_PRESS))	
{
    if( (rf_rx_buf[2] != 0) || (rf_rx_buf[3] != 0) ){
		g_config_data.config_data.mod_id = (rf_rx_buf[2]<<8) + rf_rx_buf[3];
		rf_mod_addr[3] = rf_rx_buf[2];
		rf_mod_addr[4] = rf_rx_buf[3];
		rf_set_addr(TX_ADDR,rf_mod_addr,RF_ADDR_LEN);
		rf_set_addr(RX_ADDR_P0,rf_mod_addr,RF_ADDR_LEN);
		beep_flag = 0;
		rgb_duty_set(0,1000,0);
		set_rgb_toggle(3,0);
		EEPROM_SectorErase(0x00);						            
        EEPROM_write_n(0x00,g_config_data.config_buff,sizeof(config_data_t)); //保存从机编号
		flag_clr(FLAG_KEY1_LONG_PRESS);
		#if(UART1_DEBUG==1)
			TX1_write2buff(rx_count++);
		#endif
	}
}
  2.4.1.3 响应主机呼叫的功能

一旦从机A接收到主机发送的呼叫命令,它会将报警标志位设置为有效,并通过从机蜂鸣器发出警报。在此过程中,主机在发送数据包时会附带包序号,以便从机A可以识别并过滤掉重复的包,从而避免接收重复的数据包。

current_pkt_seq_num = rf_rx_buf[RF_PAYLOAD_WIDTH-2];
if(last_pkt_seq_num != current_pkt_seq_num){
	beep_flag = 1;
}

last_pkt_seq_num = current_pkt_seq_num;

2.5 从机B

2.5.1 功能说明

从机B具备以下两种功能:

  1. 发起呼叫主机的功能;
  2. 显示主机呼叫ID号码功能。
2.5.1.1 发起呼叫主机的功能

在从机B上短按按键S3,可以触发对主机的呼叫。从机B将使用指定的主机地址发送数据包,主机在接收到此数据包后将发出报警提醒。如果主机在规定时间内未回复确认信号,呼叫过程将终止。

void call_master_handle(void)
{
	/**************************呼叫主机*************************************/
	if(flag_get(FLAG_KEY2_PRESS))	
	{
		if(send_call_time_count == 0){
			++tx_call_pkt_seq_num;
			rf_call_buf[RF_PAYLOAD_WIDTH-2] = tx_call_pkt_seq_num;
		}
		send_call_time_count++;
		if(send_call_time_count < SEND_ID_TIMOUT){
			rf_set_addr(TX_ADDR,rf_call_addr,RF_ADDR_LEN); //设置标号发送地址
			rf_set_addr(RX_ADDR_P0,rf_call_addr,RF_ADDR_LEN);
			rf_tx_data_noclear(rf_call_buf,RF_PAYLOAD_WIDTH);
			if((rf_get_status() & TX_DS_FLAG) == TX_DS_FLAG) //收到ACK回复
			{
				rf_rx_mode();
				rf_mod_addr[3] = (SLAVE_DISPLAY_BOARD_ADDR >> 8) &0x00ff;
				rf_mod_addr[4] = SLAVE_DISPLAY_BOARD_ADDR & 0x00ff;
				rf_set_addr(RX_ADDR_P0,rf_mod_addr,RF_ADDR_LEN);
				send_call_time_count = 0;
				#if(UART1_DEBUG==1)
				TX1_write2buff(0xF1);
				#endif
				flag_clr(FLAG_KEY2_PRESS);
			}
			rf_clear_fifo();
			rf_clear_status();
		}
		else{
			rf_rx_mode();
			send_call_time_count = 0;
			flag_clr(FLAG_KEY2_PRESS);
			rf_mod_addr[3] = (SLAVE_DISPLAY_BOARD_ADDR >> 8) &0x00ff;
			rf_mod_addr[4] = SLAVE_DISPLAY_BOARD_ADDR & 0x00ff;
			rf_set_addr(RX_ADDR_P0,rf_mod_addr,RF_ADDR_LEN);
		}
	}
}
2.5.1.2 显示主机呼叫的ID号码功能 

在接收到主机发送的呼叫ID指令后,从机B会对其进行分析,并提取其中的ID号码。随后,从机B通过数码管将ID号码进行显示。

current_pkt_seq_num = rf_rx_buf[RF_PAYLOAD_WIDTH-2];
if(last_pkt_seq_num != current_pkt_seq_num){ //过滤重复包,防止收到包后主机还未发送超时,接收到重复包重复报警
	beep_flag = 1;
	tm1650_mod_id_load(tm1650_buf,rf_rx_buf+2);
}
last_pkt_seq_num = current_pkt_seq_num;

//使用TM1650驱动数码管,对ID号码进行解析并将其转换为TM1650的缓存数据。
void tm1650_mod_id_load(uint16_t *tm_buf,uint8_t *mod_buf)
{
	uint8_t i;
	
	for(i = 0;i < 5;i++){
		tm_buf[i] = ( (((uint16_t)mod_buf[i*2])<<8) & 0xff00)+ (((uint16_t)mod_buf[(i*2)+1]) & 0x00ff);
	}
}

 

2.6 上位机

根据上位机界面,您可以进行以下操作:

1. 更改从机A的ID号码:在界面中打开对应的主机串口号,并在SET MODULE ID字段下方输入新的ID号码,然后点击发送。

2. 呼叫特定ID号码:在上位机界面中打开对应的主机串口号,在SEND MODULE ID字段下方输入需要呼叫的ID号码,然后点击发送。

注意:同时最多可呼叫五个ID号码。

三、方案演示

无线多节点组网的物品查找方案测试视频

四、资料获取


通过点击以下链接,您可以获取无线多节点组网的物品查找方案原理图、源代码以及开发资料。链接地址将为您提供详细的文件资料,以供您进行参考和使用。

如果您在使用过程中遇到任何问题或疑虑,欢迎加我QQ ,一起探讨技术问题,我的QQ号是986571840,加的时候请注明优快云。

无线多节点组网的物品查找方案(一)主机 - 硬创社 (jlc.com)icon-default.png?t=N7T8https://x.jlc.com/platform/detail/59bd87249bbe4a42bea3095fa5b2d578无线多节点组网的物品查找方案(二)从机A - 硬创社 (jlc.com)icon-default.png?t=N7T8https://x.jlc.com/platform/detail/414e289d446243abafc2967a211bb67f无线多节点组网的物品查找方案(三)从机B - 硬创社 (jlc.com)icon-default.png?t=N7T8https://x.jlc.com/platform/detail/69f471515d994f70a9292b2512924e19

感谢各位用户点赞、分享、在看,这些行为让知识得以更加广泛地传播,从而让更多人受益。

请在转载作品时注明出处,严禁抄袭行为。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芯航路IOT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值