基于OneNet平台设计的物联网温度采集系统-4G模块+STM32上云
一、设计说明
设计思路: 每个测量点采用4G+STM32+温度测量模块组成;采集温度数据之后直接上传到OneNet物联网云平台,在OneNET云平台上设计可视化界面进行显示,并且也可以在手机APP设备云
上显示。
当前采用的物联网平台是OneNET云平台,OneNET中国移动物联网开放平台是由中国移动打造的PaaS物联网开放平台。平台能够帮助开发者轻松实现设备接入与设备连接,提供综合性的物联网解决方案,实现物联网设备的数据获取,数据存储,数据展现。
当前这个设计算是物联网技术的一个典型应用。目前物联网产业正在飞快发展着,从智能电视、智能家居、智能汽车、医疗健康、智能玩具、机器人等延伸到可穿戴设备领域。 物联网将赋能智能硬件向多元的消费场景渗透,从而创造更加便捷、舒适、安全、节能的生活环境。 物联网是通过约定的协议将原本独立存在的设备相互连接起来,并最终实现智能识别、定位、跟踪、监测、控制和管理的一种网络,无需人与人、或人与设备的互动。通俗来说物联网就是“物物相连的网”,主要应用于智能交通、智能医疗、智能家居、智能物流、智能电力等领域。
二、硬件选型
2.1 4G模块-WH-LTE-7S1
4G模块选择有人科技的WH-LTE-7S1
模块,支持全网通,外置了卡槽,可以插卡,本身模块也内置了电信卡,可以直接使用,不用考虑买卡,不用考虑卡接触不良等问题,内置的卡目前是8年免费使用,每月100M免费流量。
有人科技,插针式Cat-1模块(WH-LTE-7S1) 4G模块使用介绍:https://www.usr.cn/Product/294.html
下面是4G模块的功能参数:
透传模式, HTTPD模式 | 工作模式 |
---|---|
AT+命令结构 | 设置指令 |
TCP/UDP/DNS/FTP/HTTP | 网络协议 |
4 | Socket数量 |
串口AT指令、网络AT指令 | 用户配置 |
域名解析DNS | 支持 |
---|---|
简单透传方式 | 支持TCP Client /UDP Client |
心跳数据包 | 支持自定义心跳包/SN心跳包/ICCID心跳包/IMEI心跳包/LBS心跳包 |
注册包机制 | 支持自定义注册包/SN注册包/ICCID注册包/IMEI注册包/CLOUD注册包 |
FOTA升级 | 支持 |
套接字分发协议 | 支持 |
基站定位 | 支持 |
FTP他升级协议 | 支持 |
NTP校时功能 | 支持 |
工作状态指引脚 | 支持 |
通过该模块可以快速实现串口与网络的双向数据透传:
农业物联网环境监测案例: 可将农业大棚里各类传感器采集的数据,通过LTE或GPRS网络快速上传 至远程服务器,方便控制中心实时监测大棚动态,及时作出响应。
两个WH-LTE-7S1通过有人云实现一对一透传: https://www.usr.cn/Faq/1217.html
2.2 铂电阻PT100
铂电阻,简称为:铂热电阻,它的阻值会随着温度的变化而改变。它有PT100和 PT1000等等系列产品,它适用于医疗、电机、工业、温度计算、卫星、气象、阻值计算等高精温度设备,应用范围非常之广泛。
PT100铂电阻是PT100的简称,其中PT100是铂热电阻的分度号,PT代表热电阻的材质是铂,PT后的100即表示它在0℃时阻值为100欧姆,在100℃时它的阻值约为138.5欧姆。它的阻值会随着温度的变化而改变。
2.3 STM32系统板
STM32采用STM32F103RCT6,FLASH256KB,RAM48KB,主频72MHZ。
三、OneNet云平台创建
OneNET资源模型如下图:
下面是名词的解释:
【1】产品(product) 用户的最大资源集为产品,产品下资源包括设备、设备数据、设备权限、数据触发服务以及基于设备数据的应用等多种资源,用户可以创建多个产品。
【2】设备(device) 设备为真实终端在平台的映射,真实终端连接平台时,需要与平台设备建立一一对应关系,终端上传的数据被存储在数据流中,设备可以拥有一个或者多个数据流。
【3】数据流与数据点 数据流用于存储设备的某一类属性数据,例如温度,湿度,坐标等信息;平台要求设备上传并存储数据时,必须以key-value的格式上传数据,其中key即为数据流名称,value为实际存储的数据点,value格式可以为int、float、string、json等多种自定义格式。
【4】APIkey APIkey为用户进行API调用时的密钥,用户访问产品资源时,必须使用该产品目录下对应的APIkey。
【5】触发器(trigger) 触发器为产品目录下的消息服务,可以进行基于数据流的简单逻辑判断并触发HTTP请求或者邮件。
【6】应用(application) 应用编辑服务,支持用户以拖拽控件并关联设备数据流的方式,生成简易网页展示应用。
3.1 官网首页
地址: https://open.iot.10086.cn/
如果没有onenet的账号,点击右上角进行账号注册,注册之后完成实名认证即可。
在产品服务里可以看到常见物联网接入服务:
3.2 创建产品
(1)控制台页面
点击右上角的控制台按钮
,进入旧版控制台。 (切换成旧版,需要使用多协议接入)
(2)多协议接入
选择多协议接入:
(3)HTTP协议
选择HTTP协议,点击添加产品。
(4)填写产品信息
根据自己的项目情况,去填写这里的产品信息。
填好之后,点击确定即可。
3.3 添加设备
产品创建完之后,点击添加设备。
(1)添加设备
(2)设置设备信息
根据自己的设备信息填写。
(3)添加多个采集点设备
因为采集点有多个,一个采集点就是一个独立的设备,如果有40个采集点,就创建40个设备。
我这里为了方便测试,就创建3个设备,对应3个采集点。
添加完成:
3.4 创建数据流模板
(1)添加数据流模板
数据流模板是设置设备上报数据时存放的属性字段。
(2)添加温度字段
添加温度字段。 目前采集点只是采集温度,这里创建一个温度字段就行了。 如果采集点还需要采集更多的数据类型,这里按格式添加即可。
(3)添加完成
添加后,如果页面没有出来,鼠标右键刷新一下页面就能看到。
3.5 数据点上传
多协议接入帮助文档地址:https://open.iot.10086.cn/doc/v5/develop/detail/multiprotocol
平台通过数据流与数据点来组织设备上行数据,如下图所示:
设备上传并存储数据时,必须以key-value的格式上传数据,其中key即为数据流(stream)名称,value为实际存储的数据点(point),value格式可以为int、float、string、json等多种自定义格式。
在实际应用中,数据流可以被用于分类描述设备的某一类属性数据,例如温度,湿度,坐标等信息,用户可以自定义数据流的数据范围,将相关性较高的数据归类为一个数据流。
(1)平台接入地址
目前是采用HTTP协议上传数据,HTTP协议是短连接,所以在设备页面是看不到设备在线的情况。
IP地址: 183.230.40.33
端口号: 80
(2)创建设备APIKey
通过HTTP协议上传数据时,需要设备的apikey作为密匙。
【1】在设备列表页面,单击详情:
【2】点击添加APIKey
因为我这是设备节点3,为了好区别,我这里设置dev3
。
【3】添加成功
【4】将剩下的2个温度采集设备也创建APIKey
(3)设备ID
每个设备创建后都有一个ID,上传数据时,需要填写这个ID。
在设备详情页面可以看到这个ID。
(4)列出当前设备的ID和APIkey
为了方便接下来测试,我把3个设备的ID和APIkey先贴出来待用。
温度采集设备1
设备ID: 1009326949
APIKey: Q1=mhFwn=zt6nfp1EYvSsUcwUX8=
温度采集设备2
设备ID: 1009327662
APIKey: ezI=f3T=47=jlJssgKH2xVcLtBU=
温度采集设备3
设备ID: 1009327756
APIKey: KkHKbNWmy4diHtpT=D=AfoZxy3w=
(5)数据点上传格式
当前选择的是HTTP协议上传数据,下面是标准的HTTP报文格式:
POST /devices/<填设备ID>/datapoints HTTP/1.1
api-key:<填设备的ApiKey>
Host:api.heclouds.com
Connection:close
Content-Length:<填下面需要上传的数据总字节数>
{"datastreams":[{"id":"<填数据流名称>","datapoints":[{"value":<上传的值>}]}]}
比如:我给设备采集节点1,上传一个温度值。HTTP的报文格式按如下填写。
POST /devices/1009326949/datapoints HTTP/1.1
api-key:Q1=mhFwn=zt6nfp1EYvSsUcwUX8=
Host:api.heclouds.com
Connection:close
Content-Length:61
{"datastreams":[{"id":"temp","datapoints":[{"value":24.5}]}]}
手动测试组合报文赋值的时候,这个数据长度的计算可以通过编辑器(我用的notepad++)完成。
如果在程序里发送数据时,下面的数据长度可以动态计算的(strlen)。
3.6 模拟数据上传测试
为了方便验证云平台是否能正常使用,下面使用TCP调试助手来模拟设备发出HTTP报文(上传数据点)给OneNet平台完成测试。
(1)打开网络调试助手
输入远程IP地址和端口号,然后点击连接。
IP地址: 183.230.40.33
端口号: 80
连接成功:
(2)输入发送的数据
POST /devices/1009326949/datapoints HTTP/1.1
api-key:Q1=mhFwn=zt6nfp1EYvSsUcwUX8=
Host:api.heclouds.com
Connection:close
Content-Length:61
{"datastreams":[{"id":"temp","datapoints":[{"value":24.5}]}]}
特别说明:
【1】 复制上面代码到下面的网络调试助手的时候,要注意格式。因为PDF文档复制的时候会导致换行符这些丢失。 要按下面红色框框这样的格式贴进去,才能发送。
【2】HTTP端口连接上之后,如果没有发送数据,过一会会自动断开连接的,或者一次数据发送成功,服务器也会断开连接。每次发送之前重新连接上,再发送即可。
发送成功的提示:
(3)登录云平台查看数据
刚才测试数据上传的是设备1,在设备详情页面找打设备1,点开设备详情页面,找到数据流展示页面,可以看到刚才上传的数据。
(4)剩下的温度采集节点上传温度测试
其他的温度检测设备节点如果要上传数据,也是一样的方式。
下面将3个设备的发送数据格式都列出来,方便填入调试助手发送测试:
温度采集设备1:
POST /devices/1009326949/datapoints HTTP/1.1
api-key:Q1=mhFwn=zt6nfp1EYvSsUcwUX8=
Host:api.heclouds.com
Connection:close
Content-Length:61
{"datastreams":[{"id":"temp","datapoints":[{"value":24.5}]}]}
温度采集设备2:
POST /devices/1009327662/datapoints HTTP/1.1
api-key:ezI=f3T=47=jlJssgKH2xVcLtBU=
Host:api.heclouds.com
Connection:close
Content-Length:61
{"datastreams":[{"id":"temp","datapoints":[{"value":25.5}]}]}
温度采集设备3:
POST /devices/1009327756/datapoints HTTP/1.1
api-key:KkHKbNWmy4diHtpT=D=AfoZxy3w=
Host:api.heclouds.com
Connection:close
Content-Length:61
{"datastreams":[{"id":"temp","datapoints":[{"value":26.5}]}]}
四、可视化页面设计
为了方便展示温度信息,可以利用onenet提供的可视化组件设计一个网页进行显示。
地址: https://open.iot.10086.cn/studio/view/project
目前OneNet的View数据可视化组件分为3个权限: 基础版、企业版、专业版; 基础版也就是免费版,可以使用基本的组件。 一般要求不高的数据展示,基础版就差不多够用的。
下面是企业版的价格费用:
4.1 创建数据源模板
可视化页面上的控件显示数据时,需要设置数据来源。所以,这里先创建数据的来源。
(1)创建源模板
(2)填写数据源的信息
根据提示填写产品ID和Key,下面的设备和数据流选择对应的设备即可。每个设备都需要建立一个数据源模板。
(3)产品ID和key在哪里看?
在产品的概述页面,可以找到产品ID和对应的key。
(4)创建完成
为了好区分名字,可以将数据源模板的名称按照序号设置,这样一个设备对应一个数据源。
因为我创建了3个设备,这里对应创建了3个数据源模板。
4.2 创建可视化页面
(1)新建项目
新建项目可以选择空白模板,也可以选择现有的模板创建。 就算选择空白模板,也可以去参考现成的模块设计的。
我这里选择空白模板
创建新项目。
新建成功后,点击编辑按钮进行页面设计。
(2)控件介绍
进入到编辑页面,可以看到有很多的控件可以选择使用。其中带锁
的表示,当前基础版无法使用,高级控件需要升级专业版才可以使用。(新用户有7天的专业版试用期,可以体验一下专业版的控件)
(3)新建多个子页面
为了方便显示每个采集点的温度信息,可以新建多个子页面显示数据,也可以在一个页面显示,具体看自己需求。
我这里新建了3个页面,分别显示3个采集点的温度数据。 并且页面的名字,页面的类型都可以修改。 页面类似可以选择PC端样式,也可以选择手机端样式。
(4)控件选择数据源
每个控件显示的数据,可以选择数据的来源。
比如: 我使用仪表盘显示温度信息,点击仪表盘控件,在右边选择数据源。
第一步,选择管理数据源。
第二步。使用数据源模板新建数据源
新建成功的3个数据源。
第三步,设置控件的数据源
比如:我这个仪表盘显示温度采集点1的数据,就选择数据源为设备1的数据。 并且需要把下面的数据过滤器去掉。
(5)界面样式设计
【1】修改表盘显示的单位为摄氏度。
【2】为了方便区分设备,添加一个标题,显示文字提示
记得去掉数据过滤器。
界面的背景也可以设置,也可以设置图片作为背景。
(6)保存界面发布
由于onenet的可视化界面处于维护期,这个期间编写的界面无法保存,发布。 但是在编辑页面的仪表盘还是可以看到数据的实时变化,可以测试整套流程。 等10.24之后,应该就可以正常使用了,到时候在重新设计页面。
(7)设备云APP
在手机上安装设备云APP,如果项目发布之后,除了分享链接浏览器打开查看以外,也可以登录手机APP查看页面。
下面是手机APP上的效果:
五、规则引擎与触发器
5.1 触发器设置
触发器可以设置一些简单的条件,比如,温度大于多少,小于多少。 可以让OneNet给指定地址发送邮件通知。或者当指定范围内的数据点满足触发条件的要求时,也可以向url参数指定的地址发送post请求(可以对接自己的服务器)。
(1)添加触发器
(2)设置触发条件
可以选择关联指定设备,或者关联全部设备。然后设置触发条件,设置关联的邮箱。
当温度超出某个阀值,可以触发条件,发送邮件通知。
(3)设置成功
(4)测试触发条件
我这里的触发条件是温度大于50就会发送邮件。这里采用网络调试助手测试,上传一个大于50的温度,触发条件发送邮件。
发送数据之后,可以看到邮件已经收到了。
5.2 添加规则
(1)添加规则
(2)设置规则
可以设置规则的筛选方式。
(3)开通SMS短信服务
地址: https://open.iot.10086.cn/sms/console/product/#/openSms
目前短信服务是针对企业开放。
六、硬件部分
6.1 有人云WH-LTE-7S1模块调试
(1)模块引脚功能说明
模块的使用说明书:https://www.usr.cn/Down/WH-LTE-7S1_V1.0.4.pdf
拿到模块之后首先就是要了解引脚说明,明白每个引脚的功能。 在手册的第9
页,有对模块引脚的介绍。
下面是模块的实物图:
调试模块时,必接的引脚有5个。 分别是:电源VCC(5V),电源GND,串口发送,串口接收,开机引脚。
下面标出这几个引脚的位置:
下面是接好线的实物图:
下面是标出引脚的排线编号规律:
接线说明: 接线时认真看IO口编号,对号入座,千万别接错了。
目前模块供电的VCC+正极有2个脚。一个支持3.4-4.2V (第16脚),一个支持5V16V(第13脚和第14脚)。供电的时候,这两个脚只能选择其中一个。 其中,3.4-4.2V 供电是留给锂电池使用的,5V16V的供电接口方便接单片机的电源。
当前的这个项目是需要使用STM32开发板来驱动模块完成网络连接,处理。 所以,这里模块供电引脚直接选择5V,方便接在单片机开发板引出的电源口上。
接线总结:
模块的第6个脚(UART-TX): 接单片机或者USB转TTL模块的RXD
模块的第7个脚(UART-RX): 接单片机或者USB转TTL模块的TXD
模块的第10个脚(key): 接单片机的电源正-3.3v (表示模块开机)
模块的第12个脚(GND): 接单片机的电源地-GND (给模块供电)
模块的第13个脚(DCIN): 接单片机的电源正-5v (给模块供电)
(2)模块接上位机软件测试
第一次拿到模块,肯定要先测试模块是否正常。 有人科技提供了模块对应的串口调试上位机,可以直接在官网下载。
【1】下载上位机调试软件
下载地址:https://www.usr.cn/Download/939.html
【2】将模块与USB-TTL模块接好线,连接到电脑USB口上。
接线按下面的来:
模块的第6个脚(UART-TX): 接单片机或者USB转TTL模块的RXD
模块的第7个脚(UART-RX): 接单片机或者USB转TTL模块的TXD
模块的第10个脚(key): 接单片机的电源正-3.3v (表示模块开机)
模块的第12个脚(GND): 接单片机的电源地-GND (给模块供电)
模块的第13个脚(DCIN): 接单片机的电源正-5v (给模块供电)
【3】打开软件测试模块
软件打开后,选择串口后,打开串口。 点击获取当前参数,就能看到串口打印获取到数据。
依次可以点击查询信号强度,查询当前版本,查询DMEI:
注意: 模块默认的工作模式是NET模式,他也就是连接的有人的服务器。 如果要执行AT指令,需要先进入配置状态才可以正常执行。
(3)模块状态指示灯
模块的第9个引脚是状态指示灯输出接口,正常启动后,这个引脚会按照1 秒的频率输出高低电平变化,可以将这个引脚接在单片机上的某个LED灯口上,通过观察LED灯的闪烁状态确定模块是否正常工作。也可以作为输入脚接到单片机的某个IO口上,用于判断模块是否工作正常。
(4)模块的AT指令手册
下载地址:https://www.usr.cn/Download/940.html
(5)有人的测试服务器
服务器: socket.usr.cn
端口号: 2317
这是有人的公网测试TCP服务器,向这个服务器发送数据,服务器会将发送的数据返回。 可以用这个服务器测试4G模块的联网情况。
6.2 示例代码
下面是STM32ZET6 + 4G +DS18B20的代码,利用4G模块将采集的DS18B20温度上传到OneNet平台。
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "key.h"
#include "usart.h"
#include <string.h>
#include "timer.h"
#include "ds18b20.h"
/*
硬件连接方式:
(1) 有人的WH-LTE-7S1-4G模块与STM32的串口3连接。
模块的第6个脚(UART-TX): 接单片机PB11(RXD)
模块的第7个脚(UART-RX): 接单片机PB10(TXD)
模块的第10个脚(key) : 接单片机的电源正-3.3v (表示模块开机)
模块的第12个脚(GND) : 接单片机的电源地-GND (给模块供电)
模块的第13个脚(DCIN) : 接单片机的电源正-5v (给模块供电)
(2) DS18B20温度传感器
VCC---3.3V
GND---GND
PB15---DS18B20(IN)
*/
/*
函数功能: 清理串口3接收缓冲区
*/
void ClearUSART3_RxBuff()
{
//清理串口接收缓冲区
USART3_RX_FLAG=0;
USART3_RX_CNT=0;
memset(USART3_RX_BUFFER,0,sizeof(USART3_RX_BUFFER));
}
/*
函数功能: 向4G模块发送命令
函数返回值:0表示成功 1表示失败
*/
u8 LTE4G_TCP_SendCmd(char *cmd)
{
u8 i=0;
ClearUSART3_RxBuff();
USARTx_StringSend(USART3,cmd);
//等待模块响应
for(i=0;i<5;i++)
{
delay_ms(200);
if(USART3_RX_FLAG)
{
USART3_RX_BUFFER[USART3_RX_CNT]='\0';
printf("RX: %s\r\n",USART3_RX_BUFFER);
if(strstr((char*)USART3_RX_BUFFER,"OK"))
{
return 0;
}
}
}
return 1;
}
/*
函数功能: 查询信号强度
*/
u8 LTE4G_GetCSQ(void)
{
u8 run=0;
//发送查询信号强指令
//在透传模式下, 可以在命令前面加 usr.cn# 即可正常使用命令,而不用进入到配置模式(AT指令模式)。
run=LTE4G_TCP_SendCmd("usr.cn#AT+CSQ\r\n");
//处理数据
//....
return run;
}
/*
函数功能: 查询SOCKA连接的服务器配置
*/
u8 LTE4G_GetSOCKA()
{
u8 run=0;
//发送查询连接服务器的指令
//在透传模式下, 可以在命令前面加 usr.cn# 即可正常使用命令,而不用进入到配置模式(AT指令模式)。
run=LTE4G_TCP_SendCmd("usr.cn#AT+SOCKA\r\n");
//处理数据
//....
return run;
}
/*
函数功能: 查询socket重连时间间隔
*/
u8 LTE4G_GetSOCKRSTIM()
{
u8 run=0;
//在透传模式下, 可以在命令前面加 usr.cn# 即可正常使用命令,而不用进入到配置模式(AT指令模式)。
run=LTE4G_TCP_SendCmd("usr.cn#AT+SOCKRSTIM\r\n");
//处理数据
//....
return run;
}
/*
函数功能: 4G模块连接TCP服务器配置
函数返回值:0表示成功 1表示失败
*/
u8 LTE4G_TCP_ConnectCogfig(void)
{
u8 run;
//清理串口接收缓冲区
ClearUSART3_RxBuff();
//配置模块退出透传模式,进入AT指令配置模式
USARTx_StringSend(USART3,"+++");
delay_ms(200);
USARTx_StringSend(USART3,"a");
delay_ms(200);
//判断是否成功
if(USART3_RX_FLAG)
{
USART3_RX_BUFFER[USART3_RX_CNT]='\0';
printf("RX: %s\r\n",USART3_RX_BUFFER);
if(strstr((char*)USART3_RX_BUFFER,"ok"))
{
//1. 配置4G模块的模式为NET模式(可以理解为TCP透传模式)
run=LTE4G_TCP_SendCmd("AT+WKMOD=NET\r\n");
if(run)return 1;
//2. 配置4G模块连接的服务器地址信息
run=LTE4G_TCP_SendCmd("AT+SOCKA=TCP,183.230.40.33,80\r\n");
if(run)return 2;
//3. 保存配置并重启
run=LTE4G_TCP_SendCmd("AT+S\r\n");
if(run)return 3;
//等待4秒,模块重启成功
delay_ms(4000);
}
}
else
{
return 1;
}
return 0;
}
/*
函数功能 : 发送数据
函数返回值: 0表示成功 1表示失败
*/
u8 LTE4G_TCP_SendData(char *data)
{
u8 i=0;
//清理接收缓冲区
ClearUSART3_RxBuff();
//发送查询服务器连接状态指令
//在透传模式下, 可以在命令前面加 usr.cn# 即可正常使用命令,而不用进入到配置模式(AT指令模式)。
USARTx_StringSend(USART3,"usr.cn#AT+SOCKALK\r\n");
//等待模块响应
for(i=0;i<5;i++)
{
delay_ms(200);
if(USART3_RX_FLAG)
{
USART3_RX_BUFFER[USART3_RX_CNT]='\0';
printf("RX: %s\r\n",USART3_RX_BUFFER);
//断开状态
if(strstr((char*)USART3_RX_BUFFER,"Dis"))
{
break;
}
//连接状态
else if(strstr((char*)USART3_RX_BUFFER,"Connect"))
{
//发送数据
USARTx_StringSend(USART3,data);
printf("TX:\r\n%s\r\n",data);
return 0;
}
}
}
return 1;
}
/*
函数功能: 发送一次温度数据到OneNet
*/
u8 SendTemp_To_OneNet(char *ds18b20_tmp)
{
char send_http_cmd[300];
//拼接数据
snprintf(send_http_cmd,sizeof(send_http_cmd)-1,
"POST /devices/1009326949/datapoints HTTP/1.1\r\n" \
"api-key:Q1=mhFwn=zt6nfp1EYvSsUcwUX8=\r\n" \
"Host:api.heclouds.com\r\n" \
"Connection:close\r\n" \
"Content-Length:%d\r\n" \
"\r\n" \
"{"datastreams":[{"id":"temp","datapoints":[{"value":%s}]}]}",
57+strlen(ds18b20_tmp),
ds18b20_tmp
);
return LTE4G_TCP_SendData(send_http_cmd);
/*
说明: 上面的57+strlen(ds18b20_tmp)是什么含义?
为了方便计算最下面这一行的数据长度,
提前算好固定的字符串长度 + 传入的温度字符串 就是最终的数据长度。
*/
}
//判断网络是否建立连接
// 建立后输出高电平 否则是低电平
//STM32的PE0接在模块的第1个脚
#define m_LTE4G_LINKA PEin(0)
void LTE4G_GetLINKA_State()
{
//开时钟
RCC->APB2ENR|=1<<6;
//配置模式
GPIOE->CRL&=0xFFFFFFF0;
GPIOE->CRL|=0x00000008;
}
int main()
{
u8 i;
u8 run=0;
u32 time_cnt=0;
u16 ds18b20_temp;
char tmp_buffer[10];
USART1_Init(115200); //串口1用于Debug打印
USART3_Init(115200); //串口3接4G模块
TIMER3_Init(72,20000); //超时时间20ms
DS18B20_Init(); //温度传感器
LTE4G_GetLINKA_State();
//检测DS18B20硬件状态
run=DS18B20_Check();
if(run==0)
{
printf("DS18B20 温度传感器正常.\r\n");
}
else
{
printf("DS18B20 温度传感器不存在.\r\n");
}
printf("正在初始化4G模块请稍等.\r\n");
for(i=0;i<5;i++)
{
printf("配置第%d次\r\n",i);
run=LTE4G_TCP_ConnectCogfig();
if(run==0)
{
printf("配置成功.\r\n");
break;
}
else
{
printf("本次配置失败,错误编号:%d\r\n",run);
}
delay_ms(1000);
}
while(1)
{
//2秒钟上传一次
if(time_cnt>200)
{
time_cnt=0;
//读取一次温度
ds18b20_temp=DS18B20_ReadTemp();
if(ds18b20_temp==65535)
{
//默认温度
sprintf(tmp_buffer,"%s","26.8");
}
else
{
//转换后得到温度
sprintf(tmp_buffer,"%d.%d",ds18b20_temp>>4,ds18b20_temp&0xF);
}
//查询信号质量
LTE4G_GetCSQ();
//查询连接的服务器配置
LTE4G_GetSOCKA();
//查询重连时间间隔
LTE4G_GetSOCKRSTIM();
if(m_LTE4G_LINKA)
{
printf("网络连接正常...\r\n");
}
else
{
printf("模块网络未连接...\r\n");
}
//发送一次温度
run=SendTemp_To_OneNet(tmp_buffer);
if(run)
{
printf("本次温度发送失败.\r\n");
}
else
{
printf("温度上传成功.\r\n");
}
//清理接收缓冲区
ClearUSART3_RxBuff();
}
//接收4G模块返回的数据
if(USART3_RX_FLAG)
{
USART3_RX_BUFFER[USART3_RX_CNT]='\0';
printf("4G模块收到数据.....\r\n");
//向串口打印4G模块返回的数据
for(i=0;i<USART3_RX_CNT;i++)
{
printf("%c",USART3_RX_BUFFER[i]);
}
USART3_RX_CNT=0;
USART3_RX_FLAG=0;
}
//轮询记时
DelayMs(10);
time_cnt++;
}
}
- 点赞
- 收藏
- 关注作者
评论(0)