一种用于测量饮用水质量的 LoRaWAN 设备,可在大范围内部署。
一些设计注意事项:
水质测量成本高昂,获取、存储和处理数据的后勤工作很复杂。您要测量的地方通常是偏僻的。硬件选项包括某种蜂窝设备,但这是一个相对较高的初始成本加上设备生命周期内的经常性成本。
Helium正在美国和加拿大推出 LoRaWAN 网络。它将通过使用他们所谓的热点来提供大范围的覆盖区域(检查您所在区域的覆盖范围)。用 LoRa 的说法,这些是 LoRaWAN 网关或集中器。他们正在为我们的传感器数据提供传输。假设您有覆盖范围,那么建立这样一个广域网的大量艰苦工作已经为您完成。如果您没有覆盖范围,您可以设置自己的热点。运行它是有动机的,因为您为通过的每个信息包赚取一定数量的钱。
至于水质测量,我们将使用的传感器也已经简化了。
LoRa是物理层,提供长距离通信,占用 OSI 层1。LoRaWAN是一种通信协议(OSI 层 2 和 3)。它使用 LoRa 层提供两种无线通信方式。为什么没有无线网络?因为 WiFi 最多只能走几百米(最多),而 LoRa 可以走几公里(几百公里)。
是时候在这里发表免责声明了。我拥有μFire LLC。我们制造水传感器并提供 InfluxDB 托管。毫不奇怪,这些就是本文将使用的设备和服务。制作这些小设备是我工作的一部分。
让我们做出一些设计选择。
我们需要一个微控制器。Heltec Automation制作了一系列与 LoRaWAN 兼容的基于 ESP32 的开发板。我喜欢Wireless Stick Lite ,所以我们将在这个项目中使用它。
它有:
我们需要一些水传感器。该项目将使用:
μFire 传感器均使用Qwiic / STEEMA QT I2C 连接器。所以这一步非常简单。在Heltec 板上,将蓝色线连接到引脚 32,黄色连接到 33,黑色连接到接地引脚,红色连接到 Vext 引脚。
在我们继续之前,快速解释一下引脚以及它们是如何选择的。黑色接地引脚没有什么特别之处,Heltec 板上有一些可供使用。红线是电源,蓝色和黄色引脚是 SDC 和 SCL。在 ESP32 上,您可以为 I2C 总线选择任意两个引脚,所以我选择了 32 和 33,因为它们没有用于其他任何用途。红线连接到 VExt 引脚。
什么是 Vext 引脚?它是控制器可以打开和关闭的电源引脚。这对于电池设备来说非常有用,因为您可以将其关闭,并且连接的传感器根本不会消耗任何电力。然后,当您想要一些读数时,您将其重新打开。
无论如何,现在只需将 Heltec 板连接到 EC 或 ISE 板,然后以相同的方式连接其他两个板。最后要连接的是温度传感器。它可以连接到任何板,但对于这个项目,它将连接到 EC 板。它只是一个带键的推入式连接器。
我们现在剩下一堆传感器,它们以菊花链的形式连接到 Heltec 板上,放在桌面上。我们希望它能够坐在外面,靠近水,所以这是行不通的。让我们把它放在一个盒子里。
对于这个项目,我将使用Bud Industries塑料盒。我们需要在盒子的侧面钻一些孔来安装传感器。为此,我们需要一个 9 mm fortsner 钻头。为什么会有这样一个奇怪的特定命名的钻头?因为它在您钻探外壳中使用的软、低熔点塑料时起作用。如果你用铲子钻头,你会弄得一团糟。一个木头钻头会到处乱跳,即使你认为自己钻了一个导向孔很聪明。
我用来获得良好且可重复的结果的方法是在 Inkscape 中制作大纲。快速计算一下,在我们的例子中,我们将为 EC 钻一个孔,为 pH 钻一个孔,为 ORP 钻一个孔,为温度传感器钻一个孔。我要安装所有这些东西的一侧是 119 毫米长,所以将其除以 4,孔之间的距离约为 30 毫米。
做一些 Inkscaping,你可能会得到这样的结果:
打印出来并将它贴在你的盒子上。在中间戳一个小洞,用记号笔做记号,然后钻出来。小心,慢慢地,并施加最小的压力,否则你会熔化或碎裂塑料。如果您在钻孔时感到非常无聊并且不要弄得一团糟,您就会知道自己做对了。
希望事情进展顺利,您最终会得到一个带有计划孔的外壳,而不是一些昂贵的塑料块。
使用随附的垫圈、六角螺母和垫圈安装传感器。从外壳移出时,垫圈应在内部接触外壳,然后是垫圈,然后是外部的六角螺母。这将确保垫圈紧紧地压在外壳上,防止水进入。
温度传感器不同。我们将使用PG7 电缆密封套。确保你得到一些包括密封垫圈的东西。
将连接电池的 Heltec 板扔进去。您可以使用双面胶带、魔术贴或一些安装螺钉固定它们。保持它与 USB 电缆连接,以便以后对其进行编程。
InfluxDB 是一个时间序列数据库。它易于使用,是传感器测量存储的理想选择。它还非常方便地附带了一个名为 Chronograf 的集成图形组件。使用这两者,您可以记录传感器信息,然后以任何您想要的方式显示它。对于这个项目,我们将使用 μFire Net 来为我们处理这一切。
如果您愿意,可以自行设置。这个项目使用 InfluxDB 版本 2,它与版本 1 有很大不同。如果你走这条路,你还需要一个 MQTT 服务器。
无论如何,μFire Net将为您设置该项目所需的一切。您不需要对最初提供的设置进行任何更改,但您需要一些信息
接下来要设置的是氦气方面。您需要创建一个Helium 控制台帐户。
单击左侧的集成链接,然后在添加自定义集成部分中选择 MQTT。
向下滚动一点,您会看到标题为Step 2的部分。
这是您需要输入 MQTT 服务器信息的地方。对我来说,我使用的 μFire Net 帐户是 awesome.ufire.net。我的端点线如下所示:
mqtts://awesome:password@awesome.ufire.net:8883
对于主题部分,放入helium 。
这一步所做的是告诉 Helium 每次从我们的设备接收到消息时发送一条 MQTT 消息。在下一步中,我们将构建一个小型 Python 脚本,该脚本将订阅相同的 MQTT 服务器和主题,解析信息,并将其插入到我们的 InfluxDB 中。
现在转到设备页面并单击添加设备。
选择任何名称。Dev EUI、App EUI 和 App Key 是自动生成的,是您稍后需要几个步骤才能输入 Arduino 草图的信息位。
接下来是创建一个标签,因此转到标签页面并单击添加标签,给它起任何您想要的名称,然后在第 2 步中,选择您创建的 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 的设备页面,找到您在几步前创建的设备。点击它,你会看到这个。
如果单击小对角箭头,它将展开一长串数字。
确保您看到显示msb ,然后单击复制图标。将其复制到 Arduino 草图中作为DevEui[]的值。
对AppEui[]和AppKey[]执行相同的操作。
现在在“工具”菜单中选择一些东西。确保为 Board 选择“Wireless Stick Lite”,为 LoRaWAN Region 选择“REGION_US915”。
上传草图并运行它。打开您的串行终端,您会看到一些关于访问网站并获取许可证密钥的信息。按照说明将输出粘贴到license[4]中。重新上传,您将看到设备加入 LoRaWAN 网络的一系列尝试。在事情取得进展之前,通常需要进行几次尝试。
设备连接后,您应该会在设备页面下的 Helium 控制台中看到一些活动。
您应该会看到 MQTT 脚本的输出。
现在我们可以设置 InfluxDB
现在有一些 InfluxDB 和 Chronograf 基础知识可以让您制作自己的仪表板。
Chronograf 由仪表板组织。仪表板是可视化的集合,称为单元格,您可以在网格中组织这些单元格。可视化可以是折线图、仪表、热图或其他一些。您可以自定义一些选项,然后将它们添加到仪表板。在仪表板中,您可以调整大小和移动它。
因此,首先,通过单击左侧的仪表板图标并单击右上角的创建仪表板来创建一个新仪表板。接下来,单击添加单元格。
这是你经常点击的地方。看看这张照片:
FROM 列表显示所有存储桶(数据库),然后您会看到一系列过滤器以获取您想要的数据。
从这里,您可以单击自定义按钮并查看单元格外观的选项。当您满意时,单击绿色对勾,它将被添加到我们创建的仪表板中。
您现在可以单击并拖放,直到获得您喜欢的东西。
您可以做一些简单的事情,您可以将仪表板拆分为:
在这一点上,我们完成了!
我们已经到了我们的堆栈可以正常工作的地步,并且我们有一个最小的可行产品。虽然有一些简单的补充。让我们添加一个屏幕,这样我们就可以查看我们的盒子并查看测量结果。
由于我们要使用电池供电,因此电子纸显示器是最佳选择。它们不使用任何电流,除非您正在积极更新显示器并且在阳光下易于阅读。
对于这个项目,我选择了这款Waveshare 2.9" E-Paper显示器。
请记住,这个项目使用的是 Heltec Wireless Stick Lite。它有一个板载 LoRa 调制解调器,通过芯片的 SPI 接口进行通信。我们将使用相同的 SPI 引脚来连接我们的显示器。我上面链接的电路板带有您需要的所有电线。
连接:
引脚编号使用引脚分配图中的灰色轮廓编号。
连接后,创建一个新的 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 变量。访问他们的网站并使用他们的助手为您完成所有工作。
正如您可能已经猜到的那样,此设置不仅仅用于监测您的饮用水。
其他用途可能是:
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !