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

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

基于树莓派的家庭自动化系统

发布时间:2021-07-12
分享到:

基于树莓派的家庭自动化系统

发布时间:2021-07-12
分享到:

该系统是基于Raspberry Pi 2 和 Windows 10 IoT Core 的家庭自动化系统。该系统包含适用于 iOS、Android、Windows、Mac OSX 的 Web 应用程序,可用于控制虚拟执行器。

所需元件:

1、输入

2、输出

  • 灯(吸顶)(继电器驱动,不调光)
  • 插座(继电器驱动,不调光)
  • 卷帘(窗)(由上下两个继电器驱动)
  • 风扇(吊顶)(每档3个继电器驱动)
  • 浴室风扇(每个档位由 2 个继电器驱动)

硬件:

1、I2C总线

  • 以 5V 驱动总线:RaspberryPi 以 3.3V 驱动总线,因此需要 I2C 电平转换器 (P82B96),这是第一个(也是唯一一个)添加到 RaspberryPi 2 的设备(控制器),用于此连接的电缆应尽可能短。
  • 使用 CAT7 之类的双绞线电缆:将一对用于 SDA&GND,另一对用于 SCL&GND,。SDA&SCL 勿使用单根双绞线电缆,还要确保电缆的屏蔽层连接到 PE(在德国)。
  • 首选绞合电缆
  • 在 SDA 和 SCL 的总线末端添加 10k 的上拉电阻。
  • 将总线速度限制为 100kbits(标准模式)。
  •  I2C 缓冲器 (P82B96),该 IC 可用作电平转换器或可用于分隔物理段中的总线,缓冲区应放置在总线的中间。

这种优化的 I2C 总线用于连接电源分配器内的每个板。

2、继电器板(输出)

为继电器和 IC 添加了支架,因此如果其中一个损坏,可以轻松地更换它们。另一点是可以使用PCA9555D代替MAX7311,

 

HSRel5 中继板:

  • 具有5个继电器、3个GPIO 
  • 所有需要的端口都取自具有 8 个GPIO的内部PCF8574 8 位端口扩展器,前 5 个用于继电器,后 3 个可用于其他输出

继电器需要 12V 才能工作,而端口扩展器(只能驱动 LED)无法提供。因此,需要一个中继驱动程序。继电器与继电器驱动器相连,而继电器驱动器又与逆变器相连。这个逆变器是必需的,因为在 IC 上电后,端口扩展器上的所有端口的状态都是高电平,将关闭所有继电器。 

如果第一个继电器要关闭,则需要使用I2C总线向端口扩展器发送00011110(MSB)。这会将第一个端口设置为LOW (其他端口也被更新)。端口扩展器的第一个端口连接到逆变器的第一个输入端。逆变器的第一个输出连接到继电器驱动器 (ULN2803) 的第一个输入。作为链的最后一部分,继电器连接到继电器驱动器的第一个输出端。

继电器板 HSRel8(+8) :

  • 使用MAX7311作为端口扩展器
  • 包含 8 个继电器、8 个GPIO 

该板不需要硬件逆变器,这意味着HSRel5 上继电器的高电平状态是关闭,而HSRel8(+8) 上的高电平状态是开启。 这种不同的行为由这些设备的驱动程序处理。

每个灯、插座等都连接到这些继电器。

3、端口扩展器(输入)

按钮、运动检测器和簧片开关(用于窗户)连接到 来自CCTools 的名为I2C-Port16 HS的电路板 。该板包含一个端口扩展器(MAX7311 )、每个端口的上拉电阻(5V、10K)和陶瓷电容器(100NF )。该板可使用 12V 或 5V 电源。陶瓷电容器用于滤除噪声(毛刺滤波器)。

每个输入设备(按钮、运动检测器、簧片开关)都有自己的电缆连接到电源分配器。甲CAT7电缆用于每个输入装置,因为它需要具有屏蔽,其与PE(保护接地)相连接。具有多个按钮(如卷帘按钮)的点只需使用一根CAT7电缆即可连接。

在电源分配器处,每个输入设备都连接到端口扩展器的一个端口和GND 。由于上拉电阻,端口状态默认为高电平。按下按钮会将端口连接到GND ,从而导致端口处于低电平状态。运动探测器和簧片触点也以这种方式工作。

共享中断电缆连接到所有输入板。默认情况下,此电缆是上拉的。如果任何端口扩展器的状态发生变化,相应的端口扩展器会将中断状态设置为低电平。此行为可防止使用 I2C 总线对所有端口扩展器进行连续轮询。Pi2 上的软件仅轮询相应的GPIO。 如果中断 GPIO 处的状态已更改,则会相应地轮询每个输入板的当前状态,并在需要时触发事件。

4、树莓派 2

Raspberry Pi 2 运行 Windows 10 IoT,并通过定制外壳安装到配电器上。它还具有带状态 LED 的原型屏蔽罩、带上拉电阻 ( 10K )、保护电阻 ( 1K )的中断端口和用于毛刺过滤的陶瓷电容器 ( 100NF ),所有电缆都可以使用螺钉端子接线。

5、温湿度传感器

使用DHT22 (AOSONG)测量每个房间/地点(当前为 10)的当前温度和湿度。该传感器使用不支持寻址的专有协议提供当前温度和湿度。这要求每个传感器都连接到微控制器。添加一个Arduino Nano V3.0作为I2C总线的从设备,Arduino 从所有连接的传感器每2.5秒,并且高速缓存至本地读取值。发送端口 id (0-10) 后,可以从Arduino Nano读取这些值。使用 I2C 总线从寄存器读取数据时的行为是相同的。

温度和湿度使用两种不同的视图显示在 Web 应用程序中。

(WEB应用程序的温度和湿度)

湿度(“Luftfeuchtigkeit” )条目右侧的图标表示墙壁上霉菌生长的风险是否增加。小于 60% 的值是绿色,小于 70% 是黄色,高于 70% 是红色。

Web 应用程序还提供所有传感器的概览。

硬件设置:

下图说明了使用输入和输出板的配电器上的硬件设置,未显示 12V/5V 电源和 N/PE 连接。

433Mhz远程中继 

此功能使继电器板成为可选的,负责DHT22 (温度和湿度)传感器的Arduino Nano也发送 433Mhz 信号。发送器(FS1000A )与温度和湿度传感器一起安装在房屋中央房间的箱子内。为了进一步增加发射器的范围,它额外使用 12V 供电(也适用于 3.3 但范围较短)。

远程中继的主要问题之一是它们不发送任何状态信息。因此,用户有可能通过使用原始遥控器将状态更改引入系统。为了强制同步,软件解决方案每 5 秒自动更新一次状态。这使 Web 应用程序上显示的状态尽可能可靠(但使原始遥控器的使用无用)。  

远程继电器可用于每个自动化系统,并提供与继电器板继电器相同的功能。

433Mhz 遥控器的代码目前只能通过原型板上的电路进行手动配置。然后将这些代码复制到配置中。下面引用了所需电路板的Fritzing草图,Arduino草图位于文件夹中的存储库中 CK.HomeAutomation.SensorsBridge\RemoteCodeFinder。 

软件:

下面引用的存储库包含 Visual Studio 2015 解决方案和所有相关项目。只需将 Raspberry Pi 2 用作家庭自动化控制器,同时通过为其他继电器板或传感器编写自定义驱动程序来进行扩展。 

软件解决方案的项目分为:

  • 应用程序(包含网络应用程序)
  • 控制器(包含 Pi 的启动项目和家庭配置)
  • SDK(包含所有共享项目)

解决方案概述

软件架构(点击放大)

CK.HomeAutomation.TraceViewer

该项目包含一个控制台应用程序,用于显示控制器(Pi2 实例)发送的跟踪消息。当前,所有通知都使用 UDP 套接字连续发送到广播地址。因此需要在防火墙上打开一个端口(例如 19227),使用 TraceViewer 来查找错误和/或错误配置。

示例跟踪

发送通知所需的所有类都位于项目中CK.HomeAutomation.Notifications。

CK.Home自动化.网络:

该项目包含基本 HTTP 服务器的实现。Web 应用程序需要 HTTP 服务器,它以 JSON 格式提供状态信息并接受状态更改的请求。

HTTP 服务器还能够托管 Web 应用程序。由于包名称不同,必须使用管理 SMB 共享将 Web 应用程序的内容手动上传到目标文件夹。 

目标文件夹: \\[IP]\c$\Users\DefaultAccount\AppData\Local\Packages\CK.HomeAutomation.Controller-uwp_p2wxv0ry6mv8g\LocalState\app

CK.HomeAutomation.Controller.*

Controllers 文件夹中的每个项目都是一个实施IoT 后台任务的启动项目。

在测试解决方案之前,您应该熟悉以下任务:

从头开始设置带有 Windows 10 IoT 的 Raspberry Pi2 ( https://ms-iot.github.io/content/en-US/win10/SetupRPI.htm )
使用 Microsoft PowerShell 远程会话 ( https://ms-iot.github.io/content/en-US/win10/samples/PowerShell.htm )连接 Raspberry Pi2

将通用 Windows 应用程序部署到 Raspberry Pi2。

解决方案目录还包括一个小的PowerShell脚本SetupRaspberryPi.ps1,该脚本被调用以执行用于设置 Raspberry Pi2 的通用命令链。

空控制器初始化

CK.HomeAutomation.Actuators:

该项目提供了最高级别的抽象。家庭、房间末端每个执行器如按钮、灯、插座等都在这个项目中实现,并根据每个执行器的特性提供特殊的事件和方法。

可以使用 fluent API 创建房间,这使得配置易于阅读和理解。 

阅览室配置示例(点击放大)

MotionDetector - 执行器:

该执行器用于检测房间内的人和运动。

运动检测器执行器的实现提供了两个事件。两者中的第一个MotionDetected是检测到运动时触发的事件。物理运动检测器将输出保持在高电平,直到没有检测到进一步的运动,此时 会触发第二个事件DetectionCompleted。

下图显示了 Web 应用程序中运动检测器的条目。可以使用 Web 应用程序停用每个运动检测器(仅在软件中)。红点表示当前检测到运动。

运动检测器模板

按钮 - 执行器:

这个执行器代表一个物理按钮。该按钮有两个事件,表示它被按下。事件PressedShort ,如果按钮被按下一个短的持续时间(<1.5秒),而事件被触发PressedLong是否已按下了更长的持续时间的按钮仅触发(> 1.5秒)。如果超过持续时间(1.5 秒)并且没有释放按钮,第二个事件也会自动触发。这两个事件允许按钮具有多种功能。

例:

按钮执行器配置示例(点击放大)

该解决方案还包含一个. 此按钮实现相同的界面 ( ),只能使用 Web 应用程序“按下”。VirtualButtonIButton

插座、灯、BinaryStateOutput - 执行器:

该类BinaryStateOutput仅用于支持二进制状态(ON和OFF )的每个执行器。这些执行器的示例是Socket和Lamp。基本实现提供了更新(ON和OFF )或切换状态的方法。Buttons 可以与实现 的对象交互IBinaryStateOutputActuator,这允许添加多个自定义执行器。

下图显示了每个二进制状态输出的模板。左侧的图标对于插座和灯是不同的。可以使用Web 应用程序的配置文件 ( )定义自定义图标,例如“ Mückenstecker ”条目中的毒瓶Configuration.js。

二元状态输出执行器模板

组合二元状态执行器:

每个类型的物理执行器 BinaryStateOutput 都可用于创建逻辑二进制状态执行器。如果状态应该被切换,则必须将一个执行器设置为“主”,这是确定新状态所必需的。执行器有自己的 ID,可以像任何其他二进制状态输出执行器一样使用(实现了所需的接口)。

这种实现的一个重要优点是处理状态更新的方式。通常一个二进制状态输出的新状态直接通过I2C总线一个一个地提交给每个设备。这种行为会在每个执行器状态更新之间产生短暂但可见的延迟。所述 CombinedBinaryStateActuator 防止使用内部变动跟踪这种延迟。

例子:

组合灯配置示例(点击放大)

状态机 - 执行器:

该执行器允许端口(继电器)或其他二进制输出执行器具有多种状态。 

带风扇的示例:

吊扇配置示例(点击放大)

状态机提供了关闭它或移动到下一个状态的方法。如果已达到状态机的最后一个状态并且接下来应应用初始状态,则状态将重置为OFF 。

状态机的另一个用例是为其他几个执行器创建模板或“情绪”。

示例心情:

办公室心情示例(点击放大)

该方法WithTurnOffIfStateIsAppliedTwice确保状态机的状态将在第二次激活特定触发器时更改为OFF ,因为配置的状态仍然处于活动状态(例如:按下“ DeskOnly ”按钮将激活“ DeskOnly ”情绪。如果在“ DeskOnly ”情绪仍处于活动状态时再次按下按钮,则执行器将应用关闭状态。不需要用于关闭状态的专用按钮。)。

下图显示了状态机的模板。可以使用 Web 应用程序的配置文件更改每个状态的标题和图像。

状态机模板

温度传感器/湿度传感器:

使用 I2C 传感器桥读取温度和湿度值。这两个值都是从单个物理设备读取的,但分为温度执行器和湿度执行器。这些值每 10 秒自动轮询一次。

该解决方案提供了多种自动化:

1、自动开启和关闭自动化

此自动化将连接的二进制状态输出设置为ON。按钮或运动检测器可用作触发器。需要指定所需的ON状态持续时间。如果超出该范围,则状态设置为OFF 。如果超出指定范围,状态将自动设置为OFF 。可以提供启用自动化规则的可选时间范围。“仅白天”或“仅夜间”的预定义范围可用(需要气象站对象)。

例子:

自动照明的示例配置(点击放大)

2、AutomaticRollerShutterAutomation:

这种自动化用于根据多种条件自动移动多个卷帘。这些条件之一是日出和日落,这意味着卷帘在日出时自动向上移动,在日落时自动向下移动(需要气象站对象)。也可以为日出和日落添加差异。根据日出和日落功能,可以指定“之前不打开”的时间,以确保在到达该时间点之前不会打开卷帘。另一个条件是室外温度(也需要气象站对象),如果室外温度超过特定值(例如 28°C),卷帘门会自动关闭。此功能适用于屋顶窗。

卷帘的位置也通过时间测量进行跟踪。必须配置启动和完全关闭之间所需的持续时间。

例子:

卧室卷帘配置示例(点击放大)

以下屏幕截图显示了 Web 应用程序中卷帘的条目。按钮上方的进度条显示当前位置。

带有位置跟踪功能的应用程序中的卷帘

3、自动有条件的自动化:

此自动化用于在条件匹配时将多个二进制状态输出的状态设置为ON 。此自动化用于花园中仅在夜间亮起的灯。它可以指定一个时间范围为ON的状态,并且多个时间范围OFF状态。也可以将日出和日落用于ON状态(需要气象站对象)。

例子:

“始终开启”配置示例(点击放大)

4、通用自动化和复杂条件:

新实现的最新功能是通用自动化和条件框架。通用自动化旨在在满足配置条件时执行自定义操作。每次通过按钮、运动检测器、间隔或任何其他代码调用触发器时都会检查这一点。 

带条件的通用自动化(理论上)

带条件的通用自动化(在代码中)

气象站:

许多自动化和条件取决于环境条件,例如当前天气、日出和日落时间、室外温度或湿度。所有这些信息目前由OpenWeatherMap的 WebApi 支持的虚拟气象站每 60 秒提供一次。虚拟气象站是使用界面实现的IWeatherStation,这使得无缝集成位于花园中的物理站变得容易。

CK.Home自动化.硬件:

该项目包含所有当前支持的输入和输出设备的驱动程序。特别是继电器板、CCTools 的输入板和 433Mhz 远程开关。还包括Arduino Nano (传感器桥和 433Mhz 发送器)的驱动程序和源代码。所有更高级别的对象(如执行器和自动化)都是针对接口实现的,以向金属硬件类的具体裸机添加抽象层。这使得以后可以轻松地为其他板和传感器添加更多驱动程序。

CK.Home自动化.遥测:

该项目包含两个组件。第一个是 CSV 写入器,它将每个更改的状态写入包的“LocalState”目录。可以使用管理 SMB 共享从 Pi2 下载此文件:  \\192.168.1.15\c$\Users\DefaultAccount\AppData\Local\Packages\CK.HomeAutomation.Controller-uwp_p2wxv0ry6mv8g\LocalState\BinaryStateOutputActuatorChanges.csv.

CSV 文件的示例内容:

CSV 文件的示例内容(点击放大)。

第二个组件是AzureEventHubPublisher. 此组件将任何状态发生更改的事件以及任何传感器更改的值发送到Microsoft Azure EventHub 。如果按下按钮或检测到运动,也会生成事件。该解决方案包含用于创建所需SQL数据库表的SQL脚本和StreamAnalytics作业所需的查询(在文件夹 #Azure 中)。

Example data at the Azure SQL database (Click to enlarge)

每个更改的执行器状态都会生成到Azure SQL数据库中的条目。第一个条目包含 START事件和新状态。第二个条目包含END 事件以及该状态的总持续时间(以秒为单位)。 

Humidity values in PowerBI report

网络应用程序:

软件解决方案包含该项目 CK.HomeAutomation.App。这个项目是一个建立在AngularJS 、jQuery和Bootstrap之上的网络应用程序。从控制器 (Pi2) 读取房间配置,并根据现有房间生成 UI。

可以使用 文件直接从文件系统打开 Web 应用程序,也可以将其 上传到 Web 服务器。该文件 用于配置和翻译 Web 应用程序。必须在配置文件中设置控制器(Pi2 实例)的 IP 地址:index.htmlConfiguration.js

仅当 Web 应用程序托管在 Web 服务器上时,它才可以添加到iOS的主屏幕(我个人使用带有 nginx 的 BananaPi)。将 Web 应用程序添加到主屏幕的描述如下:http :  //www.tech-recipes.com/rx/44908/ios-add-website-shortcut-to-home-screen/

示例阅览室

在 Raspberry Pi2 上托管 Web 应用程序已经在进行中,但目前不完全受支持。

终端

该网络应用程序也在客厅运行,旧的 iPad 3 用作终端。

iPad 3 终端

 

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论