如何使用合宙的DTU+业务云平台,做一个温湿度传感器数据采集项目?

电子说

1.3w人已加入

描述

可以不用熟悉繁琐的环境搭建吗?

可以不用关注繁琐的编译选项吗?

可以不用关心繁琐的C语言陷阱吗?

可以不写代码或者用寥寥几行代码,就完成对外设的控制,和服务器的通信吗?

答案是:完全可以!

使用合宙的物联网解决方案,一步到位,合宙技术人员完成开发、调试和维护工作,不需要客户投入任何技术资源,最快1天完成开发!

来看一下,我是如何使用Air-D780L1-Y+合宙业务云平台,做一个温湿度传感器数据采集项目的。

一、DTU整机Air-D780L1-Y介绍

本次项目的主角是一款合宙DTU整机产品Air-D780L1-Y,

Air-D780L1-Y的功耗低,品质稳定,购买样品也方便,资料全开放。

如下图所示:

DTU

Air-D780L1-Y的产品说明书可以参考:Air-D780L1-Y 产品说明书 。

今天我就用手把手的教程,教会你怎样使用Air-D780L1-Y, 开发各种应用项目。

二、业务逻辑介绍

这里,先要告诉你一些前提条件,虽然听着像是废话, 但是如果你不知道的话,可能后面会比较懵逼,所以还是希望你能够认真看完这一节。

这个项目的产品定义是:Air-D780L1-Y每隔5秒钟,将温湿度传感器的数据上传到合宙业务云平台。

要想达到这个目的, 有必要先介绍一下这个项目的系统框架图:

DTU

基本的操作和业务逻辑如下:

DTU整机为Air-D780L1-Y;

通过Luatools烧录LuatOS-iRTU固件到Air-D780L1-Y中;

Air-D780L1-Y需要插入SIM卡;

Air-D780L1-Y通过RS485接口连接温湿度传感器;

WEB参数配置平台中,绑定并且分组设备,然后配置运行参数;

Air-D780L1-Y开机后,连接WEB参数配置平台,下载运行参数到整机中,然后自动重启;

Air-D780L1-Y读取温湿度传感器数据,并且定时上传数据到合宙业务云平台,可以在小程序中查看数据;

小程序也可以下发控制指令给Air-D780L1-Y;

在大概了解了业务逻辑之后,接下来我将带你进入正式的动手实操阶段!

三、准备硬件环境

3.1  硬件清单列表

准备一台Air-D780L1-Y整机

DTU

准备一张可以上网的SIM卡,也可以使用自己的手机卡,插入到Air-D780L1-Y整机中;

准备一条USB数据线,必须要有数据传输功能,将外部的绝缘皮拨开之后,里面至少要有红色、白色、绿色、黑色或者红色、白色、蓝色、黑色四根导线,用来烧录LuatOS-iRTU固件到Air-D780L1-Y中;

DTU

准备一字和十字螺丝刀,用来拆装Air-D780L1-Y和温湿度传感器;

DTU

准备一台烙铁和焊锡条,用于将USB数据线焊接到Air-D780L1-Y电路板上;

准备一台温湿度传感器,用来采集温湿度数据;

DTU

准备六根导线或者两面都是公头的杜邦线,用来给温湿度传感器供电以及连接Air-D780L1-Y和温湿度传感器;

DTU

准备一台可以输出10到30V的直流稳压电源,用来给Air-D780L1-Y和温湿度传感器供电;

DTU

四、组装硬件环境

使用螺丝刀将Air-D780L1-Y整机背面的四个螺丝拆下来,打开外壳;

插入可以上网的SIM卡;

找到Air780E模组下方的VB、DM、DP、GND四个焊点,将USB数据线焊接到这四个焊点上;

如下图所示:

DTU

使用两根导线将温湿度传感器和Air-D780L1-Y通过RS485接口相连,注意是A连接A,B连接B;如下图所示:

DTU

使用四根导线分别引出温湿度传感器和Air-D780L1-Y的供电+和-,温湿度传感器的供电电压范围是10到30V,Air-D780L1-Y的供电电压范围是5到36V,所以将直流稳压电源的电压调节为10到30V即可,我这里调节的是12V,然后同时给温湿度传感器和Air-D780L1-Y供电,如下图所示:

DTU

如果你完全按照以上步骤组装,到这里就应该一切妥当了,可以再次对照上面这张图片,看看是否组装正确。

 五、准备软件环境

5.1 Luatools工具使用

  要想烧录代码,先要下载合宙的强大的调试工具:Luatools;

使用方法:合宙Luatools实战宝典:功能介绍+使用技巧全攻略-CSDN博客

  如果你已经安装使用过Luatools,可以直接跳过本小节;

  Luatools下载地址为:https://doc.openluat.com/wiki/52?wiki_page_id=5071 ,如下图所示:

DTU

  Luatools 工具主要有如下几个功能:

  (1) 自动从合宙服务器获取最新的合宙LuatOS-iRTU固件和标准模组固件;

  (2) 烧录固件和脚本;

  (3) 查看和保存模组的USB口或者串口运行日志;

  (4) 简单的串口调试;

Luatools 下载之后,无需安装,解压到你的硬盘,点击 Luatools_v2.exe 运行,出现如下界面,就代表 Luatools 安装成功了(注意:运行Luatools后,会自动更新最新资源和版本文件,这时,你可以喝口水,耐心等待它更新完成):

DTU

5.2  LuatOS-iRTU固件

  LuatOS-iRTU固件,是合宙采用LuatOS架构自主研发的DTU嵌入式软件系统,已经被众多DTU厂商采用,经过百万级装机设备的验证,稳定可靠,广泛应用于物联网领域的各行各业;可以通过以下任何一种方式获取这个固件:

访问:https://gitee.com/openLuat/luatos-irtu/releases ,下载最新发布的文件名后缀是EC618.soc 的即可,例如下图中红框选中的文件.

DTU

     2.   打开Luatools,点击 菜单 1 LuatOS -> 1.2 资源目录 ->1.2.1 Core固件目录;

            找到LuatOS_iRTU_Air780E目录,从里面找最新版本的soc文件即可;

DTUDTU

5.3   DTU管理系统

DTU管理系统,可以在线绑定你的DTU设备,对设备进行分组,对每个组内的所有设备配置运行参数(例如,连接什么服务器,多久上传一次数据,上传什么格式的数据);

如果你已经使用过DTU管理系统,可以跳过本小节;

访问 dtu.openluat.com ,如果你已经有 dtu.openluat.com 或者 iot.openluat.com 的账号,

可以直接使用这两个账号中的任何一个账号登录,

如果没有账号,点击下图中的 立即注册 按钮注册一个账号; 

DTU

5.3.1、 在DTU管理系统中创建分组

此时,你已经拥有了一个DTU管理系统的账号,登录 dtu.openluat.com 之后,第一个界面大概是下面这个样子:

DTU

 点击左边菜单,设备管理->分组管理,打开如下界面:

DTU

看到这里,你可能会有疑问:这里的分组是做什么用的呢?

其实你可以把分组理解为项目,假设你的DTU管理系统账号下有100个设备,这100个设备中:50个设备是智慧农业灌溉项目,50个设备是气象站项目;
 

这时你就需要创建两个分组,分别对各自的50个设备进行管理。

在这个演示项目中,我使用的是Air-D780L1-Y整机采集温湿度数据,然后上传到合宙业务云平台,所以我按照下图提示,点击右上方的 添加分组 按钮,新建一个 Air-D780L1-Y_合宙业务云平台_温湿度数据采集 的分组:

DTU

5.3.2  在DTU管理系统中绑定设备并且分组

创建好 Air-D780L1-Y_合宙业务云平台_温湿度数据采集 的分组之后,接下来要做的是把你的设备IMEI添加到这个分组中;

5.3.3   查询设备IMEI是否在你的账号下

在添加IMEI到分组之前,首先要保证这个IMEI在你的账号下;

怎么查询IMEI是否在你自己的账号下呢?

点击左边菜单,设备管理->设备列表,打开如下界面:

DTU

在这个界面中,输入你的设备的IMEI,然后点击搜索按钮进行查询;

如果你不知道你的Air-D780L1-Y的IMEI,参考以下两种方法:

1、Air-D780L1-Y外壳上如果有IMEI号,直接使用;

2、如果已经拆掉外壳,直接使用板子上Air780E模组标签上的IMEI号;

如果设备IMEI不在你的账号下,直接调过本小节剩余内容;

如果设备IMEI在你的账号下,参考下图,将设备划分到你期望的分组中,从5.3.1 章节继续阅读;

DTU

5.3.4  自助绑定并且分组设备IMEI到你的账号下

我演示使用的Air-D780L1-Y的IMEI是864710071339591,在我的设备列表下,没搜索到这个设备;

5.3.5  下载自助绑定和分组的专属固件

不要灰心,接下来教你一种自助绑定并且分组设备到你账号下的方法,点击 设备管理->IMEI与DTU账号绑定,按照下图操作:

DTU

点击 固件生成 按钮之后,耐心等待一会儿,后台在自动生成固件,大概20秒以内,就可以生成好并且下载成功,我这里下载下来是一个压缩包
 

DTU

解压之后,里面有以下文件
 

DTU

我们本次演示使用的是Air-D780L1-Y整机,所以要选择后缀是EC618.soc的那个文件,也就是iRTU_1.0.5_LuatOS-SoC_V1108_EC618.soc
 

(此处注意:你操作时只需要认准EC618.soc的后缀就行,和我这里的文件名不一定完全一致);
 

六、使用Luatools将专属固件烧录到Air-D780L1-Y中

准备好iRTU_1.0.5_LuatOS-SoC_V1108_EC618.soc固件后,
 

接下来请再次打开合宙强大的调试工具Luatools,使用Luatools将这个固件烧录到Air-D780L1-Y中,
 

此时再来看下之前已经组装好的硬件环境,将已经焊接到Air-D780L1-Y上的USB数据线,插入到电脑的USB口中,直流稳压电源上电(注意此处设置的是12V输出)。

DTU

如果电脑的设备管理器中新增3个端口,表示Air-D780L1-Y已经正常开机,并且USB数据线通信正常
 

DTU

接下来我们就要使用Luatools将固件烧录到Air-D780L1-Y中,
 

烧录之前Air-D780L1-Y需要先进入boot模式,先给直流稳压电源断电,
 

然后一直按下Air-D780L1-Y板子上的BOOT按键,再给直流稳压电源上电,
 

此时电脑的设备管理器中如果新增了1个端口,而不是之前的3个端口,
 

则表示已经进入了boot模式。
 

(注意:boot模式会持续20秒左右,如果20秒内没有发起烧录固件的工作,会自动退出boot模式;此时如果还要烧录固件,重新操作进入boot模式)
 

DTU

打开Luatools后,按照下图配置并且选择要烧录的固件文件: 

DTU

在最后一步点击 下载 按钮时,要确保Air-D780L1-Y仍然处于boot模式,如果开始下载,下载界面如下图所示:

DTU

下载成功后的界面如下图所示:

DTU

七、Air-D780L1-Y自动重启并且自动完成设备的绑定和分组

下载成功后,Air-D780L1-Y会自动重启运行,部分运行日志和解析见下图所示:

DTU

此时我们再回到DTU管理系统,看看864710071339591的imei是否已经自动绑定并且自动分组

DTU

真香,果然已经成功了,恭喜你!

看完本小节,有老铁可能会问,为什么绑定设备这么麻烦呢?在这里请允许我解释几个问题:

1、为什么不让用户随便输入一个IMEI就能方便地绑定到自己的账号下呢?

这样风险很高,万一你把别人设备的IMEI绑定到你自己的账号下,岂不是乱套了?

2、如果我有批量的设备需要绑定,怎么处理呢?

无论你有多少台设备,都有两种绑定方法:

(1) 参考本小节,采用烧录定制固件的方式自助绑定;这种方法适用于设备数量较少的场景;

(2) 找到合宙人员,告知你需要绑定的设备IMEI,合宙人员会核实这些IMEI是否属于你,如果核实通过,合宙人员在后台帮你绑定到你的账号下;这种方法适用于所有场景,尤其是设备数量很多的场景;

八、给设备烧录通用的LuatOS-iRTU固件

参考5.3.4 章节下的 使用Luatools将专属固件烧录到Air-D780L1-Y中 小结,
 

将 5.2 LuatOS-iRTU固件 章节中准备的通用LuatOS-iRTU固件
 

(我这里的固件名是iRTU_1.0.6_LuatOS-SoC_V1110_EC618.soc,你烧录时,使用最新版本的固件就行),烧录到Air-D780L1-Y中。

烧录成功后,Air-D780L1-Y自动运行,Luatools的日志界面如下

DTU

出现这个提示,说明你的设备在DTU管理系统中没有配置任何运行参数,不会连接你期望的业务云平台,也没有和具体项目有关的任何业务逻辑;

这一切都要靠在DTU管理系统中对分组进行配置参数实现。

九、配置运行参数

在DTU管理系统中,点击下图中的参数配置

DTU

参数配置的总体页面如下

DTU

接下来将根据本项目的具体业务逻辑,来配置参数

9.1   基本参数

DTU

9.2  串口参数

DTU

9.3  网络通道参数

DTU

9.4  预置信息

DTU

GPIO,GPS的参数是默认配置,不用修改

9.5  数据流

DTUDTU

发送数据流模板代码

 

function--数据流固定格式
        if not _G.s_report_interval then _G.s_report_interval = 5 end
        if not _G.s_485_read_interval then _G.s_485_read_interval = 0 end
        
        _G.s_485_read_interval = _G.s_485_read_interval+5
        
        if _G.s_485_read_interval<  _G.s_report_interval then return nil end
        
        
    --将串口接收的数据赋值给str
    local str= ...
    local addr = str:sub(1, 1)--地址位
    local fun = str:sub(2, 2)--功能码
    local byte = str:sub(3, 3)--有效字节数
    local humi =str:sub(4,5)--湿度值
    local temp = str:sub(6,7)--温度值
    local idx, crc = pack.unpack(str:sub(-2, -1), "H")
    local tmp = str:sub(1, -3)
    --crc校验原理前面所有位合起来校验后的值等于上报的数据的最后校验位
    if crc == crypto.crc16("MODBUS", tmp) then
        log.info("crc校验成功")
        -- _无用,addr地址码,fun功能码,byte返回有效字节数,humi湿度,temp温度
        -- pack.unpack 将lua字符串分解为不同的数值
        -- "  >b3h2"表示在tmp字符串中,从tmp第一个字节开始,取三个字节,取两个短整数
        local _,addr,fun,byte,humi,temp = pack.unpack(tmp, "  >b3h2")
        --如果功能码为0x03,则为读取温湿度值
        if fun == 0x03 then
            --给表中添加一个叫做humi的元素,并将上文中的humi变量的值赋给该元素
            humi = humi/10 --pack.unpack后已经将该数转换成了十进制的整数,需要将其除以10才是真实的湿度百分比数
            --给表中添加一个叫做temp的元素,并将上文中的temp变量的值赋给该元素
            temp =temp/10 --pack.unpack后已经将该数转换成了十进制的整数,需要将其除以10才是真实的温度值
                        log.info("温湿度",humi,temp)                        
        end
                
                local la,ln = create.getRealLocation()
                if la==nil or la=="" then la = "31.131710" end
                if ln==nil or ln=="" then ln = "121.548860" end
                log.info("la,ln",la,ln,tonumber(la),tonumber(ln))
                
                if not fake_la then fake_la = 31.131710 end
                if not fake_ln then fake_ln = 121.548860 end
                
                
                
                
                local payload =
                {
                        location = {lat=tonumber(la),lng=tonumber(ln)},
                        --location = {lat=fake_la,lng=fake_ln},
                        temperature = temp,
                        humidity = humi,
                        pm2_5 = 16,
                        pm10 = 18,
                        interval = "INTERVAL_".._G.s_report_interval.."S",
                        switch_state1 = "ON",
                        switch_state3 = "ON",
                        brightness1 = 10,
                        brightness2 = 20,
                        work_mode = "WARM"
                }
                
                _G.s_485_read_interval = 0
                fake_la = fake_la+0.0002
                fake_ln = fake_ln+0.0002
                        
                --将该表转换成json格式的字符串并发送给服务器
                return json.encode(payload)
                        
    else
    --如果crc校验失败则将"crc error"发送给服务器
        log.info("crc校验失败")
        return nil
    end
end--数据流固定格式

 

接收数据流模板代码

 

function
        local str=...
        
        log.info("recv",str)

        if str:sub(1,22)=='{"interval":"INTERVAL_' then
                local interval = str:match("(%d+)")
                log.info("interval",interval)
                _G.s_report_interval = tonumber(interval)
        end
        
        if str:sub(1,17)=='{"method":"reset"' then
                sys.restart("server control")
        end

        return str,1  -- 返回值

end

 

9.6 预警

默认配置,不用修改

9.7  任务

DTU

任务1代码

 

function 
gpio.setup(22,1)--打开485转TTL电平芯片的供电
end

 

9.8  重要提醒

所有参数配置结束之后,记得点击右下角的确认按钮,否则不会生效!!!

所有参数配置结束之后,记得点击右下角的确认按钮,否则不会生效!!!

所有参数配置结束之后,记得点击右下角的确认按钮,否则不会生效!!!

9.9  在合宙业务云平台配置项目和设备参数

因合宙业务云平台目前不对外开放,只能由合宙技术人员使用,所以此处省略很多内容:

需要使用合宙业务云平台的用户,可以再仔细看下本文档中心的1.2和1.5章节。

十、重启设备,下载最新参数,验证运行逻辑

此时你可以直流电源断电再上电重启下Air-D780L1-Y;

或者通过Luatools的重启按钮重启下设备

DTU

设备重启后,会自动连接DTU管理系统,下载最新参数,然后安排参数的配置逻辑进行;

Luatools中的运行日志如下

DTU

此时你可以通过​:‍⁠​‬​‍⁠‌​​​‌‍‌​‬​​​⁠‍​⁠​​​​​​‬​‍​​‬‬​‍‌​​​​​合宙DTU整机产品线文档中心

​可以体验小程序

动态演示效果见以下动画:

DTU

更多详细资料详见:‍⁠​‬​‍⁠‌​​​‌‍‌​‬​​​⁠‍​⁠​​​​​​‬​‍​​‬‬​‍‌​​​​​合宙DTU整机产品线文档中心

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分