应用zigbee实现智能家居项目

该项目是之前的一次课设作业,详细的实验报告及答辩用PPT已上传,大家可按需下载。

应用zigbee的智能家居实验报告及答辩ppticon-default.png?t=M666https://download.csdn.net/download/m0_53966219/85833427?spm=1001.2014.3001.5501

以下为正文‍‍❤️‍

一、概述

        智能家居(home automation)是以住宅为平台,利用综合布线技术、网络通信技术、安全防范技术、自动控制技术、音视频技术将家居生活有关的设施集成,构建高效的住宅设施与家庭日程事务的管理系统,提升家居安全性、便利性、舒适性、艺术性,并实现环保节能的居住环境。

        ZigBee包含以下三个部分

        协调器:(coordinator)每个zigbee网络只允许有一个zigbee的协调器,协调器首先选择一个信道和网络标识(PAN ID),然后开始这个网络.因为协调器是整个网络的开始,他具有网络的高权限,是整个网络的维护者,还可以保持间接寻址用的表格绑定,同时还可以设计安全中心和执行其他动作,保持网络其他设备的通信。

        路由器:(router)路由器是一种支持关联的设备,能够实现其他节点的消息转发功能。Zigbee的树形网络可以有多个zigbee路由器设备,zigbee的星型网络不支持zigbee的路由器设备。

        终端:(end)Zigbee终端节点是具体执行的数据采集传输的设备,他不能转发其他节点的消息。

        ZigBee技术在低功耗、低成本和组网能力具有无可比拟的应用优势,因此在智能家居中有许多应用,如下图的Aqara网关使用Zigbee3.0版本:

应用zigbee实现智能家居项目_第1张图片

        我们选择设计一套以一个协调器(Coordinater)及四个终端(End Device)组成的星型网络智能家居系统

应用zigbee实现智能家居项目_第2张图片

        其中协调器(红点)完成充当ZigBee网络的网关(中心节点)角色,通常负责ZigBee协议与NB-IoT、WiFi等其他协议的转换、在特定的信道组建网络等,同时具备路由器的功能,此次实验中它负责接受终端发送的数据,并将数据上传到ONENET。终端(灰点)通过ADC采样以及检测管脚的电平来采集所需要的数据,并将数据发送给协调器。

        该智能家居系统可以采集的信息有:

  1. 温度
  2. 湿度
  3. 光照强度
  4. 有毒烟气浓度
  5. 是否有人经过
  6. 是否有声音

        该智能家居系统拥有的功能:

  1. 将上述6种信息上传至ONENET云平台,实现PC端以及手机端对室内环境的监控以及室内设备的控制;
  2. 通过判断温湿度是否超过阈值来控制步进电机以及开断断路器,分别实现窗户的自动开关以及空调的自动开关;
  3. 通过判断光照强度是否低于阈值来控制步进电机以及LED灯,分别实现窗帘的自动开关以及室内灯光的自动开闭;
  4. 通过判断光照强度以及有毒烟气浓度是否超过阈值,来发出声光报警信号,同时ONENET云平台也会向住户发送信息进行提醒;
  5. 通过判断是否有人经过以及是否发出声响来判断房门位置是否有人活动。

二、协调器的设计

      协调器的任务是充当ZigBee网络的网关(中心节点)角色,通常负责ZigBee协议与NB-IoT、WiFi等其他协议的转换、在特定的信道组建网络等,同时具备路由器的功能,此次实验中它负责接受终端发送的数据,并将数据上传到ONENET。

        首先进入ZMain.c中的main函数,main函数是整个程序的入口,其中有各种初始化、使能中断、启动看门狗等函数,最后进入系统轮询任务池。此处代码在源代码的基础上没有改动。协调器的网络地址为固定的0x0000,剩下的0x0001~0xFFF7被分配到ZigBee网络中的设备,作为网络地址使用。

其次,在IOT.h中更改以下四项:

    其中,devkey为ONENET平台的apikey,devid为ONENET平台的设备id,LYSSID以及LYPASSWD为我所使用的wifi名称以及密码。

                这四项会在IOT.c中的初始化MQTT、连接路由器以及登陆到MQTT服务器(IP为183.230.40.33)、登陆ONENET调用。

        终端上传的数据使用下方代码获取:

应用zigbee实现智能家居项目_第3张图片

        由于WIFI模块实际上相当于一个串口,我们使用HalUARTWrite()函数完成相关功能,所以我们要将需要发到云端的数据按上传数据的终端号进行分类与命名,如下图所示:

应用zigbee实现智能家居项目_第4张图片

        该段代码放置于应用层(App)的coordinater.c中,来自终端1的数据为温度与湿度;终端2的数据为有毒烟气浓度以及光照强度;终端3的数据为是否有声音以及是否存在移动的人。


三、终端的设计

        三个终端的设置类似,首先要对终端号进行配置,ENDNUM将在enddevice.c中被使用,用于区别是从哪一个终端上传的数据。

        采集数据分为两类,一类是ADC采样采集模拟量,一类是检测引脚电平的开关量,其中ADC检测的相关函数被定义于硬件适配层(HAL)中的hal_adc.c中:

应用zigbee实现智能家居项目_第5张图片

        对于温湿度传感器DHT11来说,其温湿度传感的使能函数以及采集函数均定义在DHT11.c中:

应用zigbee实现智能家居项目_第6张图片

    使用过程中,上述采集信息的函数需要在终端的enddevice.c文件中GenericApp_SendTheMessage( void )函数中调用,其中GetADCMQ以及GetADCVol分别为每块终端上所连的传感器1与传感器2:

应用zigbee实现智能家居项目_第7张图片

应用zigbee实现智能家居项目_第8张图片

        当所有数据正确采集以后,使用:

应用zigbee实现智能家居项目_第9张图片

        函数将数据上传至协调器。


四、云端数据流及可视化的设计

        我们选择ONENET云平台进行数据的显示

应用zigbee实现智能家居项目_第10张图片

        当数据通过协调器上的WIFI模块上传至云端后,我们可以看到其数据流名称与我们在串口发送的字符串中的命名一致:

应用zigbee实现智能家居项目_第11张图片

        之后,我们可以点开单项进行检测:

应用zigbee实现智能家居项目_第12张图片

        当各模块连接正常后,我们还可以进行可视化设计:

应用zigbee实现智能家居项目_第13张图片

应用zigbee实现智能家居项目_第14张图片

        手机端观看效果如下图所示:

应用zigbee实现智能家居项目_第15张图片

        四个模块工作状态如下图所示:

应用zigbee实现智能家居项目_第16张图片应用zigbee实现智能家居项目_第17张图片应用zigbee实现智能家居项目_第18张图片应用zigbee实现智能家居项目_第19张图片

        从左至右分别为终端3、终端2、协调器以及终端1。


五、附录

1.点播通讯主要代码段

应用zigbee实现智能家居项目_第20张图片

上电后可以看到只有协调器在一个周期内收到信息。也就是说路由器和终端均与地址为 0x00(协调器) 的设备通信,不与其他设备通信。确定通信对象的就是节点的短地址,实现点对点传输。

afAddrNotPresent = AddrNotPresent, 
afAddr16Bit = Addr16Bit, //点播方式
afAddr64Bit = Addr64Bit, 
afAddrGroup = AddrGroup, //组播方式
afAddrBroadcast = AddrBroadcast //广播方式
首先定义通信方式。
uint16 shortAddr; //短地址
ZLongAddr_t extAddr; //IEEE 地址
} addr; 
afAddrMode_t addrMode; //传送模式
byte endPoint; //端点号
uint16 panId; // used for the INTER_PAN feature

2.光敏传感器的控制代码段

state = 0x31; //当光敏电阻处于黑暗中时 P0.5 高电平
HalUARTWrite(0,"midnight\n", 9); //串口显示
HalLcdWriteString( "midnight", HAL_LCD_LINE_3 ); //LCD显示
设置黑暗条件下的光敏传感器工作方式及显示方式。
HalUARTWrite(0, pkt->cm d.Data, pkt->cmd.DataLength); //输出接收到的数据
HalUARTWrite(0, "\n", 1); // 回车换行
将光敏传感器捕获信息发送至协调器

        光敏只需读取与之相连 IO 口电平,来判断当前环境是亮还是暗。所以在协议栈增加光敏传感器检测程序也比较简单,我们只需要配置好 IO 口,然后周期性检测、输出显示,上传给协调器即可。

光敏传感器四个引脚使用方法如下:

VCC:接电源正极(3V3)

GND:接电源负极

DO:TTL 开关信号输出

AO:模拟信号输出(悬空没有使用)

3.CC2530 PWM调光

//定义控制灯的端口 
#define LED0 P1_0 //定义 LED1 为 P10 口控制 
//函数声明 
void Delay(unsigned int t); //函数声明 
void InitIO(void);  //初始化 LED 控制 IO 口函数 
void main (void) //主函数 

{ 
unsigned int CYCLE=600,PWM_LOW=0; //定义周期并赋值
InitIO(); 
  while (1) //主循环 
{ 
LED0=1; 
Delay(60000); //特意加延时,可以看到熄灭的过程 
for(PWM_LOW=1;PWM_LOW0;PWM_LOW--) 
{ 
//与逐渐变亮相反的过程 
LED0=0; 
Delay(PWM_LOW); 
LED0=1; 
Delay(CYCLE-PWM_LOW); 
} 
//主循环中添加其他需要一直工作的程序 
} 
} 

 4.控制步进电机正反转

#define A1 P0_4 //定义步进电机连接端口 
#define B1 P0_5 
#define C1 P0_6 
#define D1 P0_7 
uchar phasecw[4] ={0x80,0x40,0x20,0x10};//正转、电机导通相序 D-C-B-A 
uchar phaseccw[4]={0x10,0x20,0x40,0x80};//反转、电机导通相序 A-B-C-D 
void MotorData(uchar data) 
{ 
A1 = 1&(data>>4); 
B1 = 1&(data>>5); 
C1 = 1&(data>>6); 
D1 = 1&(data>>7); 
} 
//顺时针转动 
void MotorCW(uchar Speed) 
{ 
uchar i; 
for(i=0;i<4;i++) 
{ 
MotorData(phasecw[i]); 
Delay_MS(Speed);//转速调节 
} 
} 
//逆时针转动 
void MotorCCW(uchar Speed) 
{ 
uchar i; 
for(i=0;i<4;i++) 
{ 
MotorData(phaseccw[i]); 
Delay_MS(Speed);//转速调节 
} 
}
//停止转动 
void MotorStop(void) 
{ 
MotorData(0x00); 
} 
void InitIO(void) 
{ 
P0SEL &= 0x0F; //P04 05 06 07 定义为普通 IO
  P0DIR |= 0xF0; //P04 05 06 07 定义为输出 
} 

六、参考文献

(一)教材及专著

[1]《网络化监控技术》,王黎明等编著,清华大学大学出版,ISBN:9787302458043,2017年2月第一版;

(二)参考论文

[1] 顾瑞红, 张宏科. 基于ZigBee的无线网络技术及其应用[J]. 电子技术应用, 2005, 31(6):1-3.

[2] 贾炀, 陆仲达.基于ZigBee的无线通讯装置设计[J].齐齐哈尔大学学报:自然科学版,2017, 33(2):29-3

[3] 刘宏伟, 蔡春晓. 基于STM32和ZigBee的智能校园路灯控制系统[J]. 科技与创新. 2021,(23).

[4]基于STM32的智能大棚控制系统[J]. 蔡宇晶,陈泽宇,李丽敏,樊丹丹,任陇刚,胡冰涛.  微处理机. 2021(06)

你可能感兴趣的:(stm32学习及智能车大赛,单片机,嵌入式硬件,经验分享,智能家居,zigbee)