基于zigbee和stm32的智能家居控制系统的设计与实现
文章出处: 责任编辑: 发布时间:2019-02-26 10:48:47 点击数:- 【 】
zigbee核心板ds18b20模块(温度传感器)mq_2(烟雾传感器)客厅led流水灯(模拟真实环境)蜂鸣器dht11(温湿度传感器)卧室led灯光敏传感器hcsr501(人体热释电)系统检测灯mcu(stm32f103c8t6)
μc/os-ii是一个可裁剪的、可固话的、可移植的、抢占式实时多任务系统内核,适用于多种微处理器和微控制器,能够移植到超过100多种微处理器应用开发中。本次下位机中就移植了这样一个小型的嵌入式操作系统,使得整个系统显示十分的流畅,而且也很好管理。
μc/os-ii的移植这里就不说了,网上有好多的介绍,其中正点原子和野火的讲的都比较详细,可以去看看,首先说明,我的这个工程也是参考他们的。一下是我的整个工程的结构,整体上还算比较详细的:
通过代码可以很清晰的看出来各个传感器的 驱动、数据的读取等细节,这里主要说说系统多的任务的实现。
主函数开始后进行了一些列的初始化操作,随后初始化了μc/os-ii系统,并且创建了一个开始任务:
创建开始任务:
开始任务创建成功后便会在开始任务里边进行其他任务的初始化操作:
可以很清楚的看到,开始任务里边创建了多个任务,接着,各个任务创建成功后边会挂起任务,退出临界区,开始各个任务的轮训操作。
上面各个任务创建时,都指定了任务优先级,堆栈大小等信息。在app.h文件中可以看到:
任务的优先级决定了任务在被打断时执行的顺序,优先级越高,越有优先权。
在单片机开发过程中串口的操作可以算是最普通也是最基础的操作了,好多东西都是需要通过串口进行输出,这样可以对程序执行过程中的一些中间数据进行输出。这里主要说说串口数据的读取。
数据的读取使用中断的方式进行交互,这样效率很高。这里执行看核心代码即可:
这里接收数据时对帧头进行了一个简单的判断,正确后接着接收,碰到帧尾后将数据拷贝到了一个缓冲区中,然后清空接收缓冲。整个过程就这么简单。
数据解析
前一部分介绍了数据的接收,这里再说说对数据的解析。从上面的代码中可以看出来有个函数:cpynbyte2buffer(),该函数是吸纳对数据的解析操作,如下所示:
在上面对数据结构体进行了赋值后便开始了整整的数据或者命令的执行,如?recv_data(protocol *protocol)所示:
数据发送任务函数:
上面是数据发送任务里调用的发送函数,该函数中对各个传感器采集到的数据进行了打包并发送操作。可以看打包发送函数:
void pack_send_data(u8 drive, u8 drive_cmd, u8 data_len, u8 *data)
这里列出来核心代码,具体实现代码请看工程。打包发送函数中主要做了2件事情:一:对数据成员初始化,二:判断一帧数据的大小!数据大小值很重要的,这在数据解析过程可需要用到。
μc/os-ii是一个可裁剪的、可固话的、可移植的、抢占式实时多任务系统内核,适用于多种微处理器和微控制器,能够移植到超过100多种微处理器应用开发中。本次下位机中就移植了这样一个小型的嵌入式操作系统,使得整个系统显示十分的流畅,而且也很好管理。
μc/os-ii的移植这里就不说了,网上有好多的介绍,其中正点原子和野火的讲的都比较详细,可以去看看,首先说明,我的这个工程也是参考他们的。一下是我的整个工程的结构,整体上还算比较详细的:
通过代码可以很清晰的看出来各个传感器的 驱动、数据的读取等细节,这里主要说说系统多的任务的实现。
主函数开始后进行了一些列的初始化操作,随后初始化了μc/os-ii系统,并且创建了一个开始任务:
创建开始任务:
开始任务创建成功后便会在开始任务里边进行其他任务的初始化操作:
可以很清楚的看到,开始任务里边创建了多个任务,接着,各个任务创建成功后边会挂起任务,退出临界区,开始各个任务的轮训操作。
上面各个任务创建时,都指定了任务优先级,堆栈大小等信息。在app.h文件中可以看到:
任务的优先级决定了任务在被打断时执行的顺序,优先级越高,越有优先权。
在单片机开发过程中串口的操作可以算是最普通也是最基础的操作了,好多东西都是需要通过串口进行输出,这样可以对程序执行过程中的一些中间数据进行输出。这里主要说说串口数据的读取。
数据的读取使用中断的方式进行交互,这样效率很高。这里执行看核心代码即可:
这里接收数据时对帧头进行了一个简单的判断,正确后接着接收,碰到帧尾后将数据拷贝到了一个缓冲区中,然后清空接收缓冲。整个过程就这么简单。
数据解析
前一部分介绍了数据的接收,这里再说说对数据的解析。从上面的代码中可以看出来有个函数:cpynbyte2buffer(),该函数是吸纳对数据的解析操作,如下所示:
在上面对数据结构体进行了赋值后便开始了整整的数据或者命令的执行,如?recv_data(protocol *protocol)所示:
数据发送任务函数:
上面是数据发送任务里调用的发送函数,该函数中对各个传感器采集到的数据进行了打包并发送操作。可以看打包发送函数:
void pack_send_data(u8 drive, u8 drive_cmd, u8 data_len, u8 *data)
这里列出来核心代码,具体实现代码请看工程。打包发送函数中主要做了2件事情:一:对数据成员初始化,二:判断一帧数据的大小!数据大小值很重要的,这在数据解析过程可需要用到。
您还在等什么呢?马上拿起您的手机订购吧!铭港订购热线:400-775-6159
下一篇:智能家居如何让我们的生活实现智能化生活?上一篇:智能家居现状及市场分析