使用 Raspberry Pi 2 和 Windows 10 IoT 的家庭自动化
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
应用和在线服务
| ||||
| ||||
|
关于这个项目
在当今时代,技术可以改善人类生活。技术正在十年复一年地发展。自动化早先是科幻小说,但今天不是。通过将最新技术与家相结合,我们可以建造一个很棒的家。借助树莓派和 Windows 10,我们可以构建一个能够自动操作家庭设备的家庭自动化系统。
开始使用
在开始项目之前,让我们先了解基础知识。考虑下图(整体配置):
房间配置
现在考虑房间场景,Arduino UNO 将控制设备并读取传感器数据。 Raspberry Pi 会定期请求 Arduino UNO 收集的传感器数据。 “房间架构”图描绘了 Arduino UNO 将如何与设备和传感器连接。每个房间都有多个可控设备(即灯、风扇、墙上插座等)、一个 PassiveIR(用于检测房间内是否有人)、一个温度传感器(LM35 用于收集室温)和 LDR(检测房间窗户附近的光强)。
设备地址映射
最重要的部分是我们将如何识别设备?这很简单。我们将通过房间号和设备号组合来制作设备地址。
例如:
所以到目前为止我们知道整体配置。简而言之,Raspberry Pi 将充当主要控制器。每个房间都有自己的一个 Arduino UNO,充当 Raspberry Pi 的奴隶。 Raspberry Pi 和 Arduino UNO 之间的通信将使用 I2C 完成。
原理图
为了让它更容易,让我们开始为第一个房间实施。参考原理图以正确方式连接组件。
I2C 总线条: 要连接多个 Arduino,您可以使用 I2C Bus Stripe,如下所示。
图> 图>
继电器板如何接线?
全部在硬件方面完成。现在是构建软件的时候了。
软件
我们的项目由 Raspberry Pi 2 和 Arduino UNO 组成。在 Visual Studio 2015 中开发的 Raspberry Pi 2 软件。我假设读者知道在 Visual Studio 2015 中为 Raspberry Pi 2 创建项目。我还假设用户具有 Arduino 框架、Visual C# 和 Windows Universal XAML 的中级知识。
让我们以如下形式理解软件:
- 协议(Raspberry Pi 2 和 Arduino 的交互方式)
- 类结构(Raspberry Pi 2 如何维护如此复杂的设备和房间)
- 用户界面(线框)
协议(Raspberry Pi 2 和 Arduino 如何通过 I2C 进行通信)
在进一步讨论之前,让我们先决定 Raspberry Pi 和 Arduino 的对话方式。要制定可靠的协议,首先必须有明确的通信目标或目标。考虑到这个项目,目标是:
- 读取传感器
- 读取设备状态
- 设置设备状态
让我们先开始定义协议。协议定义了通过总线进行通信的规则。协议无非是字节序列。
我已经定义了发送和接收字节的协议。发送字节固定为三个,接收字节数组为十四个字节。
参考下面的原理图来理解为这个项目定义的协议('X'表示随机值或'0',在通信时将被忽略):
图>图> 图>
名为“I2C_Helper”的类包含 PRi2 的通用应用项目中的协议实现。此类在通用 Windows 项目中可用。打开它:转到解决方案资源管理器> 库> 通信文件夹。在Arduino方面,很容易理解I2C库。
现在,我们已经定义了一个合适的通信方案,能够提供传感器、设备的状态和值,并提供设置设备状态的可访问性。
类结构(Raspberry Pi 2 如何维护对象)
如前所述,该项目考虑了整个家庭。家由多个房间组成,房间由多个设备组成。因此这种配置的OOP结构如下图所示:
图>
主要类“Home”由多个房间对象组成,作为房间的通用列表 (List
Room 由设备作为通用设备列表 (List
设备包含它们的详细信息以及使用协议模式打开和关闭它们的功能 - 2。AmbientLight、PassiveIR 和 Temperature 类提供对房间环境数据的访问。 Room 对象维护传感器数据并使用协议 Mode - 0 定期刷新它们。
用户界面
任何应用程序都必须是用户友好的。要制作用户友好的应用程序,请从线框开始。假设您将使用自己的应用程序并找出主要目标以及如何以最易于最终用户使用的方式集成它们。
在此应用程序的场景中,我们的主要目标是:
- 房间管理
- 设备管理
- 外部服务,如 GSM 通信、互联网通信等
为此,我已将问题拆分为:
- 主页:提供基本的设备状态信息、日期时间和锁定
- 喜爱的设备:直接访问喜爱的设备
- 房间页面:提供对已配置房间及其设备的访问
- 常见的水装置:水泵和间歇泉
- 设置/配置:提供房间及其设备的管理
线框: 图> 图> 图> 图>
基于线框,我开发了 UI,如下所示。您可以下载完整的源代码。文末提供下载链接。
图> 图> 图> 图> 图> 图> 图> 图> 图> 图> 图> 图> 图>所以,已经开发了UI。希望您可以根据需要对其进行修改。请随时发表评论以获得帮助。
如何配置?
我试图让这个软件尽可能简单。只需少量配置,您就可以直接使用此树莓派 2 操作设备。分步配置如下所示:
图> 图> 图> 图> 图> 图> 图>
如何使用此应用控制水泵和间歇泉?
您可以按照添加设备的方式连接水泵和间歇泉。但是你不能将水泵或间歇泉直接连接到继电器板上来给它们供电。它会炸毁继电器板并有危险。
操作水泵或间歇泉,将水泵或间歇泉与接触器连接,将接触器线圈与继电器板连接。所以现在,当您操作设备时,继电器会激活接触器的线圈,从而启动/停止泵或间歇泉。购买接触器前,请先确定其线圈额定值和接触器额定值。接触器种类繁多。所以用你的水泵的等级来验证它。建议购买额定值略高于水泵额定值的接触器。
如何将此解决方案部署到 Raspberry Pi 2?
您可以参考此链接了解部署过程。
如何将此应用注册为启动应用?
很多爱好者都希望他们的应用程序在 Raspberry Pi 2 启动后立即启动。为此,请阅读我的文章:Windows 10 IoT Core:设置启动应用
已知问题
Arduino 启动
当 Arduio 启动时,它会闪烁 D13 引脚。最好不要在 D13 上连接任何继电器引脚,因为当 Arduino 启动或重新启动时,D13 会闪烁一次,如果任何与 Relay(通过 D13 控制)连接的设备也会闪烁。
解决方案: 有两种选择:第一种,根本不与 D13 真正连接。第二个有点复杂。您可以在启动时重写不使用 D13 的 Aruino OptiBoot 固件,并将该引导加载程序烧录到 Arduino。
时钟问题
Raspberry Pi 2 没有板载实时时钟芯片。因此,在断电或重新启动后无法保持时间。因此必须附加外部 RTC 并对其进行编程以保持日期时间。
解决方案 :可以使用 NTP,但需要 Internet 连接,甚至 Arduino 也可以处理 RTC 和 Raspberry Pi 启动时的日期时间请求。用 RPi 2 直接连接外部 RTC 也不错。
调试问题
在用 C# 开发通用应用程序时,我遇到了很多问题。通用应用程序是 WinRT 的超集,因此需要执行如此多的异步操作。如果异步操作出现错误,解决起来就很头疼。每当发生任何异常或错误时,大部分时间我都会遇到以下屏幕:
没有指向容易出错的行,没有程序员友好的消息,什么都没有。我必须放置这么多断点才能找出错误的原因。在调试中,有时通用应用程序只是在没有任何事先通知的情况下关闭,突然我的观察窗口变得无用。此链接描述了行为的原因。
解决方案 :在预期容易出错的行之前放置断点。
简而言之,目前(本文发表时)通用应用程序很棒,但缺少常规 Windows 应用程序具有的调试功能。
未来
在功能、新想法甚至克服现有限制方面都没有限制。但是一次添加每个功能是不可行的。在此版本中,本文让您了解 Raspberry Pi 2 和 Windows IoT 的真正力量。 Windows 通用 XAML 是适用于 Windows 10 IoT 和 Raspberry Pi 2 的出色 GUI 框架,具有出色的板载图形处理器。通过将这两者结合起来,可以创建一个外观非凡的 GUI 解决方案。此外,Raspberry Pi 2 拥有 900MHz 四核 CPU,这对于多线程(在 UWP、Task 中)解决方案来说非常棒。对于想要学习嵌入式和软件系统基础知识(即 I2C 总线通信、如何操作设备、自定义协议设计、实际应用程序和线框的 OOP 设计)的人来说,这是一个基础到中级项目。
将来,我们可以添加使用 RadioFrequency 或 InfraRed 而不是 I2C 总线通过远程设备进行通信的功能。可以为移动设备集成使用 Azure 的 Web 管理门户。此外,真正的自动化将像基于事件的操作、与 RTC 芯片的定时操作一样集成。例如,在晚上 7:00 打开后院灯。并在晚上 10:00 关闭它们;基于事件的一个很好的例子是当环境光强度降低到特定强度以下时打开花园的灯等等。因此,此适用于 Raspberry Pi 2 的新 Windows 10 IoT Core 平台没有任何限制。
祝你好运,注意安全。
随时寻求帮助或问题。
代码
- Arduino 草图
Arduino SketchC/C++
/* Arduino Sketch v0.4 此草图是为“使用 Raspberry Pi 2 和 Window 10 IoT 的家庭自动化”编写的,请参阅此链接:https://www.hackster.io/AnuragVasanwala/home-automation 此草图经过测试仅在 Atmega328p 上。此草图准备了一个 Arduino 设备作为 I2C 总线上的从设备,该总线由运行 Windows 10 IoT Core 的 Raspberry Pi 2 操作。目标: + 定期收集传感器数据(功能:循环) + OnRecevive,收集 3 字节模式指令并根据它执行操作。 (功能:ReceiveData)+ OnRequest,根据OnReceive选择的模式发送14字节的响应数组。 (功能:SendData)此草图按原样提供,没有任何保证。您可以将其用于个人和商业用途。对于由此草图造成的任何数据丢失或伤害,我概不负责。*/#include#define _DEBUG_/* Arduino 的 I2C 从地址 */#define SLAVE_ADDRESS 0x40/* PIN DECLARATION */int Pin_AmbientLight_LDR =A0;int Pin_PassiveIR =2;int Pin_Temperature =A1;/* 全局变量 */volatile short Value_AmbientLight_LDR, Value_Temperature;volatile bool Value_PassiveIR;/* 协议变量 */byte Mode, Pin, Value;byte Response[14];void setup() { // 初始化引脚 pinMode(Pin_AmbientLight_LDR, INPUT); pinMode(Pin_PassiveIR, INPUT); pinMode(Pin_Temperature, INPUT); pinMode(0, 输出); pinMode(1,输出); pinMode(3,输出); pinMode(4,输出); pinMode(5, 输出); pinMode(6, 输出); pinMode(7,输出); pinMode(8,输出); pinMode(9,输出); pinMode(10,输出); pinMode(11,输出); pinMode(12,输出); pinMode(13,输出); pinMode(A2,输出); pinMode(A3, OUTPUT);#ifdef _DEBUG_ Serial.begin(9600);#endif // 在地址 'SLAVE_ADDRESS' 上初始化 I2C Slave Wire.begin(SLAVE_ADDRESS); Wire.onRequest(SendData); Wire.onReceive(ReceiveData);}void loop(){ // 读取 LDR // Arduino 支持 10 位模拟读取。 // 因此我们需要将其转换为 8 位。 Value_AmbientLight_LDR =analogRead(Pin_AmbientLight_LDR); Value_AmbientLight_LDR =map(Value_AmbientLight_LDR, 0, 1023, 0, 255); // 读取 PassiveIR 值 Value_PassiveIR =(digitalRead(Pin_PassiveIR) ==HIGH) ?真假; // 读取温度传感器并将电压转换为摄氏度 Value_Temperature =(short)((float)(analogRead(Pin_Temperature) * 0.48828125)); // 等待 100 ms delay(100);}// I2C 接收到的回调 Datavoid ReceiveData(int byteCount){ // 读取第一个字节,即协议模式 Mode =Wire.read(); // 读取第二个字节,即 Pin。仅适用于模式 2 Pin =Wire.read(); // 读取第三个字节,即 Pin-Value。仅对模式 2 有效 Value =Wire.read(); // 如果接收到模式 2,则信号指定引脚 if (Mode ==2) { digitalWrite(Pin, Value); }#ifdef _DEBUG_ Serial.print(Mode); Serial.print(" "); Serial.print(Pin); Serial.print(" "); Serial.println(Value);#endif}void SendData(){ switch (Mode) { case 0:// Mode:Read Sensor Response[0] =(byte)Value_AmbientLight_LDR; // Value_PassiveIR 是布尔值,因此我们需要将其转换为字节 Response[1] =(byte)((Value_PassiveIR ==true) ? 1 :0); // Response[2] 字节是温度的符号字节 // 0 - -ve 温度 // 1 - +ve 温度 Response[2] =(byte)((Value_Temperature <0) ? 0 :1); Serial.println(Value_Temperature); // -ve 温度不能以字节形式发送。将其转换为 +ve 等效 Response[3] =(byte)((Value_Temperature <0) ? (Value_Temperature*(-1)) :Value_Temperature);休息; case 1:// 模式:读取设备状态响应[0] =(digitalRead(0) ==HIGH) ? 1:0;响应[1] =(digitalRead(1) ==HIGH) ? 1:0;响应[2] =(digitalRead(3) ==HIGH) ? 1:0;响应[3] =(digitalRead(4) ==HIGH) ? 1:0;响应[4] =(digitalRead(5) ==HIGH) ? 1:0;响应[5] =(digitalRead(6) ==HIGH) ? 1:0;响应[6] =(digitalRead(7) ==HIGH) ? 1:0;响应[7] =(digitalRead(8) ==HIGH) ? 1:0;响应[8] =(digitalRead(9) ==HIGH) ? 1:0;响应[9] =(digitalRead(10) ==HIGH) ? 1:0;响应[10] =(digitalRead(11) ==HIGH) ? 1:0;响应[11] =(digitalRead(12) ==HIGH) ? 1:0;响应[12] =(digitalRead(A2) ==HIGH) ? 1:0;响应[13] =(digitalRead(A3) ==HIGH) ? 1:0;休息; case 2:// 模式:设置设备状态响应[0] =(digitalRead(Pin) ==HIGH) ? 1:0;休息;默认值:中断; } // 回传响应 Wire.write(Response, 14);}
Raspberry Pi 2(Windows Headed 应用程序)软件
https://github.com/AnuragVasanwala/Home-Automation--RPi2-WinIoT-示意图
您可以通过在总线上连接具有唯一 I2C 从地址的单个 Arduino 来添加多个房间。 包含完整原理图的Fritzing文件。 Home%20Automation%20Schematic%20-%20Anurag%20S%20Vasanwala.fzz制造工艺
- Python 和 Raspberry Pi 温度传感器
- 带有 Sensorflare 和 RaspberryPi 的 433MHz 智能家居控制器
- 使用 Raspberry Pi 和 Twilio 的支持语音和 SMS 的光传感器
- 使用 Raspberry Pi 监控家中温度
- RASPBERRY PI 家庭自动化
- Raspberry Pi 2 上的 Windows 10 IoT Core – Adafruit 传感器数据
- Windows 10 IoT Core 和 SHT15
- Windows 10 IoT Core for Raspberry Pi 3 Model B+
- 使用 KINECT 和 RASPBERRY PI 的 SONBI 机器人人体检测
- 物联网和家庭自动化:未来会怎样?
- GPS 数据记录器、空间分析和 Azure IoT 中心。
- 供应链中的自动化和物联网:下一步是什么?