为温泉和水疗业务增添物联网特色

随着 Bozeman Hot Springs 的人们将他们的温泉和水疗中心通过新技术和泳池带入 21 世纪,他们正在思考新的方法来让顾客感到愉悦并保持领先地位。毫无疑问,来自滑雪爱好者的一个反复出现的需求是能够在线读取当前的泳池温度,就像滑雪胜地发布当前雪况一样。这个项目通过与现有的独立泳池温度控制器集成,并使用易于使用的 API 在互联网上发布温度数据,使这个梦想成为现实。

问题

有三个新建的室外泳池,它们使用霍尼韦尔最新的设备和控制器来维持温度,特别是 霍尼韦尔 T755M。问题是,控制器使用的温度数据被困在控制器本身上。在没有额外硬件的情况下,无法通过网络发布这些温度读数。

解决方案

需要一个中间人来理解独立温度控制器提供的数据,然后通过网络发布这些数据。TS-7680 具有四个模数转换输入、无线网络接口和带 DIN 导轨安装的低成本塑料外壳,正好可以胜任。为了未来的扩展,TS-7680 支持 TS-1700 Modbus 外围设备,它可以为其他泳池启用八个额外的温度传感器。

优势

在该地区有几个温泉度假村的情况下,能够实时发布泳池温度具有竞争优势。客户不仅能够了解情况并相应地计划行程,他们还会每天回来查看,让 Bozeman Hot Springs 始终保持在他们的首选列表中,同时他们梦想着下一次旅行。在业务方面,泳池维护也有优势,例如能够收集、存储和绘制一段时间内的泳池温度,甚至在温度发生剧烈变化时收到电子邮件或短信警报。这样的系统也为其他高科技改进奠定了基础,例如在壁挂式 LCD 屏幕上为访客显示实时泳池数据。

硬件要求

霍尼韦尔 T775M 独立控制器是我们必须能够与之接口的关键组件。它们已经从安装在泳池供水管道中的温度传感器读取数据,并输出命令以调节冷热水流量。幸运的是,有两个输出,MOD1(已用)和 MOD2(备用),每个输出都可以配置为从特定的传感器输入读取数据,并根据可编程变量输出 2-10 VDC 值。因此,为了从所有三个控制器收集温度数据,我们需要一个至少具有三个模数转换输入的系统。

对于网络连接,在与霍尼韦尔控制器相同的房间中已经安装了无线中继器。幸运的是,附近也安装了带有交换机的网络机架,但无线很方便,因此我们不必将电缆连接到机架。

虽然从技术上讲,我们可以运行自己的传感器并绕过霍尼韦尔控制器,但能够使用单个传感器来处理是非常好的,尤其是因为电缆已经很好地通过金属导管布线。更不用说还有一些成本节省和更少的维护担忧。

T755M 控制器安装在一块固定在混凝土墙上的胶合板上。这种设置非常适合简单的 DIN 导轨,我们可以在其上安装外部系统。

定期地,将在与控制器和外部系统相同的房间内进行过滤器和泵维护,这会形成高湿度环境,因此我们需要将我们的系统封闭起来以进行保护。

考虑未来扩展到其他六个未连接到霍尼韦尔控制器的泳池将是很好的。一个具有备用模数转换输入和扩展选项的系统是必要的。

考虑到所有因素,TS-7680 是一个完美的匹配。它具有四个 ADC (0-10 VDC) 输入、DIN 导轨安装外壳、无线 802.11a/b/g 模块和用于扩展的 Modbus 端口 (TS-1700 8x 温度传感器外围设备)。

软件要求

在软件方面,我们需要从 TS-7680 的 ADC 输入读取数据,然后提供这些数据。为了读取 ADC 输入,我们将基于 Technologic Systems 提供的 示例 C 代码 构建。在提供这些数据时,我们希望尽可能方便我们的网站或其他系统使用。这可以使用 REST API 来完成,REST API 是在物联网 (IoT) 或万维网 (WoT) 领域工作的人员常用的和理解的 API。为此,我们将使用 node.js 和 pm2,这使得设置一个简单、易于使用的 REST API 服务器变得非常容易,而无需涉及像 Apache 这样的重量级工具。为了更快的开发,我们将使用 node.js 模块 restify

计划

这是有趣的事情开始发生的地方!整个计划阶段始于一次 Bozeman Hot Springs 之旅,以参观设施及其运行方式。在那里,我们首先接触了霍尼韦尔 T775M 控制器,并看到了温度数据的收集位置。打开 T775M 的外壳,我们发现了一些明确标记的螺钉端子连接器,其中最有趣的是 MOD1 和 MOD2 输出。MOD1 已经被占用,以控制水阀来维持泳池的温度,但 MOD2 是空闲的。不仅如此,快速参考手册表明它支持 2-10 VDC 输出。完美!

我们联系了霍尼韦尔,询问我们是否可以使用 MOD2 输出来自传感器 A 的数据,传感器 A 直接连接到泳池的进水管道。一旦确认,我们决定使用 TS-7680 并开始工作!

控制器配置和接线

我们从一个接线图开始,说明我们将如何将 TS-7680 与三个 T775M 控制器连接起来。每个单元只需要两根线。接地线全部连接在一起,并连接到底部螺钉端子(引脚 1)。VDC 输出线连接到同一螺钉端子连接器的 AN0、AN1 和 AN2 模拟输入(分别为引脚 2、3 和 4)。

为了从 MOD2 输出当前的温度数据,我们必须将其配置为如下

  • 类型 = 2-10 V

  • 传感器 = 传感器 A

  • 设定点 = 100

  • 节流范围 = 40

  • 积分 = 0 (需要断电重启!)

  • 加热/制冷 = 加热

节流范围括起设定点,为我们提供了 80°F 到 120°F 的温度范围。当我们从 MOD2 读取 10 VDC 时,它代表 80°F。类似地,2 VDC 代表 120°F,而中间的 6 VDC 代表 100°F。如果这在你看来是倒退的,那是因为我们处于加热模式。控制器旨在控制阀门,以便在达到我们的阈值时加热或冷却泳池。我们在这里有点作弊,以获得线性温度模型。将我们的 x(温度)和 y(电压,单位为 mV)值代入斜率截距形式 (y = mx + b),因此我们最终得到公式 y = -200x + 26000。求解我们的温度 (x),我们得到 x = (y - 26000) / -200,这与您在 源代码 中找到的公式相同。完成控制器设置工作后,就可以开始软件方面的工作了。

获取 ADC 输入数据和原型

在将 Technologic Systems 提供的给定 mx28adcctl 示例代码 下载到我们的 TS-7680 板上后,我们开始修改 main() 函数,以接受单个参数,即要从中读取数据的模拟输入引脚。例如,要读取 AN0 上的电压,我们只需运行 ./getadc 0,我们将获得以 mV 为单位的返回值。对于原型设计,AN0 和 AN2 连接到恒定的 3.3 VDC,而 AN1 连接到可变微调电位器 (0-3.3 VDC)。

专家提示: 为了以非 root 用户身份调用此函数,您需要运行 chown root:root getadcchmod 4755 getadc,使 root 成为二进制文件的所有者,并打开 SUID 权限位。包含的 Makefile 为您执行此操作。

虽然没有必要,但我们希望至少看到一些状态指示器,表明何时正在读取温度,以便我们可以查看单元是否处于活动状态。TS-7680 外壳有一个标记为“Activity”的黄色 LED,它连接到 GPIO #58,因此我们在 getadc 程序中利用了这一点。当程序获取数据时,活动 LED 将闪烁。同样,Technologic Systems 提供的用于处理 使用 sysfs 接口的 GPIO 的示例代码使这项工作很快完成。有关使用 sysfs 接口的更多信息,请查看我们的文章 “Linux 中 GPIO sysfs 接口的健壮 C 库和实用程序”

开发 REST API

现在我们可以读取电压了,我们开始编写 API 代码。有几个资源可用于创建 使用 Restify 的 REST API,因此很容易创建几个路由(API 端点)供集成使用。

具体来说

  • GET /temperatures — 返回一个 JSON 数组,其中包含所有三个泳池温度数据对象。

  • GET /temperatures/:pool_id — 返回 JSON 对象,其中包含 :pool_id 温度数据,其中 :pool_id 介于 0 和 2 之间。

来自 GET /temperatures 的示例响应


[
   {
      "id":0,
      "vdcin":"5151",
      "temperature":"73.4",
      "temperatureUnit":"F",
      "error":null
   },
   {
      "id":1,
      "vdcin":"4915",
      "temperature":"64.9",
      "temperatureUnit":"F",
      "error":null
   },
   {
      "id":2,
      "vdcin":"5143",
      "temperature":"73.1",
      "temperatureUnit":"F",
      "error":null
   }
]

这应该是目前基础所需的一切,因为我们将仅读取温度数据。将来,我们可能会添加压力传感器数据以用于维护目的,但这还有一段路要走。开发 node.js 应用程序的唯一棘手部分是 node.js 的异步性质。进行系统调用,然后处理回调等等,有点难以理解。因此,使用了 JavaScript Promise 来使逻辑更易于理解。存在其他模块来帮助处理同步调用,但是作者熟悉 JavaScript Promise,因此我们选择了 Promise。

注意:作为一个不错的小奖励,代码也被移植到 Python,可以在 bhs-api 代码仓库 中看到。为什么?主要是出于对 JavaScript 中处理异步系统调用的挫败感,但也有些是为了好玩。

另请注意:有关设置为我们的 API 提供支持的 node.js 应用程序的说明,可以在 embeddedarm/bhs-api 仓库的 README 文件 中找到。

使用 API 的示例网页

创建了一个 简单的网页 作为演示和概念验证,用于在线广告温度数据。它使用 jQuery 和 AJAX 调用 REST API 服务器,并使用返回的 JSON 对象来显示数据。每 10 秒执行一次此操作,以展示显示“实时”(名义上的)温度数据的能力。

TS-7680 安装

开发的最后一步是实际安装 TS-7680。将 DIN 导轨拧到 T775M 控制器旁边的胶合板墙上,并将封闭的 TS-7680 安装在其上。按照接线图中的计划,连接线将每个控制器的 MOD2 连接到 TS-7680 的螺钉端子连接器。使用插入附近墙壁插座的 PS-12VDC-REG-3PB 电源为 TS-7680 供电。

对于网络连接,TS-7680 的无线接口被配置为通过 DHCP 获取 IP 地址,并与 Bozeman Hot Springs 无线接入点的 SSID 和密码关联。网络管理员被叫来为无线接口的 MAC 地址分配保留的 IP 地址,并将端口 8080 转发到所述保留的 IP 地址。然后网站管理员被叫来为我们提供一个子域名,以便轻松访问新安装的 TS-7680 API 服务器,从而结束了我们的 TS-7680 开发和安装。

结果

我们辛勤劳动的成果是一个美观、醒目的小部件,展示了我们的 API 服务器提供的泳池温度数据,供顾客查看。时间会证明这是否对销售和业务有任何影响,但自从上线以来,顾客已经开始称赞网站上的新增功能。

当然,这仅仅是可以实现的开始。可以开发一个维护仪表板来显示历史温度趋势,并在发生意外情况时发送警报。现在可以使用数字屏幕而不是干擦板来告知访客当前的泳池温度。由于 TS-1700 的支持,未来可以扩展到其他泳池,包括目前正在建设中的泳池。也可以添加其他传感器,并通过 API 服务器报告。

总的来说,这个项目为 Bozeman Hot Springs 提供了一个良好的基础,将其泳池带入 21 世纪和物联网领域。我们期待着在未来继续合作。同时,我们希望这能在某种程度上启发您使用 Technologic Systems 的嵌入式产品开发自己的物联网应用程序。如果您对此充满期待,请联系我们的销售和工程团队。他们很乐意听到新的和令人兴奋的应用。

材料清单

以下是本项目中使用的零件和材料的快速要点视图。

  • TS-7680 单板计算机,带交流电源、继电器和 WiFi (TS-7680-256-4GF-I-DEV, KIT-7680, CB-ANT-TIWI, TS-ENC768-DIN, PS-12VDC-REG-3PB)

  • DIN 导轨,带安装螺钉(手锯和锉刀切割至所需长度)

  • 连接线(22 AWG),各种颜色

  • 霍尼韦尔 T755M 独立温度控制器(每个泳池一个)

  • 开发工作站 (Mac OSX, Linux 或 Windows)

  • 安装了 node.js 和 pm2 的 Linux 服务器

源代码: GitHub.org 上的 embeddedarm/bhs-api

本文由 Technologic Systems 赞助。

加载 Disqus 评论