开发者学堂课程【嵌入式之RFID开发与应用2020版:Zigbee温湿度采集控制完整流程】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/665/detail/11141
Zigbee温湿度采集控制完整流程
采集数据通讯的流程,首先要改0,表示温湿度的采集节点。第二步,就是信息的确认,不管是协调器、传感器还是控制器,数据成功入网后,有一个事件的触发。事件里面把本地的消息就是节点的类型,cID发送给协调器,发送的类型内容是affirm。 协调器接收数据的时候,是控制类的,收到这个数据包里面的内容是affirm确认信息,协调器此时不做任何操作,只是将确认信息里面的类型变成控制类型给它记录下来,把地址给它记录下来。
传感器类型为sensor也是把地址记录下来, address里面就保存了加入到协调器网络里面的所有节点,才可以做接下来的东西。
数据采集怎么采集,进到 process里面,有时间叫DEMO GET_TH,就是只有触发了DEMO GET的时候,并且当前是一个传感器设备,在这个循环里面循环的去读取DHT11,也就是温湿度传感器的数据,传感器的这种通信,不是这次课要讲的重点,因为传感器就是4种通讯协议、串口spi2c单总线,只需知道调完这个函数后,温度和湿度的十位和个位分别就得到了。
经过转换之后,把温湿度保存到temp里面,通过Send the point to point,发给协调器记录,所有的温湿度采集到之后,发给协调器,发送过程首先是device,后面的跟之前一模一样,把种子采集的数据发给协调器,关键是没有看到采集温湿度,协调器也没有得到,是谁在触发DEMO GET_TH事件。
搜索发现只有两个地方设置了DEMO GET_TH事件,第一个地方是 osal set event,给当前任务去发送DEMO GET_TH事件,原来是传感器接收到一个消息, get date。要去拿传感器的数据,必须要下达一个get的命令。
可以每次要数据前都get,也可以get了第一次之后,有一个延迟定时器osal_start_timerEx,作用是将my_TaskID任务发送一个DEMO GET的事件,这个事件是在5000毫秒之后发生,也就是每隔5秒钟会触发事件, 5秒钟条件掉一次。每一次就完成一次温湿度的发送,也就是温湿度就会到协调器。
接下来把代码回到这边,把它重新编一下,因为刚才改的代码。保存后编完,下载进去,全速运行。先把下载线给拔掉,内容清空,让协调器重新开始,看过程。
打开摄像头,刚烧进去的温湿度传感器如下图:
控制器上电后入网成功,再把传感器上电且入网成功,协调器需要获得源源不断的温湿度信息,下达get down date指令。
得到如下图温度湿度:
当前温度23度,湿度51%,当前的控制状
态:get_date24,25,40,50,23,51,close,close,manual,manual
即Redmi里面设置温度的最小值、最大值,湿度的最小值最大值,当前温度当前湿度以及温度调节开关,湿度调节开关,还有手动和自动模式,整个数据就是返回的数据,意思是说通过get data,拿到的数据是温度的最小值24,最大值25,湿度最小值40,湿度最大值50%,当前温度23,当前湿度51,当前温度调节开关是关闭的,湿度调节开关是关闭的,温度处于手动控制状态,湿度处于手动控制状态。如下图继电器属于关闭状态:
因为 get一下,拿湿度来举例,40%~50%,它只有超过了50%,开关才会打开,而现在的湿度刚好是50%。增加一下它的湿度,把手放在上面,它湿度应该就会增加超过50%。还有一个问题,现在适度调节,它是手动控制的也不行,现在湿度已经达到70%多了,但是继电器并没有打开,因为控制是属于手动控制。手动控制不行,把整个的范围再重新设置一下复制,湿度设到60%,手动改自动auto。
get一下,没有作用,因为是调试串口,给他发的信息是不起作用的,必须通过另外一个串口网关,对设备的控制是通过网关来实现的,调试接口不能对它进行控制。把网关打开,等待一下。开一个串口效果不直观,开两个串口能看到它调试信息的输出和控制信号的下达,串口号29把它打开,要下达的命令是
set_date20,30,40,60,23,51,auto,auto。发送完get一下,全部改成自动了。设的湿度是60%,也就是湿度超过60%的时候,继电器就会工作,再把手放上去,继电器湿度已经达到70%,继电器自动工作表示湿度太高,要开始除湿,当湿度降下来的时候,继电器会自动关闭如现在57%继电器自动关闭。也可以把它设成手动模式,不管是温度和湿度都一样, manual ,get一下看设置是否正确,通过去设置开关open或者close。控制操作一定要通过网关来来完成。自动的能不能够手动控制?改成自动,重新获取,再去发送手动控制命令,用原先看出对比,打开没有任何反应,其实这个命令已经收到了,设置温度调节为open,再把它关闭,发送温度调节为close,没有任何动作,表示一旦把它设成自动之后,手动控制将无效。
整个的过程因为所有的控制调节都是由协调器来做的,在协调器这一端,每隔5秒钟发送完一次温度采集的信息之后,在协调器这边就会接收到这个数据,接收到数据之后他就会对这个数据进行处理。如果当前是属于传感类数据,并且是协调器,它会对温度进行一个处理。判断当前的工作状态是自动模式还是手动模式,如果是自动模式就会把当前温度值和最小温度进行比较,以及最大的温度进行比较。如果说它的温度范围刚好是在最小值和最大值之间,也就是说它是属于温度适宜关闭所有的升降温设备。如果发现当前温度是超过了最大值,温度太高要开启降温设备。如果温度低于最低值,没有动作,因为只能通过一个灯来表达开关。这个时候应该开启升温设备,湿度也是同样的道理。
非自动模式,手动模式的话,这些条件都不满足,手动模式可以用由用户来决定它的值,它的升温降温,增湿降湿的这些开关怎么样得到控制。手动控制,为什么控制不了?
因为控制是由协调去发出去的,只有自动模式的情况下,是自动发送了开关信号。如果是手动模式的话,是网关给发出来的控制信号,信号是在串口这一块,因为我们的网关是通过串口发发过来的指令,所以它的处理不在上面。当接触到来自于串口0的就不用看,主要是串口1,串口1是来自于网关,如果是网关过来的数据,温湿度先得到,如果要控制调节温度,升温升降温设备的开关,首先就会判断你是不是自动模式,如果是一个自动模式, Return,根本控制不了,如果是非自动模式,不会return,会去完成这个开关数据的开关命令的发送发给控制器,但其实是控制器和传感器都各发了一份,所以传感器的灯也会发生改变。
这就是整个的温湿度采集控制、自动控制、手动控制的整个流程。