【ZigBee系列】3.智能停车系统项目

ZigBee原创系列-第 3 篇


作者注: ZigBee 系列共三篇,首先讲解 ZigBee 工程的结构,然后通过两个具体项目熟悉 ZigBee 的应用。在学习本系列内容前,您需要掌握单片机相关知识、 ZigBee 基础知识,希望本系列教程能对您开发 ZigBee 项目有所启发。如有任何问题,欢迎您随时与我联系:Hauyu.Chen@Gmail.com

版权声明:本文由 Hov 所有,发布于 http://chenhy.com ,转载请注明出处。



0 写在前面

智能停车系统是本人在大二下学期做的一个项目。项目主要涉及传感器数据采集、 ZigBee 组网、 GPRS 数据传输、数据库服务器程序开发、微信公众账号开发。

项目视频演示如下:

本文将着重讲述 ZigBee 部分,即如何通过 ZigBee 网络采集数据,并通过 GPRS 模块将数据发送给远程数据库服务器。后续有时间将对整个项目进行完整的讲解。

本文侧重讲的是实现思路,具体的技术细节可参考源代码。希望阅读完这篇文章,能让您对ZigBee的实际应用有所启发。

项目完整源码:https://github.com/HauyuChen/Parking-System

如果对您有帮助,欢迎您在GitHub上给我 Follow 或 Stars :)


1 项目简介

智能停车系统通过 ZigBee 无线传感器网络实现停车场内部车位、亮度等数据的采集与传输;借助 GPRS 模块实现数据远程传输;利用数据库服务器实现数据的处理与存储;通过 PC 客户端和微信公众帐号实现数据交互,为停车场管理人员提供监控服务,为用户提供自助服务。系统实现停车引导、防盗提醒和灯光控制等功能,用户还可以关注本停车系统的微信公众账号实时地了解停车场内的信息。

项目实物模型如下:


2 ZigBee无线传感系统

ZigBee 部分主要完成的是传感器数据的采集和数据的传输,大体的思路是这样的:通过 ZigBee 终端节点上外接的传感器实现数据监测,并通过 ZigBee 网络将数据发送至 ZigBee 协调器, ZigBee 协调器通过 RS232 串口线连接 GPRS 模块,通过 AT 指令将数据发送至远程数据库服务器。

2.1 ZigBee协调器

ZigBee 协调器主要实现以下功能:

  • 组建 ZigBee 网络,供 ZigBee 终端等节点连接;
  • 接收并处理 ZigBee 终端发送的数据,通过 RS232 串口将数据发送至 GPRS 模块;
  • 根据空闲车位的数量,更新车位指示屏。

2.2 ZigBee终端

ZigBee 终端节点主要实现以下功能:

  • 采集车位数据(红外传感器);
  • 采集亮度数据(光照数字传感器);
  • 控制车位状态灯( LED 灯);
  • 将采集到的数据通过 ZigBee 网络发送给 ZigBee 协调器;
  • 接收并处理 ZigBee 协调器发送的数据,如开关灯操作。

2.3 GPRS模块

要把 ZigBee 网络采集到的数据发送给远程数据库服务器,可选用 GPRS 模块。通过 SIM 卡,利用 GPRS 网络实现数据外网传输。 GPRS 模块主要完成以下功能:

  • 建立 TCP 连接,连接到服务器。
  • 发送数据至服务器,接收服务器返回的数据;
  • 发送防盗提醒短信给用户手机。


3 实现细节

3.1 ZigBee终端实现

3.1.1 数据采集

ZigBee 终端通过外接传感器采集数据,在本项目中用到的传感器主要是红外传感器、光照数字传感器。

(1)红外传感器

红外传感器采用黑白对管红外避障模块,有三个引脚: VCC 、 GND 、 OUT ,探测距离可调。当前方有障碍物时, OUT 口输出 1 ,否则输出 0 。红外传感器虽然使用较为方便,但是稳定性不足,也可考虑用超声波探测模块来替换。

如何探测车位状态。其实很简单,将传感器的 OUT 口连接到ZigBee终端模块的一个 IO 口,通过判断这个 IO 口的值来模拟车位是否被占用。也就是,当车位被占用, OUT 口输出 1 ;车位空闲, OUT 口输出 0 。

具体实现代码参考附录的源代码(ParkingStatus.c)

(2)光照数字传感器

光照数字传感器用来采集停车场内的亮度数据,该传感器可以采集到周围环境的亮度值。该传感器采用 IIC 总线方式,有四个引脚: VCC 、 GND 、 SCL 、 SDA ,将其与 ZigBee 终端连接即可,采集到的数据将通过 ZigBee 网络发送至 ZigBee 协调器。

具体实现代码参考附录的源代码(LightControl.c)

3.1.2 发送数据

ZigBee 协议栈中发送数据的函数是 AF_DataRequest 。在此函数中我们主要考虑 4 个参数:目的地址、簇 ID 、数据大小、数据内容。

下面是 ZigBee 终端发送车位数据给 ZigBee 协调器的代码:

void SampleApp_SendPointToPointMessage_Car( void )
{
  uint8 PD[4];
  /* 车位区域 */
  PD[0]=0+65;   //A区车位
  /* 该区域车位状态(只模拟其中三个车位) */
  PD[1]=S001+48;    //S001存放对应车位的状态信息
  PD[2]=S002+48;    //S002存放对应车位的状态信息
  PD[3]=S003+48;    //S003存放对应车位的状态信息
  
  if ( AF_DataRequest( &Point_To_Point_DstAddr,
                       &SampleApp_epDesc,
                       SAMPLEAPP_SEND_DATA_CAR_CLUSTERID,
                       4,
                       PD,  //车位数据
                       &SampleApp_TransID,
                       AF_DISCV_ROUTE,
                       AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )
  {
  }
  else
  {
    // Error occurred in request to send.
  }
}

也就是说,要把车位数据发送给 ZigBee 协调器,调用这样的一个函数就行了。当然这个函数可参考例程自己写,只需修改部分代码即可。

3.1.3 灯光控制

ZigBee 终端还负责更新车位状态灯和停车场内照明灯的功能。车位状态灯和停车场照明灯的实现方式大体一致,所以下面就拿车位状态灯来讲好了。

车位状态灯用 LED 灯来模拟,将 LED 灯连接到 ZigBee 终端的相应IO口,然后控制这些 IO 口的状态就可以模拟车位状态了。比如前面提到车位状态通过红外传感器采集,有车输出 1 ,没车输出 0 。所以我们只需判断该车位的红外传感器采集到的是 0 还是 1 ,根据这个数值来控制特定的 IO 口,从而控制亮红灯还是绿灯。

举个栗子,模拟 A001 车位状态。

  1. 在 A001 车位上方安放红外传感器、红色 LED 灯、绿色 LED 灯。
  2. 将红外传感器连接 P0_2 引脚、红色 LED 灯连接 P1_2 引脚、绿色 LED 灯连接 P1_4 引脚。
  3. 当 A001 车位有车时,红外传感器采集到数据, OUT 口输出 1 ,此时 P0_2 口的值为 1 。
  4. 我们只需判断 P0_2 口的值就可以知道车位的状态了。比如为 1 时车位被占用,亮红色 LED 灯( P1_2 置 1 , P1_4 置 0 );为 0 时车位空闲,亮绿色 LED 灯( P1_2 置 0 , P1_4 置 1 )。

3.2 ZigBee协调器实现

3.2.1 接收数据

ZigBee 协调器是 ZigBee 网络的数据中心, ZigBee 网络内所有的 ZigBee 终端节点采集到的数据都会发送给协调器。 ZigBee 协调器负责接收车位状态信息和停车场内亮度等数据。

接收数据的流程如下:

3.2.2 车位指示屏

车位指示屏的作用是显示剩余的空闲车位数量。在本停车系统中,每个路口设置一个车位指示屏,用来指示当前区域剩余的空闲车位数量。本模型中用数码管来模拟。

ZigBee 协调器将车位数据发送给远程数据库服务器,服务器会计算出剩余的空闲车位数量, ZigBee 协调器根据返回的数值来更新数码管。

3.3 GPRS模块

GPRS 这个名词想必大家都听说过。在 3G 、 4G 之前, GPRS 还是我们比较常用的手机上网手段。现在我们想知道的是怎么通过 GPRS 模块将数据发送出去,就像我们手机插上 SIM 卡为什么就能上网了? GPRS 模块当然也需要一张 SIM 卡,一张支持 GSM 网络的手机 SIM 卡。

GPRS 模块怎么用?其实, GPRS 模块是用 AT 指令来操作的,比如我们要建立 TCP 连接,我们要发送短信,这些都是通过 AT 指令来操作的。

在本系统中采用华为 GTM900-C 无线模块,这是一款两频段 GSM/GPRS 无线模块。它支持标准的 AT 命令及增强 AT 命令,提供丰富的语音和数据业务等功能,是高速数据传输等各种应用的理想解决方案。

3.3.1 建立TCP连接

3.3.2 发送短信

发送短信的AT指令分三步:

第一步:AT+CMGF=0 //模式选择

第二步:AT+CMGS=49 //设置短信长度,49是我们设置的长度

第三步:“0011000D9168”+目标手机号码+短信内容 //发送内容

举个栗子:

(1)首先,我们要知道目标手机号码,还要经过小小的转换。 比如,向手机号码 15767977442 发送短信,那么手机号部分就应该是 5167977744F2 。 找到规律了吗?在最后一个数字后加上 F ,然后奇数位和偶数位对换。 01234567890 就应该变成 1032547698F0 对不对。

(2)短信的内容是什么?发送中文短信应该将中文转换成 unicode 。 比如,我们要发送“您的车已离开车位,如有异常请致电X”,那么 AT 指令中的短信内容就应该是这样的:0008A72260A876848F665DF279BB5F008F664F4DFF0C598267095F025E388BF781F475350058 。嗯,这一串数字就是上面那句中文的 unicode ,可以用汉字转 UNICODE 工具转换。

综上,我们要想手机号码 15767977442 发送短信“您的车已离开车位,如有异常请致电X”。 AT 指令应该是这样的:

  • AT+CMGF=0

  • AT+CMGS=49

  • 0011000D91685167977744F20008A72260A876848F665DF279BB5F008F664F4DFF0C598267095F025E388BF781F475350058

注意:每句 AT 指令应该以 ctrl+z 结束,也就是 \r\n 。


4 结语

本文主要讲解了智能停车系统中的 ZigBee 实现部分。通过本文,你已经了解到 ZigBee 是如何融入智能停车系统项目中的。 ZigBee 无线传感系统负责传感器数据采集与传输,并用 GPRS 模块实现数据透传,将 ZigBee 网络内部数据无线发送至远程数据库服务器。这样,我们就可以在服务器对 ZigBee 无线传感系统的数据进行处理,进一步实现我们想要的功能。


 
comments powered by Disqus