基于Zigbee的智能温室大棚系统(附详细使用教程+完整代码+原理图+完整课设报告)


🎊项目专栏:【Zigbee课程设计系列文章】(附详细使用教程+完整代码+原理图+完整课设报告)

前言

  • 👑由于无线传感器网络(也即是Zigbee)作为🌐物联网工程的一门必修专业课,具有很强的实用性,因此很多院校都开设了zigbee的实训课程;
  • 👑同时最近很多使用了我的单片机课设的同学又来私信咨询我基于Zigbee的的课程设计的相关问题;
  • 👑所以为了帮助各位有需要的同学顺利完成自己的课程设计,有个顺利的假期,同时为了方便各位想要学习ZigBee的同学查找学习,建立了本专栏。
  • 💞但是由于笔者正在读研,每天的任务比较重,只能在从实验室回来后,晚上抽一个小时的时间来写,所以,更新不易,靠爱发电。

在这里插入图片描述

正在更新中~ ✨

🚨 我的项目环境:

  • 平台:Windows 11
  • 编译器:IAR for 8051 8.10
  • Zigbee协议栈:Zstack-CC2530-2.5.1a
  • 芯片型号:CC2530

在这里插入图片描述

🎊课设项目专栏:【Zigbee课程设计系列文章】(附详细使用教程+完整代码+原理图+完整课设报告)


提示:以下是本篇文章正文内容,下面案例可供参考,代码链接以及电路图已经放在文末,点击获取


智能温室大棚系统

设计要求
  基于Zigbee协议栈和Zigbee节点构建智能温室大棚系统。该系统利用多个Zigbee传感器监测节点采集温室环境各项数据,汇聚于协调器,由协调器节点控制各种遮光帘、显示及报警设备。协调器可以以串口通信上传数据于PC端。

设计方法
  智能温室大棚环境部署多个Zigbee监测节点,采集环境数据,有协调器串口传输至PC端,PC端可以串口打印显示,并能实时反向控制各个监测节点。


零、技术介绍

  Zigbee是一种新兴的低成本,低复杂度,低功耗,低数据速率,低成本无线网络技术,是无线标记技术和蓝牙技术之间的技术方案。主要用于短距离无线连接。 它是基于802.15.4标准,在数千个微小的传感器之间协调实现通信。 这些传感器需要非常低的功耗,并且通过无线电波将数据从一个传感器传输到另一个传感器,因此效率非常高,优势极大。

一、需求分析

  首先是终端节点,功能有:采集信息发送给协调器、接收协调器的控制信息对控制模块进行操作
  其次是协调器节点,功能有:串口发送收到的信息、反向发送控制信息

系统总体架构图

二、模块分析

终端节点
  传感器部分:需要有空气温度、空气湿度、土壤湿度、光照强度传感器模块
  控制模块:遮光帘、水泵、透气扇(均为通过继电器控制)

协调器节点
  串口发送信息给上位机

三、终端节点硬件设计

空气温湿度模块
  大棚内温度直接影响植物的生长发育和产量。温度的监测可以帮助调节大棚的通风和加热设备,保持较为稳定的温度条件。湿度对植物的水分供给和蒸腾作用具有直接影响。湿度的监测可以通过湿度传感器进行实时检测,可以帮助调节大棚的灌溉和通风设备,维持适宜的湿度条件。因此设计温湿度模块对于大棚来说是非常必要的。
  DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±5%RH, 温度±2℃,量程湿度5~95%RH, 温度-20~+60℃。具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。同时由于CC2530的引脚紧张,而DHT11仅占用一个引脚。因此大棚空气温湿度选用DHT11模块来检测。
  模块实物如下图:(不同的DHT11均可,这里仅选手头的一款)

   其中DATA接P0.6口,具体的电路设计如下图:

   

土壤湿度模块
  土壤湿度对大棚中农作物有着较大的影响。土壤湿度过低,形成土壤干旱,光合作用不能正常进行,降低作物的产量和品质;严重缺水导致作 物凋萎和死亡。土壤湿度过高,恶化土壤通气性,影响土壤微生物的活动,使作物根系的呼吸、生长等生命活动受 到阻碍。根系缺氧、窒息、最后死亡。因此,实时监测土壤的湿度,并且对其做出控制很有必要。
  土壤湿度传感器并无固定型号,但是由于CC2530通用IO口较为紧张,因此笔者选用了一款有模拟信号输出传感器模块,仅仅占用一个引脚。如图:

  CC2530的AD转换在P0口,所以该模块的模拟电压接入P0.0口
  具体的电路设计如下图:


光照强度模块
  “万物生长靠太阳”,进行大棚种植,光照的作用更是不可忽视。实时监测光照的强度,当光照强度过强关闭遮光帘,反之则打开遮光帘。
  BH1750是IIC通信16位数字光强传感器,它的识别范围从1lx - 65535lx,范围大,分辨率高,价格低。因此采用BH1750模块监测光强,如下图所示。

  将SCL与SDA分别接入P0.4、P0.5口,ADDR接地。
  具体的电路设计如下图:


控制模块
  正在更新中

整体电路图
在这里插入图片描述

四、软件代码

终端节点采集传感器信息并发送主要代码(为了使得文章精简,省去iic.c、DHT11.c、BH1750.c等等自定义函数展示,但是在文件中都有)

    // 获取mac地址 赋值给待发送信息
    osal_memcpy(MACAddr , NLME_GetExtAddr() , 8);
    for(i = 0;i<8;i++)
    {
      buf[i]=MACAddr[i];
    }
    //温度检测   
    DHT11();
    buf[8]=wendu_shi+48;
    buf[9]=wendu_ge%10+48;
    buf[10]=shidu_shi+48;
    buf[11]=shidu_ge%10+48;
  
    // 土壤湿度ADC转换
    HalAdcSetReference( HAL_ADC_REF_AVDD );
    adc1=HalAdcRead(HAL_ADC_CHANNEL_0, HAL_ADC_RESOLUTION_12);
    v=((2047-adc1)/2047.0)*10000;
    buf[12]=v/1000+48;
    buf[13]=v%1000/100+48;
    buf[14]=v%1000%100/10+48;
    buf[15]=v%1000%100%10+48;
  
    
    // 光照强度转换
    guangqiang = Read_BH1750_Data();
    buf[16] = guangqiang/100+48;
    buf[17] = guangqiang%100/10+48;
    buf[18] = guangqiang%100%10+48;

  
  if ( AF_DataRequest( &Point_To_Point_DstAddr,
                       &SampleApp_epDesc,
                       SAMPLEAPP_POINT_TO_POINT_CLUSTERID,
                       19,
                       buf,
                       &SampleApp_TransID,
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
  {
  }
  else
  {
    // Error occurred in request to send.
  }

协调器节点接收到终端节点信息串口发送给上位机


else if(SampleApp_NwkState == DEV_ZB_COORD)//如果本节点是协调器节点
{
    uint8 i; uint16 temp;//计数 临时临时存储短地址
    //网蜂 16 进制转 ASCII 码表
    uint8 asc_16[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    temp=pkt->srcAddr.addr.shortAddr; //读出数据包的 16 位短地址
    HalUARTWrite(0,"NET Addr:0x",11); //提示接收到数据
    
    /****将短地址分解, ASC 码打印*****/
    HalUARTWrite(0,&asc_16[temp/4096],1);
    HalUARTWrite(0,&asc_16[temp%4096/256],1);
    HalUARTWrite(0,&asc_16[temp%256/16],1);
    HalUARTWrite(0,&asc_16[temp%16],1);
    HalUARTWrite(0,"\n",1); // 回车换行
    
    /***********打印MAC地址***************/
    HalUARTWrite(0,"MAC Addr:0x",11);
    for(i=0;i<8;i++){
        HalUARTWrite(0,&asc_16[(pkt->cmd.Data[i]/16)],1);
        HalUARTWrite(0,&asc_16[(pkt->cmd.Data[i]%16)],1);
    }
    HalUARTWrite(0,"\n",1);
    
    /***********温度打印***************/
    HalUARTWrite(0,"Temp is:",8);        //提示接收到数据
    HalUARTWrite(0,&pkt->cmd.Data[8],2); //温度
    HalUARTWrite(0,"\n",1);              // 回车换行
    
    /***************湿度打印****************/
    HalUARTWrite(0,"Humidity is:",12);    //提示接收到数据
    HalUARTWrite(0,&pkt->cmd.Data[10],2);  //湿度
    HalUARTWrite(0,"\n",1);
    
    /***************土壤湿度打印****************/
    HalUARTWrite(0,"turang shidu is:",16);    //提示接收到数据
    HalUARTWrite(0,&pkt->cmd.Data[12],2);  //turang shidu is:01.85%
    HalUARTWrite(0,".",1);  
    HalUARTWrite(0,&pkt->cmd.Data[14],2);  
    HalUARTWrite(0,"%",1); 
    HalUARTWrite(0,"\n",1);
    
    /**************串口打印光照强度**********/
    HalUARTWrite(0,"light Value is:",15);
    HalUARTWrite(0,&pkt->cmd.Data[16],3);  //light value is ***lux
    HalUARTWrite(0," lux\n\n",5);            // 输出单位回车换行
}

break;

协调器节点接收到串口信息无线转发给终端节点

void SampleApp_SendSerialCMDToPointMessage(mtOSALSerialData_t *cmdMsg)
{
    uint8 i;//i 计数
    uint8 msg[3];
    uint8 *str = NULL;
    str = cmdMsg->msg;
    
    Point_To_Point_DstAddr.addrMode = (afAddrMode_t)Addr64Bit;//点播
    Point_To_Point_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
    for(i=1;i<=8;i++)
    {
        Point_To_Point_DstAddr.addr.extAddr[i-1] = str[i];//目标硬件地址
    }
    
    for(i=0;i<=2;i++)
      msg[i]=cmdMsg->msg[8+i];
    
   if ( AF_DataRequest( &Point_To_Point_DstAddr,
                       &SampleApp_epDesc,
                       SAMPLEAPP_POINT_TO_POINT_CLUSTERID,
                       3,
                       msg,
                       &SampleApp_TransID,
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
  {
  }
  else
  {
    // Error occurred in request to send.
  }
}

终端节点收到协调器控制信息执行控制动作

if((pkt->srcAddr.addr.shortAddr==0x0000) // 如果信息来自协调器且本节点是终端节点或路由器节点
    &&(SampleApp_NwkState == DEV_ROUTER)
    ||(SampleApp_NwkState == DEV_END_DEVICE))
 {
   HalLedBlink( HAL_LED_4, 4, 50, (1000 / 4) );
 }

五、使用教程、实现效果

  笔者这里有三个开发板,所以设置两个终端节点,一个协调器节点。如下图所示:

  首先将代码用IAR打开后,选择协调器,下载到CC2530开发板上;再选择终端节点,下载到另一个zigbee开发板上。
  将终端节点的ZIGBEE开发板连接上传感器,通电。如图:

  将协调器的串口连接到电脑,使用串口助手打开协调器所在串口,这个时候就能看到终端节点的信息在不断的显示更新了。

  反向控制 反向控制需要目标节点的MAC地址,以及三个控制参数,用十六进制发送。 图中的01 01 01表示三个继电器开,如果需要某个继电器关闭,那么就将对应的01改为00即可,如下图:

下面打开一号继电器,关闭2号,3号继电器,如下图:

结果如图,继电器一号被打开:

六、获取源代码以及电路原理图

  下载链接1🔐:点击跳转下载➡️基于Zigbee的智能温室大棚系统(附详细使用教程+完整代码+原理图+完整课设报告)


能力有限,若有错误,欢迎指出。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Stanford_sun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值