目录
一、方案介绍
一种基于无线多节点组网的物品查找方案,是通过将多个节点组成网络,利用无线通信技术实现信息的传输和共享,从而实现对物品的快速、准确查找。该方案具备高效、可靠、灵活的特点,并可广泛应用于各种需要查找物品的场景,例如仓库管理和超市购物等。
该方案由多个节点组成,每个节点均具备无线通信和数据处理能力。节点之间通过无线连接,可以实现信息的实时传输和共享。在物品查找过程中,用户可以通过与节点进行交互,输入需要查找的物品信息。每个节点都有自己的地址信息,可以通过地址信息呼叫设备。
综上所述,基于无线多节点组网的物品查找方案是一种非常有前途的技术方案,具有广泛的应用前景和市场前景。随着技术的不断发展和进步,相信未来会有更多的应用场景和机会涌现出来。
二、方案说明
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 功能说明
主机具备以下三种功能:
- 发起呼叫从机的功能;
- 设置从机ID号码的功能;
- 响应从机呼叫的功能。
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具备以下三种功能:
- 发起呼叫主机的功能;
- 响应主机设置识别码的功能;
- 响应主机呼叫的功能。
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具备以下两种功能:
- 发起呼叫主机的功能;
- 显示主机呼叫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)https://x.jlc.com/platform/detail/59bd87249bbe4a42bea3095fa5b2d578无线多节点组网的物品查找方案(二)从机A - 硬创社 (jlc.com)
https://x.jlc.com/platform/detail/414e289d446243abafc2967a211bb67f无线多节点组网的物品查找方案(三)从机B - 硬创社 (jlc.com)
https://x.jlc.com/platform/detail/69f471515d994f70a9292b2512924e19
感谢各位用户点赞、分享、在看,这些行为让知识得以更加广泛地传播,从而让更多人受益。
请在转载作品时注明出处,严禁抄袭行为。