项目级别:中级到高级
软件先决条件
Windows IoT 新的 Windows IoT 为开发人员提供了一些功能,可以在更短的时间内创建强大而高效的应用程序。Windows IoT 驱动的 Raspberry Pi 是这个家庭自动化项目的关键要素。
Raspberry Pi 充当系统的主人。Raspberry Pi 通过 2.4GHz ISM Band RF Link 连接到许多从属设备。从设备是一个基于 PIC18F 微控制器的电路板,具有与 Raspberry Pi 建立双工无线链路所需的电路和程序。除了不同的设备 ID/地址(应该是唯一的)和设备类型编号外,每个从设备都具有相同的电路和 PCB 设计。Windows IoT 上的 C# 程序能够同时处理任意数量的从属设备。
1. 智能手机/电脑可用于控制家电。
2. Raspberry Pi 通过 ISM 频段 2.4GHz 无线链路连接到一个或多个从设备。
3. 这些从属设备允许Raspberry Pi 远程控制家用电器/电子设备。
4. 可以进行不同级别的控制。
一种。基于继电器的控制(简单的开/关功能)。
b. 基于 Triac 的控制(可以控制光强度或平均功率)
C。电机控制(基于三端双向可控硅或直流电机驱动)
d. 用户可以毫不费力地添加其他控制方法,如 PWM、反馈系统等。
5. 我已经编写了一个移动应用程序来启用基于 Internet 和本地网络(数据报套接字)的控制。
6. 树莓派添加新的从设备无需更改程序。只需点击奴隶的“添加我”按钮。Raspberry Pi 会自动将设备添加到网络(自动扫描选项也可用)。
7. 数字和模拟传感器都可以连接到从设备。由于 Raspberry Pi 从设备通信是双向 RF 链路,因此 Raspberry Pi 无需任何物理连接即可读取传感器读数。
8. 简洁的GUI C#程序将帮助用户检查连接状态、网络监控、设备控制等。
9. 存在基于定时器的控制选项。设置您想要关闭/打开特定设备的时间,Raspberry Pi 将完成剩下的工作。
10.无需太多修改即可轻松引入语音检测/语音命令。
11. 传感器读数可以写入带有时间戳的 Azure 数据库。电气设备也可以通过 Azure 云数据库进行控制。
在这个家庭自动化系统中,Raspberry Pi 没有任何物理连接,除了 nRF SPI 通信链路 [不包括电源、以太网/WiFi 和 HDMI(可选)等基本连接]。所有的控制、监控、决策、触发和切换操作都在 Raspberry Pi 中完成。Raspberry Pi 使用双工无线链路(非 WiFi 或蓝牙标准)与从属设备通信。整个C#程序可以从本文的软件部分(GitHub)下载。
(注意:由于程序的硬件IO要求,编译到x64/x86平台可能无法正常工作。
注意:我为无线模块编写的 nRF 类没有利用该模块的真正潜力。一旦我有足够的时间,我将更新 GitHub nRF 类文件。)
C# 应用程序支持 3 种方式来控制家用电器甚至工业系统。
1. RPi 的 GUI。在 Raspberry Pi 中运行的漂亮 C# GUI 将允许您监视网络命令、不同的传感器读数、控制家用电器和自动控制以及其他后台任务,如 Azure DB 读/写、计时器等。
设备框列出了所有可用的从属设备。您可以随时删除或添加从属设备。
在 GUI 的顶部,您可以看到通过 nRF 无线链接从从属设备提取的不同传感器读数。C# 应用程序使用这些传感器读数来自动控制电气设备。
在底部,“网络日志”框显示通过 Azure 云数据库或 LAN 从移动设备/计算机接收到的所有命令以及连接设备的 IP 地址和名称。在其下方,放置了一个状态栏。它向用户显示所有必要的信息和通知。通过打开“自动更新”按钮,您将从选定的从属设备的传感器数据中获得实时更新(可以将这些传感器数据写入带有时间戳的 Azure DB 中)。此按钮还可用于检查从设备是否在 nRF24 的 RF 链接的无线范围内。“自动控制”复选框用于启用“自动控制”模式,该模式可以根据光强度传感器读数调整光强度。在 PIR 传感器的帮助下,还可以对人员存在发出警报。
除了控制之外,还可以通过 LAN 或 Azure 云数据库传输消息。
2.本地数据报包。
我开发了一个简单的 Android 和 Windows 通用应用程序,用于通过本地网络 (LAN) 控制设备。
3. 基于Azure 云数据库的控制。
上面说的同一个应用程序有一个特殊的模式通过互联网(通过 Azure 云)向 Raspberry Pi 发送命令
(注意:我制作这些应用程序只是为了测试功能。如果你擅长 GUI 设计,你可以做得更好
注意:如果没有运行 Windows IoT 的强大 Raspberry Pi 和上述 C# 应用程序,则无法使用此应用程序。
注意:所有网络命令都以一个字符开头, '!'
您可以在 Pi 的 C# 程序的 MainPage.cs 文件中看到完整的命令。)
从机
从设备是一块基于 PIC18F24K20 的板,带有 nRF24 无线模块。除了单独的设备类型代码和唯一的 ID/地址编号外,所有从属设备都具有相同的电路和固件程序。因此,不费吹灰之力就可以轻松制作任意数量的从属设备。
每个从属设备都有一个“AddMe”和“RemoveMe”按钮,用于将该从属设备注册到 Raspberry Pi 或删除从属设备。
我添加了一个“自动扫描”选项。现在,连同“AddMe”按钮,您可以扫描其无线范围内的从属设备。此选项将允许您添加树莓派无线范围内的所有从属设备,而无需按从属设备的“AddMe”按钮。您所需要的只是“扫描”并等待可用设备列出。>
传感器可用
1.温度传感器(LM35)
2.光强度传感器(LDR)
3. PIR传感器(HC-SR601)
从设备原理图和 PCB 设计
您可以从本文的硬件部分下载 Eagle CAD 文件。
(我没有在互联网上找到任何好的 nRF Eagle 库。所以我自己制作了一个。您可以在本文的自定义部件和外壳部分找到这个 nRF24L01+ 库)
从设备如何工作
Slave Devices类似于无线扩展树莓派的IO口。尽管无线通信系统有点复杂,但使用起来非常方便。永远不可能仅仅为了实施自动化系统而为整个家庭布线。所以,我决定选择无线系统。另一个附加优势是,您可以随时将家庭自动化系统扩展到任何房间,而无需添加或更新一行代码。您所需要的只是奴隶的“点击添加我”按钮。想象一下用有线系统做同样的事情!!
正如我所说,slave 设备以灵活性和更多控制扩展了 Raspberry Pi 的范围。由用户决定他/她应该分配给从属设备的控制功能。就像模板一样,我制作了 5 种不同类型的从属控件。您可以毫不费力地将它扩展到任何类型的任何数字。
public enum device_type : byte
{
Test_Device = 0, //Used a prototype for testing
Triac_Device = 1, //Triac/Solid state relay high speed switching
Relay_Device = 2, //Common Relay Control
Buzzer_Device = 3, //Buzzer and Alarm Control board (Not implemented)
Motor_Device = 4
};
上面的枚举语句显示了我的程序中可能的从属类型。
A. 三端双向可控硅装置
(注:对功率器件不熟悉的可以省略该类Slave Devices。)
Triac 是一种交流功率器件,可用于电机速度控制、光强度控制等快速开关应用。适当的触发是必要的,在设计 Triac 电路时还应考虑换向方法。从设备和 TRIAC 控制板的集成使系统更加有用和灵活。Triac 的触发有点棘手。您需要一个过零检测器来了解交流电 (LM358) 的过零点。从机内部的 PIC18F24K20 微控制器将识别过零点(来自 LM358 的方波)并根据我们从 Raspberry Pi 发送的触发延迟触发三端双向可控硅开关。
B. 中继装置
作为中继设备配置和连接从站非常容易。除了 5v 或 12v 继电器、BC547 NPN 晶体管 1k 电阻器和 1N4001/1N4004/1N4007 二极管或 ULN2003 达林顿对 IC 之外,您不需要任何额外的大型电路。我建议使用现成的简单继电器板(它非常便宜且容易获得,不会超过 2 美元[至少在我们地区])
C. 12v直流电机装置
它是中继设备的扩展。这里不是继电器电路,从设备控制两个 12v 直流电机。流行的电机驱动器 IC L293 或 L93D 可用于这些设备。
对于 Raspberry Pi 和从属设备之间的无线通信,我使用了 nRF24L01+ 模块并在 10 字节的有效载荷内创建了自定义数据包结构。
数据包类型和从设备 ID
来自从设备的“add_me_packet”将在 Raspberry Pi 的设备列表中注册该从设备 ID。Raspberry Pi 将使用这个唯一的设备 ID 与特定的从设备进行进一步的通信。
同样,数据包通常由树莓派下发,用于控制操作。
从属设备在收到来自树莓派的更新数据包请求后,将以其传感器读数和连接设备的状态作为数据包响应给树莓派。如果您知道系统的工作原理,您可以轻松地将我的 10 字节数据包系统更改为 20 或 32(最大)数据包系统。
设备类型
我们已经看到了 Triac 器件、继电器和电机控制板。Raspberry Pi 如何知道或识别从设备将要执行的操作类型(你已经知道,每个从设备都有相同的固件和电路)。这由数据包的第 3 个字节定义。
要将从设备配置为电机设备,您需要更改给定嵌入式 C 程序的#define 语句。
//#define triac
#define relay //////need to change according to your device
#define device_id 59 //////need to change according to your device
///////////////////////////////////////////////////////////
#define device_type 4
///Device type declaration for program
/*
Test_Device = 0,
Triac_Device = 1,
Relay_Device = 2,
Buzzer_Device = 3,
Motor_Device = 4
*/
对于可控硅设备
#define triac ///Uncomment this define statement
//#define relay //////need to change according to your device
#define device_id 59 //////need to change according to your device
///////////////////////////////////////////////////////////
#define device_type 1 ///change to 1
对于继电器设备
//#define triac
#define relay //////need to change according to your device
#define device_id 59 //////need to change according to your device
///////////////////////////////////////////////////////////
#define device_type 2
一些沟通情况
---------------------------------------------- -
其他有用的链接和注释
azureMonitor_tick
计时器滴答事件中。
//Note free Azure Subscription has 20MB database size limit.
public static MobileServiceClient MobileService = new MobileServiceClient(
"https://myandroid.azure-mobile.net/",
"Replace this string");
和
item_default.Id = "xxxxxxxxxxxxxxxxxxxxxxxxxx";
//Inside this case statement of data_received(byte[] data_byte) function
case (byte)packet_type.update_packet:
..................
if ((bool)autocontrol.IsChecked)
{
byte[] bb = {0x00,0x00, 0x00
, 0x00 , 0x00 , 0x00 };
if (temp < 140)
bb[0] = (byte)(temp);
else
bb[0] = 140;
bb[1] = data_byte[8]; //Added code (This will enable buzzer based
//PIR reading.
bb[2] = lastitem.device3_state;
bb[3] = lastitem.device4_state;
nrf_send_data(bb, lastitem.device_address, packet_type.data_packet);
}
.......
}
最后一点
Windows IoT 家庭自动化与其他系统
附录
有些人可能不熟悉微控制器 (uC) 和 uC 编程。我将解释刻录从属设备的 .hex 文件所需的一些基本内容。
1.您需要安装Microchip的MPLAB X IDE和XC8 Compiler才能重新编译程序。如果只需要烧录程序,则不需要安装 XC8 编译器。
您可以从此链接下载 MPLAB X 和 XC8 编译器MPLAB X 和 XC8
2. 编程硬件工具或简单的编程器是将程序烧录到 uC 中必不可少的。对于 Microchip 的 PIC 控制器,可以使用 PicKit3、PicKit2 或 ICD3/2。(需要连接 MCLR、VDD、GND、PGD 和 PGC 引脚)。
3. 你可以在PCB设计中看到PicKit3的header。
..................................................... ..................................................... ......................
不可能在这里解释整个程序。因此,请阅读给定代码文件的注释。我在本文末尾添加了一些有用的代码片段。
随时发表您对这个项目的评论、意见和疑问。
谢谢 :)
阿南德。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !