第 1 部分 - 想法、架构、硬件购物清单和硬件配置
有时,简单的想法往往会膨胀到几乎失控的地步,这就是其中之一。本质上,与 我之前的 IoT 项目 相比,我想要“反过来”——我不想将手环用作传感器设备,将树莓派 PI2 用作“显示单元”,而是将手环用作 控制器。 我的想法是我可以
- 使用运行 Windows 10 CoreIoT 的 Raspberry PI2 测量温度
- 在我的手环上查看当前温度,包括测量日期和时间
- 如果我发现东西变得太热,请向我的 Raspberry PI2 发送命令以打开风扇
- 在我的手环上看到风扇实际上已经打开
- 如果我愿意,请再次关闭风扇。
我桌上的一些由此产生的装置的照片:
我会告诉你我的朋友们:玩弄物联网的东西把“意大利面条代码”这个词提升到了一个全新的水平:D
细节
在我的手机上(或者更准确地说,我的 Band 与之配对的 Windows 10 设备)有一个应用程序比
- 收听来自 Raspberry PI2 的温度数据,
- 在我的 Band 上构建一个带有自定义 UI 的磁贴,
- 收听来自该 Band UI 的事件并对其采取行动。
如果我打开 Band 上的自定义磁贴,我手机上的应用程序会收到一个信号,将上次从我的 Raspberry PI2 接收到的数据(温度、上次接收到的更新日期和时间,以及风扇是开还是关)传输到乐队,然后是一次振动。如果我在我的 Band 上的自定义 UI 上点击风扇切换按钮,应用程序也应该对此做出响应,通过 Azure 服务总线队列发回一个信号 - 并在 Band 上显示风扇打开(现在可以切换离开)。
Raspberry PI2 上有一个 CoreIoT 应用程序,它可以测量温度并每五秒通过 Azure 服务总线队列发送一次数据,还可以侦听风扇开关命令。它还应该通过让连接的双色 LED 在测量和传输正确温度时闪烁绿色,或在出现问题时闪烁红色来显示其“健康”。我还包括一个序列,其中 LED 快速闪烁红色/绿色以指示应用程序正在启动。当您将应用程序设置为默认应用程序时,这非常方便 - 这样它会在 PI2 启动 Windows 10 CoreIoT 后自动启动,然后您可以看到该应用程序实际上正在启动,即使没有连接显示器也是如此。
您可以在下面的视频中看到最终结果:
由于 Azure 服务总线位于云端“某处”,无论我身在何处,我都可以在 Band 上的书房中读取温度。虽然这可能不是最有用的事情,但实际上我在过去的 1.5 周里在德国度假时真正使用过这个装置——我没有用风扇,而是用聚光灯连接它,使我能够在晚上随机打开家里的灯,以迷惑潜在的窃贼。正如我所说,Windows 10 CoreIoT 将始终尝试保持默认应用程序运行 - 在发生电源故障或崩溃后,它会自动(重新)启动该应用程序。当您离家数百公里且无法按下重启按钮时,这是一项非常有用的功能。
这将如何写博客
由于这是一个相当大的项目,我决定将解释分成六篇博文:
- 想法、架构、硬件购物清单和硬件配置
- 使用 Azure 服务总线队列在 IoT 设备之间进行双向通信
- 在 Raspberry PI 2 上使用 UWP 测量温度
- 在 Raspberry PI2 上使用 UWP 远程控制风扇
- 显示温度数据和控制风扇的客户端应用程序
- 用于读取温度和控制风扇的 Microsoft Band 客户端
我刚才描述的想法,所以现在我们继续架构
建筑学
对于
我之前的 IoT 项目——使用连接到 Raspberry PI2 的 LED 显示心率
——你可能还记得我使用了 Azure 托管的
Signal/R
Hub。这一次,正如我已经说过的,我决定使用 Azure 服务总线上的
队列
。 Signal/R 在之前的设置中运行良好,但它有一些缺点:
- 它要求您部署一个网站,而服务总线的基础结构由 Azure 本身“托管”。
- Signal/R 信号只能实时传递——这就是 Signal/R 的本质。如果你错过了,你就错过了。坚韧的靴子。队列可以在发送数据后暂时接收数据。
- 安全性有点不确定——每个知道我以前的 Signal/R 集线器解决方案地址的人都可以监听数据。当然,我可以对其进行加密,或者访问安全性——这很麻烦,而且感觉有点自己动手。
还有一个缺点 - 与 Signal/R 不同,基本上只有一个客户端可能 - 这就是队列的性质。如果客户端接收到消息,它就会从队列中删除。第二个客户听不到它。所以“广播”场景是不可能的。但是因为这正是我想要的,所以这非常适合我。我来自意大利的好朋友 Matteo Pagani 以前玩过 if,他很友好地为我提供了一些入门代码,这样我就可以顺利开始了。
这是设置的高级概述:
我认为将此称为“体系结构”有点丰富,但它旨在作为全局概述。虽然它并不完全正确,因为这张图片表明信号通过单个通道在电话和 PI2 之间(并返回),而实际上有
两个
队列 - 每个方向一个。温度数据通过一个队列从 PI2 发送到电话,切换风扇的命令通过另一个队列。
与我的大多数演示解决方案相反,这是一个更具架构的解决方案。它使用通过依赖注入连接的独立组件,Windows 10(移动)客户端是一个完全成熟的 MVVMLight 应用程序。这是因为我想展示更多如何以更稳健的架构方式做事。它还可以更轻松地将博客文章拆分为可管理的部分。这不仅仅是一个简单的演示 - 它是一个完整的设置。
演示解决方案 包含以下项目:
- TemperatureReader - 在 Raspberry PI2 上运行的 CoreIoT UWP 应用程序,它实际读取温度数据并将其显示在屏幕上 - 如果连接了一个,则通过服务总线发送数据并等待打开或关闭风扇的命令。或者实际上,只是引导整个过程的非常有限的用户界面——所有的逻辑都在
- TemperatureReader.Logic - 包含读取温度、闪烁 LED 和使用 GpioController 类控制继电器的所有逻辑。
- TemperatureReader.ClientApp 是 Windows 10 UWP 应用程序,充当 Band 和 Raspberry PI2 之间的中介,侦听来自 PI2 的信号并对来自 Band 的命令和/或事件采取行动。它有自己的用户界面来显示数据和初始化 Band。
- TemperatureReader.ServiceBus 代码通过 Azure 服务总线处理通信。
- TemperatureReader.Shared - 包含通过服务总线传输的数据对象,以及定义面包板上使用的引脚的全局定义类、Azure 访问密钥和类似的东西 - 因为我不喜欢魔术字符串和数字。
硬件购物清单
要运行此项目,您需要以下硬件:
- 1 个运行最新 Windows 10 CoreIoT 版本的 Raspberry PI2
- 1 个微软乐队
- 1 台运行 Windows 10 的设备(移动设备或其他设备 - 只要 Band 可以与之配对)
- 1键双色共阴极LED 1个
- 1 Keyes 模拟温度传感器 2
- 1 ADC0832 模数转换器 3
- 1 凯斯 SRD-05VDC-SL-C 开关 4
- 1 个面包板 + 将其连接到 Raspberry PI2 的扁平电缆
- 14 根连接线(我希望我算对了;))
- 3 个隔离带单元 5 ( 我们在荷兰语中称为“kroonsteentjes”的东西 )
- 1 根电源线
- 1个电源插头
- 1个电源插座
- 一些胶带
部分杂项图片:
配置
一个警告:硬件配置使用继电器开关来控制
市电
。根据您居住的地方,电压在 100 到 250 伏之间。我们在这里不是在谈论电池电源——这是从你的墙上插头里出来的东西,驱动洗衣机、冰箱、空调等等,它背后有很大的吸引力——如果你弄乱它会严重伤害你。在我的示例中,我切断了一根电源线,通过继电器重新连接了一部分,并使用隔离带重新连接了其余部分。我用胶带密封了连接。电源线的两端是一个电源插头和一个电源插座,因此它可以用来控制任何电源驱动的设备。
请务必小心带电电线
,并注意我向您展示的任何内容很可能不会得到熟练电工的认可。如果您使用自己的硬件重新创建我的设置,我对出现的问题不承担任何责任。我还强烈建议不要让设置连接到主电源无人监督。这是一个测试/演示项目,而不是生产单元。
LED
这是个简单的。我已将“R”连接到 GPIO12,将“Y”连接到 GPIO16,将“G”连接到 GND(当然)。
SRD-05VDC-SL-C 开关
有点复杂,因为该设备的引脚上没有标记。如果你拿着它,你可以阅读蓝色块上的文字,并且引脚向右伸出(如图 4 所示),我将顶部引脚连接到 GND,中间引脚连接到 5V,底部引脚到 GPIO18。
在 另一边 ,上面有螺丝的部分——我连接了电源线。我先切断它,然后使用三个接线板单元重新连接到电源——用胶带密封这些东西。如前所述 - 遵循此建议需要您自担风险。基本上,一根电线直接穿过槽,另一部分穿过开关。现在不容易看到,但是如果你像图4(及下图)那样按住开关,你会看到左侧的螺丝,你可以看到顶部螺丝下面的“NO”和“NC”在底部螺丝下。这代表“常开”和“常闭”。您将一根电源线固定到 NO 螺丝上,另一根固定在 中间 螺丝下。
模拟温度传感器
我已将中间引脚连接到 3.3V,“-”引脚连接到 GND,“S”引脚连接到交流转换器的 2(见下文)。那个转换器是最难的部分。
ADC0832 模数转换器
我将是第一个承认我实际上不知道这是如何工作的人,我从 Sunfounders 手册中截取了这个想法。我了解A/D转换器的原理,我只是不知道为什么要这样连接,更不知道编程的“顺序”(将在以后的文章中介绍)
进入它。无论如何,这个 A/D 转换器是一个芯片,如果你拿它的方式可以实际阅读上面的文字,那么引脚就是这样编号的。为什么?我真的不知道,没有正式的电子学背景。现在这个别针也贴上了标签,它们是:
1 = CS
2 = 通道 0
3 = 通道 1
4 = 接地
5 = DI
6 = 做
7 = 时钟
8 = VCC
我们稍后会在 示例 解决方案中看到这些名称。因此,或多或少地遵循 Sunfounders 手册,我建立了以下联系
- 1 到 GPIO5
- 2 到模拟温度传感器的“S”引脚
- 3 到零
- 4 到地
- 8 至 3.3V
- 7 到 GPIO6
- 5 和 6 到 GPIO13
运行示例解决方案
如果您想运行
示例解决方案
,您至少需要
- 创建 Azure 服务总线
- 将密钥粘贴到 TemperatureReader.Shared 中的 Settings.cs
- 在运行 Windows 10 CoreIoT 的 Raspberry PI2 上部署 TemperatureReader 应用程序,并连接所有指定的硬件
- 将 TemperatureReader.ClientApp 部署到带有 Microsoft Band 的 Windows 10 设备。
本系列的下一集将解释如何 将 Azure 服务总线用作 IoT 通信管道 。