亲,“电路城”已合并升级到更全、更大、更强的「新与非网」。点击查看「新与非网」

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

智能饮用水监测平台—加仑

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

智能饮用水监测平台—加仑

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

背景
这个项目监测的重点是我们身体最重要的营养之一,饮用水。在印度尼西亚,“加仑”一词指的是饮用水的基础设施:饮水机和可更换的水瓶,因为他们那边水瓶的计量单位是加仑。顾名思义,这个项目的名字也是这样由来的。

项目的关键目标是围绕新的构建解决方案Arduino MKR1000.

这个项目真实产品的简化版,叫做HomeX -智能加仑. 请注意产品本身是受版权保护的。

它旨在展示:

  • 现实世界和中等复杂的物联网产品,结合物联网设备、云服务、分析、API服务、移动/桌面应用程序和基于web的应用程序
  • 一些Azure服务的真实用例,特别是Azure IoT Hub和Azure Stream Analytics
  • 以Arduino MKR1000为核心实现物联网器件的微控制器。由于它仍处于测试阶段,没有太多的文档或讨论,使用它是相当有挑战性的。
  • 虽然仍然是原型,还没有视觉上的惊艳,这个项目显示了一个正确的经验为终端用户设置设备。
  • 重面向对象编程(OOP)实现,用于编码Arduino软件,并使用Eclipse作为IDE,而不是Arduino IDE。

如何工作

目前,该设备的原型外壳是由透明的丙烯酸制成的,以显示内部结构。它所附带的设备比它应该要大,因为许多组件,特别是MKR1000,仍然通过母头安装在板上。

基于web的仪表板

用于从web浏览器监视和控制设备。

活网站:http://home-x.cloudapp.net: 9000

测试账户:

用户名:stub2
密码:stub2
注意:如果实际设备没有打开,设备的仪表盘可能不会显示任何数据。

Windows 10 UWP App

一款可安装在Windows 10平板电脑、台式机和手机上的应用程序,用于管理加仑设备,监控水位和其他数据,并设置触发低水位时执行的操作。

对于登录应用程序,您可以使用与仪表板相同的测试帐户。

系统架构

简单的用例并不意味着它本质上是简单的。

物联网设备

关键部件:

  • Arduino MKR1000:内置WiFi模块的大脑连接互联网
  • 电容式传感器:用于无创水位传感在水瓶。
  • 光敏电阻模块:检测饮水机上的热水LED处于开启或关闭状态,以通知热水准备好了
  • LED栏:用于显示水瓶内的水位百分比
  • 基于PCF8574的GPIO扩展器驱动10个LED条,只需要使用2个I2C引脚。

电容式传感器

我想强调一下电容式传感器。当水存在时,通过测量传感器电极上的电容值来测量瓶内水位。为了测量电容,我们利用MPR121模块,它最多支持12个电极。通过使用这种传感器,这意味着传感器不需要像浮动机构的传感器那样与水接触,也不需要管状的传感器。

软件

为物联网设备开发软件意味着为Arduino MKR1000开发固件。它是使用Arduino框架开发的,针对特定平台的目标:“黑客。io - MKR1000构建”。

所有源代码都发布在GitHub上。编码时,我不用官方的Arduino IDE,而是用Arduino Eclipse IDE. 要正确打开和构建代码项目,请确保下载并安装Arduino Eclipse IDEV3。

使用的第三方库:

  • WiFi101:显然是为了通过WiFi进行网络连接
  • RTCZero:用于访问MKR1000上的RTC和datetime
  • PubSubClient: MQTT客户端库,用于向Azure IoT Hub发布JSON消息(设备到云场景),并订阅JSON命令(云到设备场景)
  • ArduinoJson:用于解析从Azure IoT Hub接收到的JSON命令
  • Adafruit MPR121:用于与MPR121电容式传感器模块通信

Azure服务

Azure是平台的核心。它除了用于接收设备到云的遥测数据外,还用于发送云到设备的消息(或命令),以及后续对接收到的数据流进行进一步分析(热路径或冷路径)。使用了以下Azure服务:

a. Azure IoT Hub

它是物联网设备前端的关键组件,用于从物联网设备接收数据流并向其发送命令。

Azure IoT Hub和IoT设备之间的通信完全使用基于TLS/SSL的安全通信的本地MQTT协议完成。在开发这个项目时,Azure IoT Hub已经支持MQTT v3.1.1。

Azure IoT Hub发布了Event Hub兼容的端点,稍后Azure Stream Analytics将使用该端点进行进一步分析。基于node .js的后端也使用端点来存储遥测数据,并通过web套接字中继到客户端应用程序(UWP和web应用程序)。

b. Azure流分析工作

在本项目中,Azure Stream Analytics用于实时处理Azure IoT Hub接收到的数据流。目前正在进行的处理之一是了解水位变化的速率。

幸运的是,Azure Stream Analytics Job已经支持从IoT Hub直接输入。至于输出,目前使用的是Azure Table Storage,但您可以使用另一种,例如Power BI。

至于分析查询,目前我使用这个查询:

With WaterLevelChanges AS (SELECT
    deviceId,
    waterLevelPercent, 
    LAG(waterLevelPercent, 1) OVER (LIMIT DURATION(day, 1)) as prevPercent,
    [datetime]

FROM
    [gallon-stream] TIMESTAMP BY [datetime]
WHERE
    LAG(waterLevelPercent, 1) OVER (LIMIT DURATION(day, 1)) <> waterLevelPercent
)
SELECT 
    deviceId, 
    waterLevelPercent, 
    prevPercent,
    LAG([datetime], 1) OVER (LIMIT DURATION(day, 1)) as prevDate,
    [datetime],
    DATEDIFF(second, LAG([datetime], 1) OVER (LIMIT DURATION(day, 1)), [datetime]) as [duration]   
INTO
    [gallon-telemetry]
FROM WaterLevelChanges

这个查询似乎还可以改进。

以下是IoT Hub采集的有效载荷样本,供参考:

[  
  {
    "deviceId": "gallon-01",
    "state": 1,
    "waterLevelPercent": 100,
    "datetime": "2016-04-01T02:01:23.000Z",
    "ldr": 0
  },
  {
    "deviceId": "gallon-01",
    "state": 1,
    "waterLevelPercent": 100,
    "datetime": "2016-04-01T02:02:23.000Z",
    "ldr": 0
  },
  {
    "deviceId": "gallon-01",
    "state": 1,
    "waterLevelPercent": 90,
    "datetime": "2016-04-01T02:03:23.000Z",
    "ldr": 0
  },
  {
    "deviceId": "gallon-01",
    "state": 1,
    "waterLevelPercent": 90,
    "datetime": "2016-04-01T02:04:23.000Z",
    "ldr": 0
  },
  {
    "deviceId": "gallon-01",
    "state": 1,
    "waterLevelPercent": 80,
    "datetime": "2016-04-01T02:05:23.000Z",
    "ldr": 0
  },
  {
    "deviceId": "gallon-01",
    "state": 1,
    "waterLevelPercent": 80,
    "datetime": "2016-04-01T02:06:23.000Z",
    "ldr": 0
  },
  {
    "deviceId": "gallon-01",
    "state": 1,
    "waterLevelPercent": 80,
    "datetime": "2016-04-01T02:07:23.000Z",
    "ldr": 0
  },
  {
    "deviceId": "gallon-01",
    "state": 1,
    "waterLevelPercent": 70,
    "datetime": "2016-04-01T02:08:23.000Z",
    "ldr": 0
  },
  {
    "deviceId": "gallon-01",
    "state": 1,
    "waterLevelPercent": 70,
    "datetime": "2016-04-01T02:09:23.000Z",
    "ldr": 0
  }
]

应用该查询并使用输入数据样本,我们可以得到如下输出:

根据这个输出,现在我们知道了水位从一个百分比到另一个百分比变化的速度。进一步的分析将揭示瓶子里的水何时会完全空掉。

c. Azure存储帐户

对于当前的项目,Azure Storage Account,特别是表存储,被用作Azure Stream Analytics Job的输出。

d. Azure虚拟机

虚拟机用于主机:

  • 基于node .js的后端,由REST API和中继组成,通过web套接字将消息从Azure IoT重新路由到客户端应用程序
  • MongoDB:用于存储设备数据的数据库引擎
  • 仪表板web应用程序

最初考虑的是在Azure网站上部署它们。但是为了简单和降低成本,我们现在使用VM。

基于web的仪表板应用程序

我们利用Freeboard来创建仪表板。它是一个开源项目,为创建仪表板提供了现成的和可定制的框架。

由于Freeboard只提供基于html的前端框架,我们仍然需要创建基于Node.js的后端:

  • 用户管理与认证
  • 设备管理
  • 准备干板仪表板定义

一些关键的Node.js模块使用:

  • Azure IoT Hub SDK for Node.js,显然是为了访问Azure IoT Hub服务
  • Express,显然是Node.js事实上的web框架
  • socket . io服务器和客户端:用于通过web套接字进行通信
  • Twilio Node.js帮助库:用于通过Twilio发送短信和打电话
  • Mandrill API for Node.js:用于通过Mandrill发送邮件
  • MongoDB Node.js本地驱动程序,用于访问MongoDB数据库

需要注意的一点是,仪表板上显示的数据并不是直接来自Azure IoT Hub。尽管Freeboard支持来自MQTT代理的数据源,Azure IoT Hub也支持MQTT,但这需要我们设置MQTT密码,即设备在仪表板上的SAS令牌!因此,从物联网中心的数据通过网络插座中继到仪表盘加仑观察者的后端这就是为什么干板仪表板上的数据源是socket.io。

Windows 10 UWP App

作为它的前提,通用Windows平台允许开发针对Windows 10平板电脑,桌面和手机基于一个代码库的应用。显然,我们可以通过创造来实现这一点这个Visual Studio项目.

类似于基于web的仪表盘,UWP应用程序不直接从Azure IoT Hub接收数据,而是通过web套接字从加仑Watcher后端接收数据。

你可以使用NuGet安装的用过的库:

  • SocketIOClientDotNet:用于与socket通信。IO服务器通过web套接字
  • Newtonsof。Json: Json解析器

部署
要在您自己的环境中正确复制系统,特别是从软件端,请参考每个存储库中的README文件。

至于部署已使用的Azure服务,请遵循每个服务的部署指南。不需要特别考虑。一些必要的参数:

  • Azure IoT Hub: IoT Hub名称,iothubowner政策的密钥和共享访问签名(SAS)、事件集线器兼容端点的名称和主机。
  • Azure Storage:存储名称和密钥
  • Azure Stream Analytics:输入细节(来自Azure IoT Hub)和输出细节(来自Azure Storage)

物联网设备初始状态,MKR1000第一次闪烁后,未连接互联网。我们可以通过使用UWP提供的应用程序设置设备的WiFi连接。要登录UWP应用程序和基于web的仪表板,请使用提供的测试帐户。

进一步的改善
以下是需要改进的地方:

  • 水位传感技术与算法。正确地将测量的电容转换为实际的水位是相当具有挑战性的。造成噪音的外部因素有两个。不小心接触传感器电极会产生更多的噪音。必须进行适当的校正和消除噪音。
  • 进一步分析摄入的数据。流分析工作是了不起的,有很多事情可以做。
  • 基于web的仪表盘应该得到改进,以添加更多的功能来匹配UWP应用程序。
  • 如果我们希望通过空中(OTA)更新固件,Azure Storage可以用于存储IoT设备的固件,以便从设备下载。

本项目还从软件开发人员的角度,展示了开发Arduino软件的适当开发技术和工具集。

如果您对此项目有任何想法、意见或问题,请在下方留言。

以上内容翻译自网络,原作者:Andri Yadi,如涉及侵权,可联系删除。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论