江达飞 徐中贵
(衢州职业技术学院,浙江 衢州 324000)
随着各类大、中专院校的不断扩建,学校教室、实训室等对于电的需求也越来越大, 很多教室在没有老师和学生的情况下,空调、电灯、电脑等耗电量大的电器设备依然处于工作状态, 造成电能的巨大浪费,给学校经济带来极大的损失, 为此, 提高学校教室的电能利用率是建设节约型高校所必须考虑的问题。 腾讯云物联网平台是一个提供了安全、 稳定、 高效的连接平台,它支持MQTT 协议的接入,终端设备只要内嵌有MQTT 协议即可实现与平台的数据互通; 支持规则引擎转发, 通过设置简单的SQL 语句, 即可将终端上传数据转发至腾讯云平台下的其它服务器中, 配合微信公众号或小程序即可实现远程数据的读取与发送。ESP8266 是一块专门为物联网量身定做的WIFI 芯片,具有集成度高、 价格低廉、 功耗低等特点并且支持二次开发,使用腾讯云、ESP8266 开发平台以及微信客户端构建物联网节电控制系统, 可实现管理员对教室用电设备进行实时监测与控制。
系统硬件结构如图1 所示,其中ESP8266 是整个系统的网络数据通信设备同时也是主控制器, 本设计使用了安信可ESP-12S 模块, 它采用32 位的Tensilica L106 超低功耗微处理器作为其核心处理器, 支持80MHz 和160Hz 的主频,模块引出了所有的I/O 口,方便用户进行外部扩展; 模块带有睡眠功能, 在进入深度睡眠状态时,电流仅为10uA,在使用电池的场景下仍可正常使用。 教室温度的获取使用DHT11 传感器,它使用单总线通信模式, 与ESP8266 的通用I/O 直接相连, 通过对温度的测量, 即可判断教室空调是否开启;光照度传感器使用BH1750,与ESP8266 的IIC 总线相连, 通过对多个教室光照度的对比, 管理员可知悉教室灯是否已被正常关闭; 霍尔传感器与磁铁配合,可用于检测当前教室的门窗是否已经正常关闭, 使用单极性霍尔开关YH3144,使用ESP8266 的ADC 接口对霍尔传感器输出电压进行采集, 通过将电压与阈值的进行比较, 即可推断当前门窗的状态。 控制系统的输出总共包含3 种形式,分别是继电器控制、LED 状态输出及红外LED,继电器通过光耦与ESP8266 芯片连接,可用于教室内诸如灯、 终控系统等强电的开关控制;红外接收器用于学习空调、 电视等遥控器的红外信号,并将信号编码数据存在ESP8266 的FLASH 之中,当需要进行远程控制时,即可将FLASH 中的编码信号读取并通过红外LED 进行发送。
ESP8266 支持无操作系统的Non-OS SDK 和带有FreeRTOS 操作系统的RTOS SDK,本设计使用Non-OS SDK,SDK 以user_init () 函数作为程序的入口函数,在user_init()中首先实现FLASH 数据的读取,打印串口初始化等一系列操作,然后对传感器及输出设备所使用I/O 口进行相关配置,使用PIN_FUNC_SELECT()宏定义可将相应I/O 设置为输出或者输入模式,安信可ESP-12S 模块引出的所有I/O 口中,除了GPIO9 和GPIO10 作为内部FLASH引出脚不能直接使用外,其它都可以作为通用IO 口。
Non-OS SDK 不支持多线程操作,为实现多个传感器数据的读取, 本设计采用了Non-OS SDK 提供的软件定时器功能,使用os_timer_setfn()函数为每个传感器采集任务注册一个回调函数,并使用os_timer_arm()设置相应的定时时间,值得注意的是,软件定时器是单周期的,定时时间到达后,只执行一次回调函数, 为使得传感器数据能够周期性的读取, 在回调函数中必须在此使用os_timer_setfn () 和os_timer_arm()对任务进行重新设置。
系统软件流程图如2 所示,MQTT 程序移植了乐鑫官方提供的标准MQTT 库函数,在初始化阶段,程序完成了连接、 订阅主题和推送主题的相关设置, 使用腾讯云作为 MQTT 服务器时,MQTT 连接所使用的ClientID 由productID 和deviceName 两个字符串连接而成,productID 和deviceName 是在注册腾讯云产品时服务器为每个产品所生成的唯一识别码。 username 字段的格式为:productID;deviceName;sdkappid;connid; 过期时间。 腾讯云平台支持用户使用设备证书和密钥签名两种方式接入,考虑到ESP8266 内存的限制,本设计使用密钥签名方式接入,在这种方式下,MQTT 连接参数中的password 字段格式应该设置为:token;hmac 签名方法, 其中token 是使用HMAC-SHA1 算法对username 进行加密后所生成的字符串,hmac 签名方法字段填写第三步用到的摘要算法,这里填写HMAC-SHA1。 数据初始化完成之后, 使 用MQTT_OnConnected ()、MQTT_OnDisconnected ()、MQTT_OnPublished()、MQTT_OnData()等函数注册相应的回调函数,并主动连接路由器,在WIFI 模块成功获得IP 地址之后,使用MQTT_Connect()函数连接MQTT 服务器,当连接成功时,MQTT_OnConnected()所注册的回调函数会被自动调用,此时可以通过MQTT_Subscribe()订阅主题,订阅主题格式为${productID}/${deviceName}/control。
M QTT 数据的收发都采用JSON 格式, 使用CJSON库可简化JSON 数据的操作,CJSON 在ESP8266 上移植时,由于ESP8266 不支持浮点运算,为此必须把与浮点相关的函数进行屏蔽。 当程序收到服务器端的推送消息后, 使用cJSON_Parse () 函数即可将字符串转换为JSON 格式,然后调用cJSON_GetObjectItem()即可得到相应的键值, 根据键值即可获得用户的控制指令。 使用CJSON 库时,必须注意内存泄漏问题,在使用完cJSON对象后, 必须使用cJSON_Delete () 函数对内存进行释放。
本研究设计的基于腾讯物联网平台的教室节能控制器,仅使用一块WIFI 芯片ESP8266 及少量为外围设备便实现了对高校教室温度、 光强度、 门开关等状态的采集,通过MQTT 协议以及腾讯物联网平台,用户就可以远程操作教室中灯、空调、电视等大型设备,极大的减小了高校管理员的工作压力, 具有较好的市场前景和研究价值。