本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

使用 LoRaWAN 设置您自己的远程气象站

发布时间:2022-06-04
分享到:

使用 LoRaWAN 设置您自己的远程气象站

发布时间:2022-06-04
分享到:

在LoRaWAN区块链网络上测量温度、湿度、压力、光照强度、降雨量、颗粒物、风速和风向。

为什么要建立一个气象站在LoRaWAN网关上运行
由于数据成本和基础设施的原因,为远程位置收集天气数据一直非常昂贵。但是,通过 LoRaWAN 远距离覆盖,我们可以将 LoRaWAN 热点安装在更容易到达的区域,并将气象站安装在远离热点的地方。在这个项目中,我将向您展示如何使用 Seeed SenseCAP S900 气象站以及 Dragino RS485 到 LoRaWAN 转换器来进行远程气象站设置。

补给品

硬件组件

  • Seeed Studio SenseCAP ONE S900 9 合 1 紧凑型天气传感器×    1    
  • Dragino RS485-LN RS485 / Modbus 到 LoRaWAN 转换器×    1    
  • Seeed Studio Seeed SenseCAP M1 LoRaWAN 网关×    1    
  • LoRaWAN网关的预配置气象站(预配置的套件可作为前两个必需组件的替代品)×    1    

软件应用程序和在线服务

  • Putty
  • SenseCap One 配置工具
  • LoRaWAN 控制台
  • TagoIO

配置 SenseCAP S900 一体化气象站

1.通过USB线连接

如下图所示,使用四分之一取下 S900 底部的保护盖。在 S900 和您的计算机之间连接提供的 USB-C 电缆。

2. 使用 SenseCap One 配置工具配置 S900

从 GitHub 下载适当版本的 SenseCAP One 配置工具。一旦下载。打开程序并选择正确的串口。

选择“9600”作为波特率,然后按“连接”,如下图所示。连接后,您将能够看到所有当前传感器读数。最终,我们希望通过 LoRaWAN 网络远程读取这些值,而无需连接到气象站!

为了通过 LoRaWAN 网络传输所有这些数据,我们将使用 Dragino RS485 到 LoRaWAN 转换器。S900 允许我们更改其设置以与 RS-485 转换器配合使用。为此,请在配置工具主页中选择“设置”,您将看到以下页面。选择“从设备读取”以获取气象站的所有当前设置。填写完所有字段后,将“主端口协议”更改为“RS-485 Modbus RTU”,然后将“Modus 地址”设置为“1”,最后将“Modbus 波特率”设置为“9600”。将其他所有内容保留为默认值。选择“写入设备”以保存新的设置更改。

配置 Dragino RS485 到 LoRaWAN 转换器

1.设置腻子

下载并启动 PUTTY。启动 PUTTY 时,您应该看到以下屏幕

选择左栏中的“终端”,然后为“本地回波”和“本地行编辑”选择“强制开启”。此时不要按“打开”

选择左侧栏中的“会话”。将“连接类型”设置为“串行”,将“速度”设置为“9600”。在“Serial line”下填写正确的 COM 端口,然后按“Open”。

2.添加采样命令

RS485-LN 最多可存储 15 条 Modbus 采样命令。为了从气象站请求数据,请将以下 Modbus 命令添加到 RS485-LN。这些命令必须完全按照 PUTTY 所示输入,才能与提供的解码器一起正常工作。

获取环境温度的命令

AT+COMMAND1=01 04 00 00 00 02,1

命令获取空气湿度

AT+COMMAND2=01 04 00 02 00 02,1

获取气压的命令

AT+COMMAND3=01 04 00 04 00 02,1

获取光照强度的命令

AT+COMMAND4=01 04 00 06 00 02,1

获取最小风向的命令

AT+COMMAND5=01 04 00 08 00 02,1

 命令获取最大风向

AT+COMMAND6=01 04 00 0a 00 02,1

命令获取平均风向

AT+COMMAND7=01 04 00 0c 00 02,1

获取最小风速的命令

AT+COMMAND8=01 04 00 0e 00 02,1

获取最大风速的命令

AT+COMMAND9=01 04 00 10 00 02,1

命令获取平均风速

AT+COMMANDA=01 04 00 12 00 02,1

命令获取累积降雨量

AT+COMMANDB=01 04 00 14 00 02,1

获取降雨持续时间的命令

AT+COMMANDC=01 04 00 16 00 02,1

命令获取降雨强度

AT+COMMANDD=01 04 00 18 00 02,1

获取最大降雨强度的命令

AT+COMMANDE=01 04 00 1a 00 02,1

3.添加处理命令

上面有 15 个“AT+DATACUTx”插槽对应 15 个“AT+COMMANDx”。这些数据切割提供了一种从开销中过滤掉实际数据的方法。RS485-LN 还使用数据切割来组装有效载荷以通过 LoRaWAN 发送。

使用 PUTTY 将以下数据剪切命令发送到 RS-485 转换器,一次只发送一条线。

AT+DATACUT1=9,2,4~7
AT+DATACUT2=9,2,4~7
AT+DATACUT3=9,2,4~7
AT+DATACUT4=9,2,4~7
AT+DATACUT5=9,2,4~7
AT+DATACUT6=9,2,4~7
AT+DATACUT7=9,2,4~7
AT+DATACUT8=9,2,4~7
AT+DATACUT9=9,2,4~7
AT+DATACUTA=9,2,4~7
AT+DATACUTB=9,2,4~7
AT+DATACUTC=9,2,4~7
AT+DATACUTD=9,2,4~7
AT+DATACUTE=9,2,4~7

4.拆分有效载荷传输配置

由于一次传输处理的字节太多,我们必须使用以下命令启用拆分有效负载:

AT+DATAUP=1

5. 组装有效载荷

LoRaWAN 有效负载由 RS485-LN 使用从 DATACUTx 返回的所有数据自动组装。由于我们使用的是拆分有效负载,因此有效负载具有以下结构:

PAYVER + 有效负载指数 [0] + DATACUT1 + DATACUT2

PAYVER + 有效负载指数 [6] + DATACUTD + DATACUTE

PAYVER 的默认值为 0x01,但它可以上升到 0x0f 以适应网络上更多的 RS485-LN。

将 Dragino RS485 到 LoRaWAN 转换器添加到氦网络

1. 注册 Helium 控制台帐户

我们将使用 Helium 网络作为我们的 LoRaWAN 网络提供商,因为它们的网络覆盖范围广且费用低。你可以在这里查看更多关于它们的信息。

为了从 Helium LoRaWAN 网络接收数据,我们将在这里创建一个 Helium 控制台帐户。创建帐户并登录后,您将看到以下页面:

2. 添加数据信用

每个新的 Helium 控制台帐户都附带 10,000 个数据积分,这将为气象站提供大约 2 个月的数据。但是,如果您想添加更多,请将鼠标悬停在屏幕右上角的 DC 余额上,然后单击“DC 余额”,这将带您进入以下屏幕。使用信用卡购买的最低金额为 10 美元,这将为您提供大量用于气象站的数据信用。

3. 将Dragino RS485 to LoRaWAN转换器添加到氦网络

选择左栏中的“设备”,然后选择“添加新设备”。每个 Dragino RS485 转换器都附带一张包含 Dev EUI、App EUI 和 App Key 的表格。为您的设备输入一个名称并填充 Dev EUI、APP EUI 和 App Key。完成后,继续“保存设备”。

4. 添加有效载荷解码器

选择左栏中的“功能”,然后选择“添加新功能”。将所有字段设置为如下所示。

将以下函数复制并粘贴到自定义脚本框中

function Decoder(bytes, port) {

    var payload_index = bytes[2];
    var decoded_frame ={};
    //Payload index of 0 contains air temperature (C) and air humidity (%)
    if (payload_index == 0) 
    {
      decoded_frame.Air_Temperature = (bytes[3]<<24 | bytes[4]<<16 | bytes[5]<<8 | bytes[6])/1000;
      decoded_frame.Air_Humidity = (bytes[7]<<24 | bytes[8]<<16 | bytes[9]<<8 | bytes[10])/1000;
    }
    //Payload index of 1 contains barometric pressure and light intensity (Lux)
    else if (payload_index == 1)
    {
      decoded_frame.Barometric_Pressure = (bytes[3]<<24 | bytes[4]<<16 | bytes[5]<<8 | bytes[6])/1000;
      decoded_frame.Light_Intensity = (bytes[7]<<24 | bytes[8]<<16 | bytes[9]<<8 | bytes[10])/1000;
    }
    //Payload index of 2 contains minimum wind direction (degree) and maximum wind direction (degree)
    else if (payload_index == 2)
    {
      decoded_frame.Min_Wind_Direction = (bytes[3]<<24 | bytes[4]<<16 | bytes[5]<<8 | bytes[6])/1000;
      decoded_frame.Max_Wind_Direction = (bytes[7]<<24 | bytes[8]<<16 | bytes[9]<<8 | bytes[10])/1000;
    }
    //Payload index of 3 contains average wind direction (degree) and minimum wind speed (m/s)
    else if (payload_index == 3)
    {
      decoded_frame.Avg_Wind_Direction = (bytes[3]<<24 | bytes[4]<<16 | bytes[5]<<8 | bytes[6])/1000;
      decoded_frame.Min_Wind_Speed = (bytes[7]<<24 | bytes[8]<<16 | bytes[9]<<8 | bytes[10])/1000;
    }
    //Payload index of 4 contains maximum wind speed (m/s) and average wind speed (m/s)
    else if (payload_index == 4)
    {
      decoded_frame.Max_Wind_Speed = (bytes[3]<<24 | bytes[4]<<16 | bytes[5]<<8 | bytes[6])/1000;
      decoded_frame.Avg_Wind_Speed = (bytes[7]<<24 | bytes[8]<<16 | bytes[9]<<8 | bytes[10])/1000;
    }
    //Payload index of 5 contains accumulated rainfall and accumulated rainfall duration
    else if (payload_index == 5)
    {
      decoded_frame.Accumulated_Rainfall = (bytes[3]<<24 | bytes[4]<<16 | bytes[5]<<8 | bytes[6])/1000;
      decoded_frame.Accumulated_Rainfall_Duration = (bytes[7]<<24 | bytes[8]<<16 | bytes[9]<<8 | bytes[10])/1000;
    }
    //Payload index of 6 contains rain intensity and maximum rain intensity
    else if (payload_index == 6)
    {
      decoded_frame.Rain_Intensity = (bytes[3]<<24 | bytes[4]<<16 | bytes[5]<<8 | bytes[6])/1000;
      decoded_frame.Max_Rain_Intensity = (bytes[7]<<24 | bytes[8]<<16 | bytes[9]<<8 | bytes[10])/1000;
    }
    //Payload index of 7 contains PM2.5 and PM10 data
    else if (payload_index == 7)
    {
      decoded_frame.Pm2_5 = (bytes[3]<<24 | bytes[4]<<16 | bytes[5]<<8 | bytes[6])/1000;
      decoded_frame.Pm10 = (bytes[7]<<24 | bytes[8]<<16 | bytes[9]<<8 | bytes[10])/1000;
    }
    return decoded_frame;
}

完成下一节后,我们将继续设置 Helium 控制台。

为数据可视化设置 Tago.IO

1.注册Tago.IO账号

在本指南中,我们将使用Tago显示来自 Helium 的所有数据。在 Tago 注册一个免费帐户,登录后,您将看到以下屏幕。

2.添加新设备到Tago

选择左上角的“设备”,然后选择“添加设备”。

选择“LoRaWAN Helium”,然后选择“Custom Helium”,如下图所示。

选择“自定义LoRaWAN”后,将出现以下屏幕。为您的气象站命名,并将“数据存储类型”设置为“设备数据优化”。对于数据保留,设置您希望 Tago 保留数据的理想时间范围。在本例中,我们将其设置为一个月。使用您在将 Dragino RS485 转换器添加到 Helium 控制台时使用的 Dev EUI 填写 EUI 字段。完成后,按“创建我的设备”,

3. 将气象站仪表板添加到 Tago

使用以下链接将气象站仪表板自动安装到您的 Tago 帐户。出现提示时选择“安装模板”,如下图所示。

选择您之前添加的设备名称。就我而言,我将该设备命名为“RS485”,因此我从下拉菜单中选择了该选项。完成后选择“确认关联”。

4. Helium 控制台添加 Tag 授权

此时,您将在主页上看到新创建的仪表板。但是,仪表板应该是空的,因为我们尚未将 Tago 帐户链接到我们的 Helium 控制台帐户,因此您尚未获得任何数据。为此,请在右上角选择您的个人资料名称,然后选择“我的帐户”

在左侧选择您的个人资料名称,然后单击“令牌”,将权限设置为“完整”和永不过期,然后单击“生成令牌”。要复制您的令牌,请单击复制符号,如下所示。

现在重新登录到您的 Helium 控制台帐户,单击左侧栏中的“集成”,然后添加 TagoIO。

将您新创建的 Tago 令牌粘贴到下面的步骤 2 框中。

5.流程图

最后,我们到了最后一步。这一步将把我们之前所做的一切联系在一起,让您可以在 TagoIO 上查看所有气象站输出。

在 Helium 控制台中,单击“Flows”,然后添加以下项目并将它们连接在一起。在我们的例子中,我们将添加气象站、气象站解码器功能和 TagoIO 授权。

TagoIO 仪表板可视化

恭喜,你现在完成了!返回到您的 Tago 仪表板,随着更多数据的出现,所有数据字段都会被填充!

相关代码点击下载

* 以上内容翻译自网络,原作者:Parley Labs 团队:MinhV,Bryan Bui-Tuong,如涉及侵权可联系删除。 

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论