zigbee无线遥控代码实现|学习笔记

简介: 快速学习zigbee无线遥控代码实现

开发者学堂课程【嵌入式之RFID开发与应用2020版zigbee无线遥控代码实现】学习笔记与课程紧密联系,让用户快速学习知识

课程地址https://developer.aliyun.com/learning/course/665/detail/11135


zigbee无线遥控代码实现

 

本节课浏览zigbee主网的例子。

 

点对点通信的例子

把文件中03导出,将project关闭,删除untitled project si4project。重新创建一个工程。因为代码的量比较大,做起来不是很方便。选择install下的debug下的zigbee下的wireless点击确定。

此代码主要作用于遥控器,第一没有OSAL系统,第二不能组网。主要是一对多、一对一或者多对一的通讯。

首先找到main.c,官方提供了函数。点击scr选择components。components中提供的组件是简单的通讯组件。只需要创建main.c,(将编码方式改为UTF-8)在main.c中需要注意:发送数据的时候发给谁;发送目标的PANID和信道是什么;如果对方正在接收数据也正好开启,能够检测到信息的发射,通讯就是成功的。

init uart();

// Config basicRF

basicfConfig.panId = PAN-ID;

basicRfConfig.channel= RF CHANNEL;

basicfConfig.ackRequest=TRUE;

halBoardInit();

halLedset (1);|

halLedSet(2);

halMcuWaitMs(1000);

halLedClear(1):

halLedClear(2);

整个代码一开始的时候就是初始化串口,里面都是针对计算器的操作。

点对点遥控收发数据主要针对填充一个结构体:basicRfCfg-t。只要将这个结构器填正确,不论是收还是发,都没有问题的。

结构体中的成员:

typedef struct {

uint16 myAddr;(地址)

uint16 panId;(网络ID)

uint8 channel;(所使用的信道)

uint8 ackRequest;(是否允许请求应答)

#ifdef SECURITY-CCM

Uint8* securityKey;(安全的key)

Uint8* securityNonce;

所以它的内容填充的很少。那么ID是多少?从0-65535都是可以的。这里给2007,满足16位的范围。

信道的范围是0-26,总共有27个信道。我们这里给的是25,因为0是800多兆,1-10是900多兆,11-24是2.4G,所以这里选的是2.4G.应答设置为真。下面是对键盘的初始化、LED灯的设置,这里设了2个灯,这些都是官方给的,就不去考虑了,而且都是存单片机的操作,很容易看明白的。代码中也有存按键的操作,在文件02.key中的scr中。

POSEL S= ~0X01 ;//设置P00为普通IO口

PODIR S= ~0X01;//按键在P00口,设置为输入模式

POINP &= ~0x0;//打开P00上拉电阻,不影响

按键就是设置输入,然后不断的判断l口的值是否和按下的键是一致的。下去之后看看参考代码即可。

这里是系统帮助完成按键和灯的设置。

halMcuWaitMs(1000);

延时函数,毫秒为单位。后面几个的接口都不是很重要,关键的是下面的内容:

if (appMode == SWITCH)// Transmitter application

appSwitch(&basicRfConfig);

else if (appMode==LIGHT)// Receiver application

appLight(&basicRfConfig);

这个程序有两个功能:1、作为接收方和发射方,如果模式选择的是switch表示属于发射方;如何发射?将结构体构造好之后,直接调到下面的代码中:

uint8 pTxData[APP PAYLOAD_ LENGTH];

// Initialize BasicRF

basicfConfig-›myAddr= SWITCH-ADDR;

if (basicRfInit (bäsicfConfig) ==FAILED) {

HAL ASSERT (FALSE) ;

}

pTxData[0]=LIGHT TOGGLE CMD;

//Keep Receiver off when not needed to save power

basicRfReceiveOff();

首先明确接收方的地址,这里写的是myAddr= SWITCH-ADDR,其实这是对方的地址。将对方的地址明确,并且对数据结构做初始化。初始化的工作主要是设置通信、地址、参数等内容,而且如果设置失败的话,就会再次回到这个函数内。

接下来就是真正的数据:

Ptxdata[APP-PAYLOAD-LENGTH]这里定义的简单,就是1,就是1个字节。这一个字节给的是0。就是发送的长度只有一个字节。现在需要发送,因此就要将接受能力off掉。Basicreceiveoff();这样可以降低功耗,如果是接收方,就把这个设置改为on。让接受方一直在监听信标。在这个循环里面就是判断有没有按下一个按键:

If(halbuttonpushed()==HAL-BUTTON-1)如果按下了这个按键,就把自身口对应的led灯反转一下ha1ledtoggle(1);

最关键的部分:basicRfsendPacke:LIGHT-ADDR

,PTXDATA,APP-PAYLOAD-LENGTH)(上面提到的地址确实是自己的地址,因为发送的时候需要单独填一个地址)这里的地址是destaddr就是目标地址。第二个参数是发送的地址,第三个参数是发的数据多长。所以发送数据就是三要素:目标、源、长度用上面的函数就可以发送了。

那么这个函数basicRfsendPacke是如何发出去的?

这个是企业占位提供的接口,就不用去看了。将后面降低功耗的接口去掉,暂时用不到。只保留这一个 basicRfsendPacke:LIGHT-ADDR

,PTXDATA,APP-PAYLOAD-LENGTH)接口数据就可以发送出去了。

发出去之后另一方需要用另一个程序,就是light。作为一个接收方,如何做?和上面的代码几乎是一样的,设置接收到的数据方到哪里,设置自己的地址并且初始化,然后使能接收信号。

uint8 pTxData[APP PAYLOAD_ LENGTH];

// Initialize BasicRF

basicfConfig-›myAddr= LIGHT-ADDR;

if (basicRfInit (bäsicfConfig) ==FAILED) {

HAL ASSERT (FALSE) ;

}

basicRfReceiveON();

// Main loop

while (TRUE){

while (!basicRfpacketIsReady());

if (basicRfReceive (pRxData, APP _PAYLOAD_LENGTH, NULL)>0) {

If (oRaDatate) == LIGHi_TOGGLE_ CMO) {

Ha1LedToggle(1);

Ha1LedToggle(2);

接口basicRfpacketIsReady是判断有没有接收到数据。如果接收到数据,返回值为1。取反边0,0刚好退出while循环,进入到下面处理这个数据。怎么处理?

While(TRUE){

While(!basicRfPacketIsReady());

If(basicRfReceive(pRxData,APP_PAYLOAD_LENGTH,NULL)>0)

If(pRxData[0] == LIGHT_TOGGLE_CMD){

halLedToggle(1);

halLedToggle(2);

首先提取数据到APP里面,这个APP _PAYLOAD_LENGTH是提取的数据有多长。在提取参数的时候顺便可以prssl看一下信号的强度。如果不考虑信号的强度的话,就可以忽略这个参数。接下来判断接收到的数据是什么。如果接收到的数据是发送的0,那就可以让灯反转一下,亮的变灭,灭的变亮。

下面将这个程序写一些,首先发射端模式改成SWITCH。LIGHT表示先收接收方的代码。将前面打开的关闭,重新开一个新的工程。

打开之后第一步先编一下,将摄像头打开。编译通过。

这个是接收,先把这个程序先稍进去。

一闪一闪的是LED灯,由于刚刚已经编写过了,现在直接稍就可以了。这是接收的代码。

如何稍发送的代码?

需要将代码light改成switch。

image.png

上图是刚刚稍好的一个板子,是接收方。发射方上面有两个按键,按一下就会发射一个信号。

代码很简单,只需要构建一个结构体并且将里面的地址都填好,发给谁,数据是多少,对方就可以收到。

上面提到的一对多,就是上面有多个接收器,他们都设置成相同的信道、网络包括地址的话,是可以进行群发的甚至广播的。也可以一对一的发,也可以多对一的发送,这些发送的过程完全取决于地址怎么设置。

以上就是zigbee点对点通讯的应用。

相关文章
|
4月前
|
传感器 物联网 芯片
毕业设计 基于STM32单片机无线ZIGBEE智能大棚土壤湿度光照检测
毕业设计 基于STM32单片机无线ZIGBEE智能大棚土壤湿度光照检测
H8
|
9月前
|
物联网 数据安全/隐私保护 智能硬件
女朋友问: 你知道蓝牙耳机的原理吗?
蓝牙是一种无线通讯技术标准,用来让固定与移动设备,在短距离间交换资料,以形成个人局域网(PAN)。其使用短波特高频(UHF)无线电波,经由2.4至2.485GHz的ISM频段来进行通信。1994年由电信商(Ericsson)发展出这个技术。它最初的设计,是希望创建一个RS-232数据线的无线通信替代版本。
H8
356 0
|
2天前
|
XML 传感器 网络协议
LabVIEW在无线设备中的应用
LabVIEW在无线设备中的应用
|
14天前
|
物联网 5G 智能硬件
【专栏】无线通信的基础术语,如频段、带宽、调制与解调,以及Wi-Fi、蓝牙、ZigBee等无线技术
【4月更文挑战第28天】本文介绍了无线通信的基础术语,如频段、带宽、调制与解调,以及Wi-Fi、蓝牙、ZigBee等无线技术。还涉及无线信号传播、信道容量、信噪比等概念。理解这些术语有助于深入理解无线通信原理,便于设计和优化无线系统。随着无线技术的不断发展,持续学习是关键。开始你的无线通信探索之旅吧!
|
8月前
|
IDE 物联网 开发工具
CH573第一篇:实现自拍杆蓝牙遥控器1
CH573第一篇:实现自拍杆蓝牙遥控器1
|
10月前
|
传感器 存储 缓存
基于51单片机的蓝牙电子秤设计
基于51单片机的蓝牙电子秤设计
|
11月前
|
传感器 前端开发 机器人
LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)
智能小车是以轮子作为移动机构,并且能够实现自主行驶的机器人,又被称为轮式机器人。由于具有智能化的特点,可以应用于不适合人类工作的环境中,例如灾难救援、户外探险等。智能小车有别于遥控小车,因为后者需要操作人员来控制其转向、启停和前进后退,以及控制其速度,常见的模型小车,都属于这类遥控车。智能小车,则可以通过计算机编程来实现其对行驶方向、启停以及速度的控制,无须人工干预,也可以通过修改智能小车的程序来改变它的行驶方式。 ———————————————— 版权声明:本文为CSDN博主「不脱发的程序猿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:htt
|
11月前
|
传感器 数据采集 物联网
LabVIEW Arduino ZigBee无线气象站(项目篇—3)
目前,国内气象站对地面气象数据的采集大多采用传统的有线方式,其布线成本高,维护不方便,尤其对于山区等一些复杂的地形来说,这种缺点更为明显。传统的无线通信方式有很多,无线电、微波、红外线、蓝牙、射频等,在某些只需简单的无线连接的应用领域对数据速率的要求并不很高,设备的功耗是更需要考虑的问题。ZigBee网络是低功耗、低成本、高可靠性的无线传感器网络,其在环境检测等领域中有着广阔的应用前景。
|
编解码
【经典蓝牙】蓝牙AVRCP协议分析
蓝牙AVRCP协议是蓝牙设备之间音视频的控制协议。定义了音频/视频的控制、浏览、查询、通知等一系列的命令集。常用来蓝牙耳机对手机的音乐进行控制,以及获取手机的音乐信息等场景。AVRCP协议有两个角色,分别是controller(CT)和 target(TG)。CT: 发送控制命令到对端,控制对端媒体播放器的设备,例如蓝牙耳机,蓝牙遥控器等。TG:接收对端的控制命令,并执行操作,进行回复的设备,例如手机,电脑等。
2025 0
【经典蓝牙】蓝牙AVRCP协议分析
|
编解码 算法 数据格式
【经典蓝牙】蓝牙 A2DP协议分析
A2DP(Advanced Audio Distribution Profile)是蓝牙高音质音频传输协议, 用于传输单声道, 双声道音乐(一般在 A2DP 中用于 stereo 双声道) , 典型应用为蓝牙耳机。         A2DP旨在通过蓝牙连接传输高质量的立体声音频流。它使用的基本压缩算法是SBC(Sub-Band Coding)来减小音频数据的大小,同时保持高音质,SBC压缩虽然效率较低,但是是必须支持的基本备用方案。A2DP还支持其他高级编解码器,例如AAC、aptX和LDAC,这些编解码器比SBC提供更好的音质,但这些编解码器的支持取决于设备本身的支持情况。
1528 0
【经典蓝牙】蓝牙 A2DP协议分析