使用 Raspberry Pi、一些传感器、一个蜂鸣器、Node-RED 和 Apple Home Kit 构建一个智能门铃
有时,最有效的家庭自动化项目恰恰是那些解决非常简单的问题的项目。
这里提供了我的简单的家庭自动化 IoT 解决方案。我在楼上戴着耳机工作时,很难听到门铃的声音,所以我要创建一个智能门铃系统:
我将所有这些传感器公开为 Apple Home Kit设备。Home Kit 是 Apple 公司的家庭自动化框架,它允许您在运行 iOS10 的 iPhone 或 iPad 上使用 Home 应用程序读取传感器读数,控制家里安装的智能设备,所以我将能够从手机上看到传感器读数 (图 1)。
我将逐步介绍我是如何使用在 Raspberry Pi 上运行的 Node-RED,通过一些便宜的传感器和执行器构建我的家庭自动化解决方案的。您可以使用本教程来 培养 IoT 技能,建立一个类似的家庭自动化解决方案,或者可以在开始开发您自己的 IoT 解决方案时借鉴这些概念。
家庭自动化教程 - 简介
点击查看大图
点击查看视频演示 查看抄本
要构建这个 IoT 解决方案,您需要基本熟悉 JavaScript和 MQTT。
我使用 MacBook Pro 作为开发环境,但是任何拥有 Wifi 和等效软件的 Linux 或 Windows PC 应该都可以。我使用了以下软件和硬件来构建我的家庭自动化系统。
一个配备了所有这些附件的入门工具包,比如来自 AdaFruit 的 这个工具包。
我要运行的家庭自动化设备由接入主电源的 USB 电源线供电,所以我无需考虑电池或电源管理方面的事情。由主电源供电还意味着,我不需要优先选择通常在商用家庭自动化系统中采用的低功耗网络技术,比如 Zigbee。
Wifi 是我为这个项目首选的网络技术,因为我家里已有 Wifi 网络,而且我的家庭自动化系统的作用范围只需要涵盖家里的局域网 (LAN)。Wifi 的另一个优势是具有高数据吞吐量,这意味着我应该能够顺利地从连接的传感器收集数据。要了解有关选择网络技术的更多信息,请参阅我的文章“ 连接物联网中的所有事物”。
我选择使用 Raspberry Pi Zero W,但是您可以使用任何带 Wifi 的 Raspberry Pi。Raspberry Pi Zero W 是一个容易获取的、小型且便宜的单板计算机,其中内置了蓝牙和 Wifi,这使它成为需要接入现有 Wifi 网络或使用蓝牙集成用户设备的 IoT 解决方案的理想选择。Raspberry Pi 是电子爱好者中非常流行的一种开发板,所以有许多在线资源和兼容设备可为开发人员提供支持。我将运行的这个设备由接入主电源的 USB 电源线供电,所以我无需考虑电池或电源管理方面的事情。
要更详细了解为 IoT 项目选择硬件时要考虑的硬件需求,请阅读我的 IoT 硬件指南。
我选择了一个现成的 无源红外 (PIR)传感器来检测运动,选择了一个 DHT-11 数字温度和湿度传感器模块与我的设备相连。这些传感器都是便宜的 5V 数字传感器,而且同时兼容 Arduino 和 Raspberry Pi。Raspberry Pi 没有板载硬件模数转换器,所以与需要额外的模数转换器的模拟传感器相比,数字传感器是个不错的选择。我使用的输出元件包括一个压电式蜂鸣器元件和一个 5V 继电器及 12V LED 灯带。只要在原型设计期间检测到运动,蜂鸣器就会发出嘟嘟声;在系统的最后迭代期间,运动将触发继电器点亮灯带。
按照此视频中的步骤连接 PIR 传感器、蜂鸣器及 DHT11 温度和湿度传感器。使用视频后面的图和表格帮助组装电路。
家庭自动化教程 - 组装电路
点击查看大图
点击查看视频演示 查看抄本
如果 Raspberry Pi 没有附带 GPIO 引脚,您需要首先在开发板上焊接这些引脚。我使用的电路如 图 2所示。
点击查看大图
对于每个元件,正引脚连接到 5V,负引脚接地 (GND),数据引脚连接到 Raspberry Pi 引脚排线座上的 GPIO 引脚,如表 1所示。在表 1中,排线座中引脚的编号包含在中间列,而 Raspberry Pi GPIO 引脚标识符显示在第 3 列。表后的 图 3中提供了 Raspberry Pi 引脚的布局。
传感器/设备 | 引脚排线座编号 | GPIO 引脚编号 |
---|---|---|
PIR 传感器 (显示在 图 2 的左上侧) |
7 | GPIO4 |
压电式蜂鸣器 (显示在 图 2 的中间) |
11 | GPIO17 |
DHT-11 传感器 (显示在 图 2 的右侧) |
40 | GPIO21 |
继电器 (显示在 图 6 的右侧) |
13 | GPIO22 |
将元件与 Raspberry Pi GPIO 排线座相连时,请参阅 图 3中的引脚图。
点击查看大图
如果您选择使用一个带有 Wifi 适配器的不同 Raspberry Pi,可以通过以太网线对 Pi 进行初步设置,请观看 developerWorks TV 上的 IoT 实践视频,了解如何 不使用键盘、鼠标或监视器设置 Pi。
Pi Zero 很小,所以开发板上没有针对 HDMI 或 USB 的全尺寸端口。可以添加一个 mini-HDMI 到 HDMI 转换线或适配器,也可以添加一个 micro-USB 便携适配器和 USB 集线器,以插入监视器、USB 鼠标和键盘。但是设置 Raspberry Pi 后,就不再需要这些外围元件了,所以我更喜欢跳过这些装置,在无头模式下配置 Pi Zero。
以下是为本教程设置 Raspberry Pi Zero W 的步骤:
如果使用的是预先安装了 Raspbian 的 micro SD 卡,可以跳过这一步。但是,如果最开始只有一张空白卡,则首先需要将最新版的 Raspbian 操作系统安装到该 micro SD 卡上。我使用的是一张 8 GB micro SD 卡,并使用一个 SD 卡适配器从我的 MacBook 设置该卡。您可以按照 Raspberry Pi 网站上的操作说明进行操作。
我没有计划在操作系统之间切换,所以对于本项目,我决定使用 Raspbian Jessie 映像,而不是 NOOBS。我已经安装了 Etcher应用程序,所以将该映像闪存到 SD 卡很简单,只需选择下载的 .zip 文件,选择该 micro SD 卡,然后单击 Flash(图 4)。
点击查看大图
您还需要在 SD 卡上添加一些配置文件,以设置无线网络设置来将 Pi 连接到本地网络。
您需要将一个名为 wpa_supplicant.conf
的文件添加到 SD 卡的根目录中。此文件包含 Wifi 设置,包括网络密码和 SSID。使用 Sublime Text 或 Atom 等文本编辑器编辑该文件的内容,添加以下行,然后指定 ssid
和 psk
变量的值:
network={ ssid="" psk=" " }
还需要将一个名为 ssh
的文件(该文件本身不需要包含任何内容)添加到 SD 卡的根目录。有了该文件,就会在 Pi 启动时启用 SSH。
现在可以将 micro SD 卡插入 Raspberry Pi Zero W 中,将 micro USB 线插入 Pi 上的电源插孔,然后为它通电。
假设您的无线路由器设置为通过 DHCP 自动向连接的设备分配 IP 地址,那么您不知道最初为您的 Pi 分配了哪个 IP 地址。但是,可以使用 mDNS
和 .local特殊用途域名来找到并连接到 Pi,而无需知道它的 IP 地址。 mDNS
的最常见实现是 Apple 的 Bonjour 服务。如果您在 Mac 上,此服务直接就能使用。在 Linux 上,此服务由 Avahi (Zeroconf) 提供。在 Windows 上,如果安装了 iTunes,那么您就已安装 Bonjour。如果未安装 Bonjour,让您的 Pi 正常运行的最快方式是安装 Apple Bonjour 打印服务。
默认情况下,已为 Raspberry Pi 配置了主机名 raspberrypi和默认用户 pi,所以您可以使用 SSH 连接到 Pi:
ssh [email protected]
连接到 Pi 后,可以运行 ifconfig
命令来找到它的 IP 地址,或者在运行 node-red 时检查启动消息。如果不想安装 Bonjour 来使用 mDNS,您可能希望检查家庭路由器的 DNS 日志来找到 Pi 的 IP 地址,并将该 IP 地址替换为主机名 raspberrypi.local
。
请观看 developerWorks TV 上的 IoT 实践视频 Node-RED 简介。
Node-RED 是一个开发工具,可在它的图形 Web 界面中将连接物理设备、API 和其他在线服务的 IoT 流连接在一起。Raspbian Jessie 中默认已安装 Node-RED 和 node.js,但是它捆绑的版本比较旧。所以,我启动 Raspberry Pi 后做的第一件事就是更新 Node-RED 和 node.js,并安装一些第三方模块来让 DHT-11 温度传感器和 Home Kit 更容易使用。
可以在 Node-RED 文档中进一步了解如何 在 Raspberry Pi 上运行 Node-RED。
Node-RED 提供了一个图形 Web 界面用于设计 IoT 流。这些流将各种节点(代表物理设备及附加的传感器和执行器的节点,实现自定义功能的节点,以及为库或服务提供接口的节点)连接在一起,并指定如何在它们之间传递包含数据载荷的消息。我们可以通过安装更多 (contrib) 模块来添加更多种节点。模块可使用 Web 界面添加,只需转到 Web 界面右上角的菜单,选择 Manage palette,并在屏幕左侧边栏中的 Install 选项卡下搜索贡献的模块。
在此视频中,我通过 SSH 连接到 Raspberry Pi Zero,启动并更新 Node-RED,然后安装要与 Apple Home Kit集成的 node-red-contrib-homekit 模块,所有操作都使用 Web 用户界面完成。
家庭自动化教程 - 在 Raspberry Pi 上设置 Node-RED
点击查看大图
点击查看视频演示 查看抄本
除了使用 Web 界面安装 Node-RED 模块,也可以在命令行使用 npm 安装模块。
例如,安装 homebridge 模块来允许与 Apple Home Kit 附件集成:
sudo npm install -g homebridge
为了更加容易使用 DHT11 温度和湿度传感器,需要安装 node-red-contrib-dht-sensor 模块 ( https://flows.nodered.org/node/node-red-contrib-dht-sensor)。此模块的文档列出了它依赖的 BCM2835 库和 node-red-dht 模块。所以我们首先需要安装这些模块。
http://www.airspayce.com/mikem/bcm2835上提供了 BCM2835 库的安装说明和最新版本。从 Raspberry Pi 上的命令行,使用以下命令下载并安装这个库:
cd ~ wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.52.tar.gz tar xzf bcm2835-1.52.tar.gz cd bcm2835-1.52.tar.gz ./configure make sudo make check sudo make install
安装该库后,切换到 .node-red目录,使用 npm 安装 node-dht-sensor 和 node-red-contrib-dht 模块。
cd ~/.node-red sudo npm install --unsafe-perm -g node-dht-sensor sudo npm install --unsafe-perm -g node-red-contrib-dht-sensor
点击查看大图
可以使用 npm
列出已安装在 .node-red
目录中的模块:
npm ls --depth=0
我发现在手动安装模块后重新启动 Node-RED 是个好主意:
sudo service nodered restart
安装 DHT 模块后,您会看到(Web 界面中的)Node-RED 面板中出现了额外的 DHT22 节点类型。
我使用 Node-RED 设置我的家庭自动化系统的逻辑。我使用它从连接到 Raspberry Pi 的 GPIO 引脚的元件读取数据并控制这些元件。我将功能拆分到两个流中。第一个流读取 PIR 传感器读数,并在检测到运动时触发蜂鸣器。它还会向 Apple Home Kit 公开 PRI 传感器读数(可以在 Apple 文档中了解 Home Kit的更多信息)。第二个流读取温度和湿度传感器读数,并设置两个 Home Kit 设备,一个用于温度,另一个用于湿度,以便我能够从 Home 应用程序中看到这些传感器值。
按照视频中的步骤,在 PIR 传感器与蜂鸣器之间设置一个 Node-RED 流,以便在 PIR 传感器检测到运动时,蜂鸣器就会发出嘟嘟声。我还配置了一个 Apple Home Kit 节点,以便可以在我手机上的 Apple Home 应用程序中显示运动传感器的状态。
家庭自动化教程 - 构建 Node-RED 流
点击查看大图
点击查看视频演示 查看抄本
您可以从 我的 GitHub 存储库中的 MotionSensor.json
文件导入已完成的流的配置。
要导入流,可以转到 Web 界面右上角的汉堡形状菜单,选择 Import From > Clipboard,然后粘贴新流的配置。
按照此视频中的步骤,为 DHT11 温度和湿度传感器添加第二个流,并将这些传感器公开为 Apple Home Kit 设备,以便您在 Home 应用程序内读取温度(摄氏度)和相对湿度(百分比)。
家庭自动化教程 - 构建更多 Node-RED 流
点击查看大图
点击查看视频演示 查看抄本
可以从 我的 GitHub 存储库中的 TemperatureAndHumiditySensor.json
文件导入已完成的温度和湿度传感器流。
可以通过将您创建的任何流公开为 JSON 格式来共享它们。要导出流,首先选择该流中的所有节点,然后转到汉堡形状的菜单并选择 Export(如果没有选择任何节点,会禁用导出选项)。
按照此视频中的步骤,向电路添加一个继电器来打开和关闭 LED 灯带,并使用 PIR 传感器触发此行为。我也逐步介绍了如何设置一个 Home Kit 设备来查看和控制 LED 灯带的状态。
家庭自动化教程 - 添加一个继电器并更新 LED 灯带的流
点击查看大图
点击查看视频演示 查看抄本
尽管在原型设计期间压电式蜂鸣器能够有效地提供门上的传感器是否正常工作的即时反馈,但是我发现,在我将它放在用作封箱的塑料盒中之后,它的声音不太大,所以我决定从电路的最终版本中移除它。移除压电式蜂鸣器也在封箱中留出了更多空间用来安装我的 继电器,这个电控开关还是用于打开和关闭 LED 灯带。
连接继电器的电路图如图 6所示。根据表 1 中列出的信息,PIR 运动传感器连接到引脚 7,DHT11 温度和湿度传感器连接到引脚 40,继电器连接到引脚 13。
点击查看大图
每个元件都需要接地并连接到 5V 引脚,尽管 Pi Zero 上有很多接地引脚,但是只有两个 5V 引脚,所以可以使用一个小型电路试验板或者将一些线路焊接在一起,以在所有 3 个元件之间共享一个 5V 连接。
LED 灯带需要由一个单独的 12V 电源供电,并连接到继电器上通常是打开的(标为 NO)终端 (图 6),以便激活继电器就会关闭这些终端,点亮 LED 灯带。
创建所有电路和 Node-RED 流之后,下一步是安装家庭自动化系统。我将所有线路和元件捆绑在一起,装在一个封箱中,这个外壳由透明塑料容器与用于 PIR 传感器和电线的保险开关组成。(我 3D 打印了一个定制的箱子并使用硅酮对它进行了防水处理,以制作一个更耐久的封箱。)
此视频逐步指导您连接继电器和 LED 灯带,以及将元件捆绑到一个原型封箱中。
家庭自动化教程 - 将传感器和 Pi 组装到一个盒子中
点击查看大图
点击查看视频演示 查看抄本
点击查看大图
我循序渐进地介绍了使用 Node-RED 和集成的 Apple Home Kit,为一个基于 Raspberry-Pi 的基本家庭自动化系统搭建电路和设计流。
可以对此原型系统执行一些明显的改进,比如添加一个光线传感器,仅在 LED 灯带处于阴影或黑暗中时才点亮它。我的房门钥匙上有一个蓝牙低功耗标签 (Chipolo),而且有一个 Node-RED Chipolo 模块用于读取这些标签,所以一种可供选择的改进是读取该标签,识别我何时接近家门,以便打开灯,而不是仅通过运动点亮灯。
因为这个家庭自动化系统只是原型,所以我没有重点介绍安全性,但是 Node-RED 在默认情况下是不受保护的。所以在安装此系统之前,下一步是添加身份验证并保护编辑器(参见 https://nodered.org/docs/security)。
本教程中,我使用了来自以下 Fritzing 元件的电路图来创建自己的电路图: