
4G-OneNet-户外光照采集系统
简介
使用STM32F103和合宙的Air724UG 4G模块做的一个户外光照传感器,并将秒级间隔的光照数据传输至OneNet云端
简介:使用STM32F103和合宙的Air724UG 4G模块做的一个户外光照传感器,并将秒级间隔的光照数据传输至OneNet云端开源协议
:CC BY-SA 3.0
(未经作者授权,禁止转载)描述
目的
项目来源是之前需要做一个户外光照采集器,收集一个区域各个采集器点的光照强度。然后预测该区域未来的光强,以及可发电量。
这里开源这个光照传感器上云的方案,旨在分享如何使用Air724 4G AT模块,分享如何将数据通过MQTT传输至云端(OneNet),之前看网上的资料确实太少太杂了,搞了好久才做出。同时,也可以使用相关API进行云端的数据获取。后面会给出python写好的代码,使用OneNet的https的API获取设备数据。
总体框架
主控使用STM32F103RCT6;供电部分使用的EG1192,一个Buck电路,同时也加了一个type-C口,直接用5v供电也可以;4G模块使用合宙Air724 4G模块;光照传感器使用MAX44009模块,这里就直接买的JT-I2C1208模块,它配有防水透明外壳和连接线;实时操作系统使用的FreeRTOS;LCD仅在调试时使用即可;外部EEPROM用来记录手动调参的参数,即有可能MAX44009会有偏移,需要手动调参,这里只使用了y = ky’+b,y为调节后的值,y'为原始值,可以调节k和b来改善偏移。
图1 总体框图
图2 数据传输框图
4G模块连接OneNet使用说明
云我们选用中国移动的OneNet,在银尔达买的Air724 4G模块刚开始可以先连接到电脑直接使用串口助手进行调试,这里推荐使用格西烽火串口助手,测试的流程和AT命令集详细可以查看YED M724 AT 固件用户手册和Luat 4G LTE 模块 AT 命令手册。如果想要先使用MQTT.fx测试一下OneNet接入设备,可以看这个链接的说明:MQTT.fx模拟设备接入物联网平台。OneNet的接入安全认证可以查看这个链接:接入安全认证。
图3 Air724 4G模块
图4 格西烽火界面
图5 通用上网流程
关于Air724UG 4G模块通过MQTT连接上OneNet,大致流程如图5所示,它发送的具体AT指令流程如图4所示。具体的流程分析中,发送的AT指令我就只说明关键的地方,他的返回值我也不再一一说明,在Luat 4G LTE 模块 AT 命令手册或代码或图4中的激励中详细可以看到。
具体发送AT指令流程:
1、初始化硬件。包括匹配波特率、检测SIM卡是否插好,使用AT+CPIN?\r\n
查询SIM卡是否插好,如果返回+CPIN: READY
则为正常。
2、网络设置。首先查询信号质量;然后查询网络状态等等。。。详细过程见图4。
3、MCOFIG。使用该指令格式为AT+MCONFIG="LightSensor1","592329","version=2018-10-31&res=products%2F592329%2Fdevices%2FLightSensor1&et=1781202267&method=md5&sign=???????????????????"\r\n
,具体每个位置的含义是:第一个引号中的"LightSensor1
"是你的某产品中某设备名称;第二个参数"592329
"是你的产品ID;第三个参数是根据OneNet要求生成的token,包含了产品products号,设备名称devices名称,时间戳et,加密方法method和签名值sign。第三个参数可以使用OneNet的token生成工具或使用官方的python生成示例生成,这里的key需要你的OneNET产品的key,而不是设备秘钥。
图6 OneNet的token生成工具
4、建立TCP连接,请求会话。首先使用指令格式为AT+MIPSTART="mqtts.heclouds.com",1883\r\n
,建立TCP连接,这里端口连接到1883。发送后,收到CONNECT OK则连接成功。然后使用指令AT+MCONNECT=1,120\r\n
,请求会话,收到CONNACK OK则请求会话成功。打开OneNet查看设备,可以看到设备已经在线。
图7 设备查询在线
5、查询MQTT状态,订阅主题。使用指令AT+MQTTSTATU\r\n,可以查询MQTT连接状态,关于订阅主题,物联网平台中,服务端和设备端通过通信主题Topic实现消息通信,设备可以通过发布消息到系统 topic 调用服务接口,也可以订阅系统 topic 用于接收服务消息通知,服务提供的系统 topic 详见OneNet通信主题Topic列表。订阅主题,使用指令AT+MSUB="$sys/592329/LightSensor1/dp/post/json/accepted",0\r\n
,和指令AT+MSUB="$sys/592329/LightSensor1/dp/post/json/rejected",0\r\n
,订阅的这两个主题分别是发布消息接收和拒绝的主题,在测试时可以通过这两个主题的消息,判断是否发布消息成功
6、发布消息。使用指令AT+MPUB="$sys/592329/LightSensor1/dp/post/json",0,0,"{\\22id\\22: 1,\\22dp\\22: {\\22light\\22: [{\\22v\\22:35}]}}"\r\n
,\\22表示内嵌的双引号,这里是向OneNet的云端发送light的物理数据,发送的具体格式如图8所示。发送之后可以看到数据更新为指令中的"v":35。
图8 payload格式示例
图9 light值更新
原理图设计说明
原理图中使用外部看门狗,是考虑到会休眠时无法喂狗,需要给看门狗加上使能;
原理图中电源部分,在HT7333-A输出口接一个J1,使用的时候直接跳线帽接上或者直接焊短接即可,或者你可以直接把这里去掉。这里加J1是我之前调试的时候加的;
虽然画了SD卡卡槽,考虑到可能会把数据存储到本地,但是目前暂时未用到;
原理图上的LED排母接口,接的是1.14寸TFT屏,只在调试的时候有用到,链接是:1.14寸TFT显示屏
PCB设计说明
PCB的布局没有做过多优化,大家可以按照自己的想法再更改。
STM32代码说明
RTOS的各任务的.c文件放在Tasks文件夹中。user_TasksInit.c
中的User_Tasks_Init(void)
是任务初始化函数,替代了cubemx生成的MX_FREERTOS_Init(void)
函数。
大家拿到代码需要根据你OneNet的设备信息改下onenet_MQTT.c
这个文件中的代码,需要写入你的产品ID,设备名,和签名值,如图10所示。由于安全问题我给的代码会把sign中的值改成错误的,以免大家连我的设备了。
边缘设备除了上发光照强度数据,我还额外写了云端下发命令到边缘设备,即在设备上订阅了cmd主题,详细的订阅主题和字符串处理内容请细看STM32的代码。
图10 修改onenet_MQTT.c文件中的参数
python代码说明
python我给了有两个文件,分别是Onenet_getdata.py和token_ge.py,分别用于你的电脑获取Onenet中设备的物理数据,和生成token。获取的数据返回格式为JSON格式。注意,代码中产品ID,设备名,产品key同样需要改成你自己的参数,这些信息都是可以在你的OneNet开发者平台看到详情的,复制下来即可,这里我就不演示了。
实物展示说明
带有外壳的实物图如图n所示,外壳是直接淘宝买的,然后做好防水即可,这里引出一条12v母头线公头连接线监控电源线,接入外部12V的DC输入。拆解的实物图如图n所示,这里这个外壳3D打印的,后面就没用了,图中标出了光照传感器和Air724UG直插模块的位置,这两个直接插上即可。
图11 带外壳的实物图
图12 拆解的实物图
然后是实物的测试,这里我截取了一下晚上去吃饭时,放在寝室的设备的数据如图n所示。由于我现在在其他地方上课身边没有设备,只放出了之前记录的数据图片。之前说的,这个设备可以秒级间隔发数据,但是实际上,可能会受网络延迟等影响,最后测试时发现数据间隔有的为1s有的为2s,这里我查询不到以前的数据了,所以没放出来。
图13 云端数据展示
参考链接
Luat社区:Luat社区 (openluat.com)
部分模块购买链接
详见正文中的蓝色超链接哦
Github链接
https://github.com/No-Chicken/4G-OneNET-LightSensor
设计图

BOM


评论