×

氦水质监测仪开源分享

消耗积分:2 | 格式:zip | 大小:5.89 MB | 2022-12-15

吕钢格

分享资料个

描述

我们会做什么?

一种用于测量饮用水质量的 LoRaWAN 设备,可在大范围内部署。

一些设计注意事项:

  • 电池寿命一年。
  • 防风雨耐用。
  • 每小时测量基本水质指标。

问题

水质测量成本高昂,获取、存储和处理数据的后勤工作很复杂。您要测量的地方通常是偏僻的。硬件选项包括某种蜂窝设备,但这是一个相对较高的初始成本加上设备生命周期内的经常性成本。

那么解决方案是什么?

Helium正在美国和加拿大推出 LoRaWAN 网络。它将通过使用他们所谓的热点来提供大范围的覆盖区域(检查您所在区域的覆盖范围)。用 LoRa 的说法,这些是 LoRaWAN 网关或集中器。他们正在为我们的传感器数据提供传输。假设您有覆盖范围,那么建立这样一个广域网的大量艰苦工作已经为您完成。如果您没有覆盖范围,您可以设置自己的热点。运行它是有动机的,因为您为通过的每个信息包赚取一定数量的钱。

至于水质测量,我们将使用的传感器也已经简化了。

但是什么是 LoRaWAN?

LoRa是物理层,提供长距离通信,占用 OSI 层1。LoRaWAN是一种通信协议(OSI 层 2 和 3)。它使用 LoRa 层提供两种无线通信方式。为什么没有无线网络?因为 WiFi 最多只能走几百米(最多),而 LoRa 可以走几公里(几百公里)。

好的,听起来很棒。现在怎么办?

是时候在这里发表免责声明了。我拥有μFire LLC。我们制造水传感器并提供 InfluxDB 托管。毫不奇怪,这些就是本文将使用的设备和服务。制作这些小设备是我工作的一部分。

让我们做出一些设计选择。

我们需要一个微控制器。Heltec Automation制作了一系列与 LoRaWAN 兼容的基于 ESP32 的开发板。我喜欢Wireless Stick Lite ,所以我们将在这个项目中使用它。

它有:

  • 板载锂电池充电/液位读取硬件
  • WiFi、BLE 和 LoRaWAN 接口
  • 低功耗设计
  • 用于为传感器供电的可控电源引脚
  • 兼容 Arduino

我们需要一些水传感器。该项目将使用:

把事情放在一起

μFire 传感器均使用Qwiic / STEEMA QT I2C 连接器。所以这一步非常简单。Heltec 板上,将蓝色线连接到引脚 32,黄色连接到 33,黑色连接到接地引脚,红色连接到 Vext 引脚。

在我们继续之前,快速解释一下引脚以及它们是如何选择的。黑色接地引脚没有什么特别之处,Heltec 板上有一些可供使用。红线是电源,蓝色和黄色引脚是 SDC 和 SCL。在 ESP32 上,您可以为 I2C 总线选择任意两个引脚,所以我选择了 32 和 33,因为它们没有用于其他任何用途。红线连接到 VExt 引脚。

什么是 Vext 引脚?它是控制器可以打开和关闭的电源引脚。这对于电池设备来说非常有用,因为您可以将其关闭,并且连接的传感器根本不会消耗任何电力。然后,当您想要一些读数时,您将其重新打开。

无论如何,现在只需将 Heltec 板连接到 EC 或 ISE 板,然后以相同的方式连接其他两个板。最后要连接的是温度传感器。它可以连接到任何板,但对于这个项目,它将连接到 EC 板。它只是一个带键的推入式连接器。

 

 
 
 
poYBAGOX-PKASpoEACBNERq4xEA802.jpg
 
1 / 2Qwiic
 

我们现在剩下一堆传感器,它们以菊花链的形式连接到 Heltec 板上,放在桌面上。我们希望它能够坐在外面,靠近水,所以这是行不通的。让我们把它放在一个盒子里。

做一个外壳

对于这个项目,我将使用Bud Industries塑料盒。我们需要在盒子的侧面钻一些孔来安装传感器。为此,我们需要一个 9 mm fortsner 钻头。为什么会有这样一个奇怪的特定命名的钻头?因为它在您钻探外壳中使用的软、低熔点塑料时起作用。如果你用铲子钻头,你会弄得一团糟。一个木头钻头会到处乱跳,即使你认为自己钻了一个导向孔很聪明。

我用来获得良好且可重复的结果的方法是在 Inkscape 中制作大纲。快速计算一下,在我们的例子中,我们将为 EC 钻一个孔,为 pH 钻一个孔,为 ORP 钻一个孔,为温度传感器钻一个孔。我要安装所有这些东西的一侧是 119 毫米长,所以将其除以 4,孔之间的距离约为 30 毫米。

做一些 Inkscaping,你可能会得到这样的结果:

pYYBAGOX-PqAV-BVAAAueV2wCnU517.png
一种制作均匀间隔孔的简单方法。
 

打印出来并将它贴在你的盒子上。在中间戳一个小洞,用记号笔做记号,然后钻出来。小心,慢慢地,并施加最小的压力,否则你会熔化或碎裂塑料。如果您在钻孔时感到非常无聊并且不要弄得一团糟,您就会知道自己做对了。

 

poYBAGOX-QOAXf47AAEf2XBHOsQ835.jpg
 

 

希望事情进展顺利,您最终会得到一个带有计划孔的外壳,而不是一些昂贵的塑料块。

 

poYBAGOX-QeARpRbAAGZULtz3kg524.jpg
 

 

使用随附的垫圈、六角螺母和垫圈安装传感器。从外壳移出时,垫圈应在内部接触外壳,然后是垫圈,然后是外部的六角螺母。这将确保垫圈紧紧地压在外壳上,防止水进入。

温度传感器不同。我们将使用PG7 电缆密封套确保你得到一些包括密封垫圈的东西。

将连接电池的 Heltec 板扔进去。您可以使用双面胶带、魔术贴或一些安装螺钉固定它们。保持它与 USB 电缆连接,以便以后对其进行编程。

 

pYYBAGOX-QmASO5BAAClPv_DKrE684.jpg
 

 

InfluxDB 和 Chronograf

InfluxDB 是一个时间序列数据库。它易于使用,是传感器测量存储的理想选择。它还非常方便地附带了一个名为 Chronograf 的集成图形组件。使用这两者,您可以记录传感器信息,然后以任何您想要的方式显示它。对于这个项目,我们将使用 μFire Net 来为我们处理这一切。

如果您愿意,可以自行设置。这个项目使用 InfluxDB 版本 2,它与版本 1 有很大不同。如果你走这条路,你还需要一个 MQTT 服务器。

无论如何,μFire Net将为您设置该项目所需的一切。您不需要对最初提供的设置进行任何更改,但您需要一些信息

  • 地址:所有这些都存在的网站地址。
  • 组织:当您最初登录时,您将设置此项。不要使用空格,因为它会导致其他软件出现问题。
  • 存储桶:登录后,转到侧面菜单并选择加载数据/存储桶。单击右上角的创建存储桶并记住您给它的名称。对于这个项目,我调用了我的wq
  • Token :制作bucket后,需要制作token。从菜单中,单击加载数据/令牌,然后单击生成。您在这里有几个选项,对于最安全的令牌,创建一个仅对您创建的存储桶具有读/写访问权限的令牌。

氦气设置

接下来要设置的是氦气方面。您需要创建一个Helium 控制台帐户。

单击左侧的集成链接,然后在添加自定义集成部分中选择 MQTT。

pYYBAGOX-QuAdJOiAAAuR3Jdia4085.png
这是在氦控制台内。
 

向下滚动一点,您会看到标题为Step 2的部分

poYBAGOX-RCASxF5AAA8fNzc2fI200.png
 

这是您需要输入 MQTT 服务器信息的地方。对我来说,我使用的 μFire Net 帐户是 awesome.ufire.net。我的端点线如下所示:

mqtts://awesome:password@awesome.ufire.net:8883

对于主题部分,放入helium

这一步所做的是告诉 Helium 每次从我们的设备接收到消息时发送一条 MQTT 消息。在下一步中,我们将构建一个小型 Python 脚本,该脚本将订阅相同的 MQTT 服务器和主题,解析信息,并将其插入到我们的 InfluxDB 中。

现在转到设备页面并单击添加设备。

pYYBAGOX-R6ADqVwAABCiQiLy40087.png
 

选择任何名称。Dev EUI、App EUI 和 App Key 是自动生成的,是您稍后需要几个步骤才能输入 Arduino 草图的信息位。

接下来是创建一个标签,因此转到标签页面并单击添加标签,给它起任何您想要的名称,然后在第 2 步中,选择您创建的 MQTT 集成的名称。然后单击创建标签和管理。

pYYBAGOX-SCARMpVAAAv7kwJ6og579.png
 

在打开的下一个屏幕上,单击右上角的将此标签添加到设备。在列表中检查您的设备,然后检查集成。这会将集成连接到设备。

MQTT 网桥

信息流是这样的:

1. 我们的设备将发送传感器测量值

2. Helium Hotspot 将接收它们并将它们发送到他们的服务器。

3. 在服务器上,它会查看配置了哪些集成。在我们的例子中,它会在我们的服务器上发布一条带有大量信息的 MQTT 消息。它被编码了,我们还不能用它做任何事情。

4. 一个 python 脚本也将订阅到我们的 MQTT 服务器,监听这些消息。它将对其进行解码,然后将其插入到我们的数据库中。

您需要安装一些软件包才能运行此脚本。

pip3 install influxdb-client
pip3 install msgpack
pip3 install paho-mqtt

influxdb-client是官方的 InfluxDB Python 客户端库。

msgpack有点像 JSON,但是是二进制的。他们有一个很好的网站,比我能更好地解释它。我选择使用 MsgPack 而不仅仅是二进制包对传感器数据进行编码,因为它允许您将数据与源解耦。如果您只是发送二进制打包有效负载(想想 [4 byte float]-[4 byte long]-[4 byte uint32]),那么您需要知道双方,这些字节代表什么。使用 MsgPack,我们可以发送一条 JSON 格式的消息,如下所示:

{"batt":3.7,"ec_uS":500}

然后我们可以在我们的 MQTT 脚本中对其进行解码并得到相同的东西,而不仅仅是一堆随机字节。它不仅仅是二进制信息,但我认为权衡是值得的。

paho-mqtt是我正在使用的 MQTT 库。

将此要点复制到您的计算机上(或任何您想运行它的地方)。

您需要编辑几行。

ufire_server到你的 InfluxDB 服务器,我的线路看起来像awesome.ufire.net

mqtt_port到您的 MQTT 端口。我的是8883。

mqtt_username到您的 MQTT 用户名

mqtt_password您的 MQTT 密码

influx_bucket到 InfluxDB 存储桶,您应该从几步后记起

influx_token从几步后到你的 InfluxDB 令牌

从上面的influx_organization到您的 InfluxDB 组织名称

进行这些更改后,运行它:

python3 helium-influx-bridge.py

您可能有兴趣在后台运行它,请使用:

nohup python3 helium-influx-bridge.py &

该脚本是为基于 Linux 的系统编写的。如果你想在 Windows 上运行它,你需要修改SSL 证书路径。它还假设 MQTT 服务器与 InfluxDB 服务器相同,只是端口不同。

请记住,这需要始终运行,否则我们无法获得传感器测量结果。你可能想把它变成某处机器上的服务。

进入代码

该项目将基于 Arduino,因此如果您不喜欢使用我选择的微控制器,您可以将其切换到其他任何东西(如 TTGO LoRa32 或 Heltec CubeCell),只需少量代码更改。

首先,您需要在 Arduino IDE 中设置 Heltec 板。遵循Heltec 的指示氦气也有说明

接下来,获取 Heltec 的 LoRaWAN 库, 按照他们的说明进行操作您需要进行更改,因此请访问 Arduino 库目录中的 ESP32_LoRaWAN 文件夹。打开ESP32_LoRaWAN.cpp并更改以下行:

这个:

#define LORAWAN_DEFAULT_DATARATE                    DR_5

对此:

#define LORAWAN_DEFAULT_DATARATE                    DR_3

和这个:

channelsMaskTemp[0] = 0x00FF;
channelsMaskTemp[1] = 0x0000;
channelsMaskTemp[2] = 0x0000;
channelsMaskTemp[3] = 0x0000;
channelsMaskTemp[4] = 0x0000;
channelsMaskTemp[5] = 0x0000;

对此:

channelsMaskTemp[0] = 0xFF00;
channelsMaskTemp[1] = 0x0000;
channelsMaskTemp[2] = 0x0000;
channelsMaskTemp[3] = 0x0000;
channelsMaskTemp[4] = 0x0000;
channelsMaskTemp[5] = 0x0000;

这些更改会切换设备用于发送数据的频率和数据速率。

转到此Gist并将其复制/粘贴到 Arduino IDE 中的新项目中。

首先,您需要进行一些更改。

返回 Helium 的设备页面,找到您在几步前创建的设备。点击它,你会看到这个。

poYBAGOX-SKAOrv0AAA7x2YoEeQ949.png
 

如果单击小对角箭头,它将展开一长串数字。

pYYBAGOX-SWAAvbwAAAhzGakGsw861.png
 

确保您看到显示msb ,然后单击复制图标。将其复制到 Arduino 草图中作为DevEui[]的值。

对AppEui[]AppKey[]执行相同的操作

poYBAGOX-TeADDCYAAAyvdFhCtQ546.png
 

现在在“工具”菜单中选择一些东西。确保为 Board 选择“Wireless Stick Lite”,为 LoRaWAN Region 选择“REGION_US915”。

pYYBAGOX-UOAG9XbAAF2r-7bGFY893.png
 

上传草图并运行它。打开您的串行终端,您会看到一些关于访问网站并获取许可证密钥的信息。按照说明将输出粘贴到license[4]中。重新上传,您将看到设备加入 LoRaWAN 网络的一系列尝试。在事情取得进展之前,通常需要进行几次尝试。

设备连接后,您应该会在设备页面下的 Helium 控制台中看到一些活动。

pYYBAGOX-UaATSKsAAAdPVOzcto304.png
 

您应该会看到 MQTT 脚本的输出。

pYYBAGOX-UiAGQRFAAC2MBHp3tg434.png
 

现在我们可以设置 InfluxDB

InfluxDB 仪表板

现在有一些 InfluxDB 和 Chronograf 基础知识可以让您制作自己的仪表板。

Chronograf 由仪表板组织。仪表板是可视化的集合,称为单元格,您可以在网格中组织这些单元格。可视化可以是折线图、仪表、热图或其他一些。您可以自定义一些选项,然后将它们添加到仪表板。在仪表板中,您可以调整大小和移动它。

因此,首先,通过单击左侧的仪表板图标并单击右上角的创建仪表板来创建一个新仪表板。接下来,单击添加单元格。

这是你经常点击的地方。看看这张照片:

 

FROM 列表显示所有存储桶(数据库),然后您会看到一系列过滤器以获取您想要的数据。

  • 第一个过滤器选择我们感兴趣的记录集。在我们的 MQTT 桥中,我们称之为wq
  • 单击wq后,您可以看到wq的所有测量值,但请注意我是如何将第二个过滤器更改为eui的您可以为几个不同的设备使用相同的wq记录。在 LoRaWAN 术语中,EUI 是设备的唯一标识符,因此我们在 MQTT 步骤中添加了一个eui字段来做到这一点。我只有一个设备,所以我只有一个选择,但如果你有多个,你可以选择你想要测量的设备。
  • 在下一个过滤器中,您可以选择我们的设备进行的所有单独测量。
  • 单击提交,您将获得一个图表。

从这里,您可以单击自定义按钮并查看单元格外观的选项。当您满意时,单击绿色对勾,它将被添加到我们创建的仪表板中。

poYBAGOX-UyAXesNAABxx53ptEk951.png
 

您现在可以单击并拖放,直到获得您喜欢的东西。

pYYBAGOX-VCAagXUAADJZ9NTVRk650.png
 

您可以做一些简单的事情,您可以将仪表板拆分为:

  • 历史:带有过去几小时、几天或几周的图表
  • 即时:在仪表中显示最近的测量值
  • 车队状态:您还可以通过跟踪传感器的电池电量、RSSI 和 SNR 来监控传感器的健康状况。

在这一点上,我们完成了!

可选:添加显示

我们已经到了我们的堆栈可以正常工作的地步,并且我们有一个最小的可行产品。虽然有一些简单的补充。让我们添加一个屏幕,这样我们就可以查看我们的盒子并查看测量结果。

由于我们要使用电池供电,因此电子纸显示器是最佳选择。它们不使用任何电流,除非您正在积极更新显示器并且在阳光下易于阅读。

对于这个项目,我选择了这款Waveshare 2.9" E-Paper显示器。

请记住,这个项目使用的是 Heltec Wireless Stick Lite。它有一个板载 LoRa 调制解调器,通过芯片的 SPI 接口进行通信。我们将使用相同的 SPI 引脚来连接我们的显示器。我上面链接的电路板带有您需要的所有电线。

pYYBAGOX-WKAeZtOAAGwDlK-y64750.png
 

连接:

  • 显示 VCC 到 Heltec 3.3v
  • 显示 GND 到 Heltec GND
  • 显示 DIN 到 Heltec 27
  • 显示 CLK 到 Heltec 5
  • 显示 CS 到 Heltec 18
  • 显示 DC 到 Heltec 10
  • 显示 RST 到 9
  • 向 Heltec 12 显示 BUSY

引脚编号使用引脚分配图中的灰色轮廓编号。

连接后,创建一个新的 Arduino IDE 项目。在此处复制主文件,并添加另一个名为 paper.h 的新选项卡,然后Gist复制paper.h文件

打开 paper.h 并单击最顶部此行旁边的注释中的链接以安装 GxEPD2 库。

#include   // click to install: http://librarymanager/All#GxEPD2

如果你看一下代码,它几乎完全一样。大部分工作都是在 paper.h 中完成的。上传草图,您应该有一个在每个时间间隔更新的显示。

可选:添加太阳能充电

我们设备的另一个简单补充是添加一个小型太阳能电池板来为电池充电。速卖通上找到了一个太阳能电池板唇形充电电路

连接很容易。太阳能电池板线连接 SOLAR - 和 +,BATT IN - 和 + 连接到电池,SYS OUT - 和 + 连接到 Heltec 板底部的电池连接器。您可能需要更换小的 2 针连接器才能连接所有东西。Heltec 板使用 SH2.5 连接器连接电池,大多数太阳能电池板充电电路使用 PH2。

可选:添加空气温度和湿度

您可能对空气温度和湿度感兴趣。添加这些测量值很容易。给自己一个SH20传感器并将其连接到一个开放的 Qwiic 连接器。

有很多例子来展示如何使用这个传感器。您也可以输入VPD 和露点。

看看这些例子,你需要一些明显的东西,比如#include 和类初始化行。您需要在有效负载中添加一行。你的可能看起来像这样:

payload["temp_C"] = sht20.temperature();
payload["hum_RH"] = sht20.humidity();

您还需要修改 ArduinoJson 变量。访问他们的网站并使用他们的助手为您完成所有工作。

额外:更多用途

正如您可能已经猜到的那样,此设置不仅仅用于监测您的饮用水。

其他用途可能是:

  • 水培法鱼菜共生法:测量 EC、pH 和温度至关重要。也许你不会关心 ORP。
  • 游泳池水疗中心:在这里监测 pH 和 ORP 会很好。ORP 可用于帮助管理您的氯使用。EC在这里可能用处不大。
  • 施肥:接近水培,但更多的是大型农场环境。这可能会使 LoRaWAN 的使用更加有益,允许在大范围内进行监控。

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

评论(0)
发评论

下载排行榜

全部0条评论

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