基于LoRa 的大型公共建筑能耗监控∗
2020-12-23陈真通王文庆郝敬全
陈真通 王文庆 郝敬全
(1.西安邮电大学自动化学院 西安 710121)(2.泰华智慧产业集团股份有限公司 济南 250101)
1 引言
节能减排是我国长期坚持的一项基本国策。随着城市建设的快速发展,为加强对公共建筑的节能运行管理,建设部和财政部共同提出建设公共建筑能耗监测系统的要求。建设能耗监测系统,对及时准确地掌握重点用能单位能耗情况、追踪节能政策实施效果、增强宏观调控的针对性和主动性具有重要意义[1]。文献[2]基于物联网技术的楼宇能耗监控系统设计与实现,在研究现有能耗监控系统的基础上,结合电能检测技术、Zigbee 无线通信技术和嵌入式技术设计并实现了一套楼宇能耗监控系统。文献[3]对公共建筑能耗监测系统进行了研究与应用,详细研究能耗监测系统下的能耗数据,并能为用能单位提供系统的能耗数据及详尽的能耗数据分析,为节能减排提供基本的依据。文献[4]改造设计基于节能化管理的办公建筑节能监测系统,在实际应用中实现了对办公建筑能源的节约,并且提升了系统监测性能和经济效益。
目前,LoRa 无线传感器网络技术的飞速发展和广泛应用,LoRa 技术采用了扩频技术,提高了无线传输的准确性和可靠性,提高了抗干扰能力和通信效率[5]。同其它的无线通信技术相比,实现了普通无线通信技术无法实现的在低功耗的情况下的远距离传输,通信距离远使中继器的数量大大减少,同时使硬件成本降低,另外工作在免费的频谱下,利于使用和开发[6~7]。因此,提出了设计一种基于LoRa 的大型公共建筑能耗监控系统,以适应新技术的发展,满足公共建筑能耗监控的需求[8~9]。
2 大型公共建筑能耗监控系统描述
本次设计选用应用较为广泛的智能电表作为能耗计量装置进行测试,其与LoRa无线传输模块、主控STM32F407 以及主控外围电路组成能耗数据采集节点。能耗监控节点由LoRa 无线传输模块、LCD 屏、iTOP-4412 核心板以及核心板对应的底板电路组成。由能耗数据采集节点和能耗监控节点组成的大型公共建筑能耗监控系统的总体架构[10~11],如图1所示。
图1 能耗监控系统总体框架图
首先手动设置智能电表的地址,能耗数据采集节点主控STM32F407 通过RS485 模块发送相应的地址和命令,获得相应电表的电压、电流、功率的值,并给这组数据加上相应电表的标号和简单加密处理。将处理后的数据通过LoRa无线传输模块向能耗监控节点实现发送。能耗监控节点采用iTOP-4412 核心板,通过LoRa 无线传输模块接收数据并解析,然后将数据显示到LCD 屏上,接着调用移植的数据库SQLite 的函数接口将能耗数据进行本地保存,最后利用套接字socket 进行网络传输,将能耗数据上传至服务器[12]。
3 能耗监控系统的硬件设计
3.1 能耗数据采集节点电路设计
以STM32F407 为主控芯片,该芯片具有低功耗、高性价比、外设接口丰富等优点,并且该芯片拥有丰富的固件库,极大地缩短了开发周期。STM32最小工作电路以及能耗数据采集节点设计所用到I/O口所组成的电路示意图,如图2所示。
图2 STM32电路图
RS485 通信网络中采用主从通信方式,智能电表为从机。RS485 接口采用差分信号进行传输,不需要通过参照点来检测传输的信号,只要在传输的过程中保证两线之间的电位差就可以了,提高了信号传输的抗干扰能力。RS485 通信采用的芯片为SP3485,STM32 的串口USART 通过芯片SP3485 与智能电表通信,获得智能电表电压、电流和功率。RS485数据采集电路如图3所示。
图3 RS485接口电路
3.2 能耗监控节点电路设计
能耗监控节点的硬件由核心板和底板组成,采用iTOP-4412 核心板。主要进行底板的电路设计,要结合核心板进行底板电路设计。为了叙述方便,统一命名,把iTOP-4412 核心板称为目标机,把开发和编译程序的计算机称为主机,以下就不再赘述。能耗监控节点整体设计结构图如图4所示。
图4 能耗监控节点整体设计结构图
3.2.1 LCD接口电路
为了将接收到的能耗数据进行解析并进行实时显示,需要设计LCD 接口电路。设计基于ANSI/TIA/EIA-644 LVDS 接口标准的电路接口连接LCD屏幕低压差分信号的传输、抗干扰能力比较强、传输距离远是LVDS 技术重要特点。采用LVDS 接口的配合软排线实现核心板与7 寸LCD 显示屏之间的数据通信。
3.2.2 网络接口电路
网卡芯片的型号选用的是DM9621A,其中已经包含了数据链路层和物理层。但是DM9621A 网卡芯片是USB 接口的芯片,引脚比较少,使用比较方便,不是直接连接到处理器上,而是通过芯片USB3503A连接到处理器上。为了使网络传输信号增强,传输距离更远,与外部隔离,避免外部的干扰,增强鲁棒性。采用网卡和网络隔离变压器HR911105A 设计网路接口电路。此时在Linux 系统上可以通过socket 协议实现端到端的数据通讯,完成各种网络应用。
3.2.3 LoRa无线传输模块电路设计
LoRa无线传输模块需要与核心板iTOP4412的USB 接口通信,而无线传输模块的接口是串口,接口不同无法直接通信,需要借助通信接口转换电路,作为其通信的桥梁。采用转换芯片CH340G,可以将USB 接口转换为串口。串口通信电路原理如图5所示。
图5 串口通信电路
4 能耗监控系统软件设计
4.1 能耗数据采集节点软件设计
为了实现能耗数据采集节点的能耗数据的采集和发送功能,编写相应的应用程序进行实现。在集成开发环境Keil uVision5 新建基于固件库的工程,将所用到的文件添加到工程中,最后直接在相应的文件下进行程序编写就可以了。
4.1.1 软件工作流程
单片机上电程序开始运行,首先完成延时函数、IO、串口的初始化和中断优先级分组。然后延时时间到,通过串口向智能电表发送命令,智能电表返回能耗数据,包括电压、电流、功率,最后将获得的能耗数据保存到自定义的结构体中,加入编号并进行简单的加密,通过LoRa 无线传输模块将能耗数据发送到能耗监控节点[13]。软件的功能流程图如图6所示。
4.1.2 主程序的编写
首先初始化RS485模块,本质上是初始化该模块连接的串口,主控上没有实际存在的串口,需要将IO 口复用为串口。将IO 口复用为串口,配置之前要使能IO 口时钟和复用为的串口的时钟。串口发送相应的命令,需要接收能耗数据,所以要开启串口的接收中断。使用函数RS485_Send_Data 发送具体的采集命令,在中断处理函数USART2_IRQHandler 中实现接收具体的能耗数据。对接收到的智能电表的电压、电流、功率的具体数值,添加电表的编号,并进行简单的加密处理,然后通过LoRa无线传输模块将数据发送到能耗监控节点。采集命令是定时发送的,使用到了延时函数,要初始化延时函数,最后实现相应的功能。部分主程序发送电压、电流、功率的值如下所示:
void Lora_tx_bytes(uint8_t*TxBuffer,uint8_t Length)
{while(Length--)
{while (RESET==USART_GetFlagStatus (USART3,USART_FLAG_TXE));
USART3->DR=*TxBuffer;
TxBuffer++;}}
图6 程序设计流程图
4.2 能耗监控节点软件设计
4.2.1 嵌入式Linux操作系统的移植
在开发过程中,由于目标机的硬件资源有限,且外围的硬件不同,无法直接移植Linux操作系统,需要对源码根据目标机的处理器类型和外围硬件进行裁剪,然后编译成镜像文件,然后再烧录到目标机中进行运行,此时目标机的运行环境搭建完成[14]。在主机上进行相应的软件开发,交叉编译后生成的可执行文件,然后下载到目标机中,直接在主机上的串口软件中输入命令就可以运行软件。
4.2.2 基于Linux操作系统的应用软件开发
为了提高编程的效率,对能耗监控节点的各模块,采用模块化编程,提高编程的效率和准确性,然后将编程好的各模块进行联调。需要对四大模块进行编程,包括LoRa 无线接收模块、LCD 显示模块、数据本地存储模块、数据上传服务器模块。首先开辟两个进程,LoRa 无线接收模块在一个进程中运行,剩余的三个模块在另外一个进程中运行。同一主机进程间通信选择通信效率较高的共享内存,并使用有名信号量实现同步,即实现LoRa无线传输模块先接收能耗数据,再进行显示、存储和上传。
1)LoRa无线接收模块的编程
在Linix 操作系统上初始化串口和读写串口,都是使用文件描述符进行相应的操作。通过调用Linux 操作系统提供的open()函数打开设备文件,获取文件描述符,文件描述符是用非负的整数来表示。使用自定义函数int set_opt(int fd,int nSpeed,int nBits,char nEvent,int nStop)来初始化串口,在该函数中调用相应的函数实现串口初始化,设置串口的波特率、数据位、校验位、停止位。部分程序如下所示:
fd = open(“/dev/ttyUSB0”,O_RDWR | O_NOCTTY);//获得文件描述符
set_opt(fd,115200,8,‘N’,1);//设置串口的波特率、数据位、奇偶校验位、停止位
read(fd,buf,sizeof(buf));//读取串口接收的消息
2)LCD显示模块的编程
对接收到的能耗数据进行显示,需要打开LCD屏对应的设备文件,获得文件描述符,然后获得显示屏的可变参数,计算显示屏的大小,根据相应设备文件的文件描述符,然后将显示屏的文件描述符映射到用户空间,在用户空间得到操作显示屏的指针,此时就可以操作显示屏了,部分程序如下所示:
fbfd=open(“/dev/fb0”,O_RDWR);//获得文件描述符
ioctl(fbfd,FBIOGET_VSCREENINFO,&vinfo);//获得显示屏的可变参数
screensize=vinfo.xres_virtual*vinfo.yres_virtual*vinfo.bits_per_pixel/8;//计算显示屏的虚
//拟大小
fbp=(char*) mmap (0, screensize,PROT_READ|PROT_WRITE,MAP_SHARED,fbfd,0);
//完成映射
3)数据存储模块编程
将数据库SQLite移植到目标机中,数据库移植完后,将接收到的能耗数据解析显示之后,就可以直接调用数据库的函数接口,对能耗数据进行本地存储。在使用数据库之前,要调用函数打开数据库和创建表,在基础上才可进行能耗数据的插入、删除、修改、查找,调用数据库源码,部分函数如下所示:
opensql(char*devpath);//打开数据库
createtable(char*table_name);//创建表
sqlinsert(char*table_name,RecordData*rd);//插入
4)数据上传模块的编程
将目标机接收到的能耗数据,上传到主机上搭建的服务器,这属于不同主机间进程间通信,通信方式选用套接字socket[15~16]。选用TCP 协议实现客户端与服务器的通信。编写的TCP 服务器程序实现消息的循环接收,部分TCP 服务器程序如下所示:
int TcpServerInit()
{servFd=socket(PF_INET,SOCK_STREAM,0);//创建套接字
bind(servFd,(struct sockaddr*)&servAddr,sizeof(servAddr));//绑定IP地址和端口号
listen(servFd,10);//创建监听队列
}
编写的TCP客户端程序实现消息的循环发送,部分TCP客户端程序如下所示:
cliFd=socket(PF_INET,SOCK_STREAM,0);//创建套接字connect(cliFd,(struct sockaddr*)&servAddr,sizeof(servAddr));//请求连接
5 测试结果
目前为止,基本完成了能耗监控系统的开发,包括硬件设计和软件设计,接下来就是进行整体测试。测试能耗数据的显示、存储、上传。将能耗数据采集节点放在实验楼进行采集智能电表的数据,然后将能耗数据进行发送;能耗数据监控节点选择相应的距离,然后接收能耗数据,并实现能耗数据的显示、存储、上传。
1)能耗数据显示测试
能耗监控节点通过LoRa无线传输模块接收能耗数据,首先对接收到的能耗数据进行解析,然后在LCD屏上进行显示,显示结果如图7所示。
图7 LCD显示结果
2)能耗数据本地存储测试
在目标机上移植了SQLite数据库,可以调用保存能耗数据的函数接口,对能耗数据进行存储。在目标机上无法打开存储的能耗数据的数据库文件,需要将生成保存能耗数据的文件传输到主机上,然后利用相应的软件SQLite 打开该文件查看保存的能耗数据。结果如图8所示。
图8 能耗数据存储
3)能耗数据上传服务器测试
在主机的Linux 操作系统环境下进行测试,首先在Linux 操作系统上ping 通目标机,然后编译并运行所编写的TCP服务器应用程序,此时就可以等待接收能耗数据。将接收到的能耗数据进行解析,然后将智能电表的编号、电压、电流、功率进行显示。TCP 服务器接收到的能耗数据显示,如图9 所示。
图9 主机Linux开发环境的TCP服务器
6 结语
随着LoRa 无线通信技术的不断成熟,实现了长距离和低功耗,是其它无线通信技术无法满足的。设计了一种基于LoRa的大型公共建筑能耗监控系统,该系统包括能耗数据采集节点和能耗监控节点。能耗数据采集节点实现能耗数据的采集和发送,能耗数据包括电流、电压、功率,然后将能耗数据封装和加密,通过LoRa 无线传输模块将能耗数据发送到能耗监控节点。能耗监控节点通过Lo-Ra 无线传输模块将能耗数据接收并解析,然后将数据进行显示、存储、上传。本能耗监控系统成本低、通信距离远、抗干扰能力强、部署方便并且应用场景广阔。