使用 Raspberry Pi 和 Microsoft Band 控制您的 A/C – 第 1 部分

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

第 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 将始终尝试保持默认应用程序运行 - 在发生电源故障或崩溃后,它会自动(重新)启动该应用程序。当您离家数百公里且无法按下重启按钮时,这是一项非常有用的功能。

这将如何写博客
由于这是一个相当大的项目,我决定将解释分成六篇博文:

  1. 想法、架构、硬件购物清单和硬件配置
  2. 使用 Azure 服务总线队列在 IoT 设备之间进行双向通信
  3. 在 Raspberry PI 2 上使用 UWP 测量温度
  4. 在 Raspberry PI2 上使用 UWP 远程控制风扇
  5. 显示温度数据和控制风扇的客户端应用程序
  6. 用于读取温度和控制风扇的 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 通信管道