21、智能家居自动化应用开发指南

智能家居自动化应用开发指南

1. SDK 配置与生成

为 eBoxPhidget 操作系统设计项目配置和生成 SDK,可按以下步骤操作:
1. 打开 VS2005 IDE,选择“Project” -> “Add New SDK”,调出 SDK 向导。
2. 在“SDK1 Property Pages”中,输入“eBoxPhidgetSDK”作为 SDK 名称和产品名称,输入“ My Company”作为公司名称,“www.mycompany.com”作为公司网站地址,然后点击“Apply”,此时页面标题变为“eBoxPhidgetSDK Property Pages”。
3. 在左窗格中,点击右侧的“Install”节点,将 MSI 文件名更改为“eBoxPhidgetSDK.msi”,再点击“Apply”。
4. 点击左窗格的“Development Languages”节点,在右侧选中“managed development support”复选框,点击“Apply”,然后点击“OK”。
5. 在 VS2005 IDE 中,选择“Build” -> “Build All SDKs”来构建并生成 SDK。

2. eBoxPhidgetSDK 安装

构建完成后,eBoxPhidgetSDK 将在以下目录生成:

C:\WINCE600\OSDESIGNS\EBOXPHIDGET\EBOXPHIDGET\SDKS\SDK1\MSI

关闭 VS2005 IDE,导航到上述目录,双击“eboxphidgetsdk.msi”来安装该 SDK。

3. 智能家居应用概述

在完成 eBoxPhidget OS 设计的运行时映像生成以及 eBoxPhidgetSDK 的生成与安装后,接下来将为 Phidget 设备创建示例应用程序。随着技术的发展,开发智能家庭自动化应用的技术资源和选择越来越多,例如蓝牙、IrDA、Wi - Fi、ZigBee 和 Z - Wave 等无线连接技术,可实现电缆替代、远程控制和无线网络功能,降低安装难度和系统成本,提升用户体验。

4. 温度传感器应用

所有 Phidget 传感器都连接到 PhidgetTextLCD 模块的模拟输入端口,不同 Phidget 传感器的应用开发过程非常相似。下面开发一个 VB2005 智能设备应用程序,用于读取连接到 PhidgetTextLCD 模拟输入端口的温度传感器值。

4.1 创建项目
  1. 启动一个新的 VS2005 IDE 实例,命名为“Phidget VS2005 IDE”。
  2. 在 VS2005 IDE 中,选择“File” -> “New” -> “Project”,调出“New Project Wizard”屏幕。
  3. 在“New Project”屏幕的左窗格中,点击并展开“Other Languages”节点。
  4. 点击并展开“Visual Basic”节点,接着展开“Smart Device”节点,然后点击“Windows CE 5.0”。使用 Windows CE 5.0 智能设备应用模板生成的应用程序可以在 Windows CE 5.0 和 Windows Embedded CE 6.0 上运行。
  5. 在“New Project”屏幕的右窗格中,点击“Device Application”。
  6. 输入“VBTempSensor”作为项目名称,然后点击“OK”继续。
  7. VS2005 的“New Project Wizard”会自动创建初始项目文件。默认情况下,会创建“form1.vb”并添加“mainMenu1”主菜单控件,由于不需要该控件,右键点击“mainMenu1”控件,选择“Delete”将其移除。
4.2 配置项目与添加控件
  1. 要使用 PhidgetFrameWork 库,需添加对该库的引用。在 VS2005 IDE 中选择“Project” -> “Add References”,调出“Add Reference”屏幕。
  2. 在“Add Reference”屏幕中,点击“Browse”选项卡,导航到以下目录:
C:\WINCE600\PUBLIC\PHIDGETFRAMEWORK_V214\PHIDGETBINARIES
  1. 选择“Phidget21CE.NET.dll”文件,然后点击“OK”继续。
  2. 在 Form1 上放置一个“Label”控件,将其“Text”属性更改为“Temperature”。
  3. 放置第二个“Label”控件,将其放置在第一个“Label”控件的右侧,将控件名称更改为“labelTemp”。
  4. 在 Form1 上放置一个“Button”控件,将控件名称更改为“btnRefresh”,将“Text”属性更改为“Refresh”。
  5. 将 Form1 的宽度和高度分别更改为 300 和 200。
  6. 在 Form1 上放置第三个“Label”控件,将控件名称和“Text”属性都更改为“labelStatus”。该“Text”属性有助于识别标签控件的预期功能,在 Form1 的加载事件中将其清空。
  7. 将第三个“Label”控件“labelStatus”放置在 Form1 的下边缘,调整大小以适应 Form1 的整个宽度,将“TextAlign”属性设置为“TopCenter”。
  8. 将 Form1 的“Text”属性更改为“Phidget Temperature Sensor”。
4.3 添加代码
  1. 右键点击 Form1,选择“View Code”,调出代码编辑器窗口。
  2. 输入以下代码定义新的 Phidget InterfaceKit 和 TextLCD 对象:
Public Class Form1
    Dim WithEvents m_PhidgetIO As Phidgets.InterfaceKit
    Dim WithEvents m_PhidgetLCD As Phidgets.TextLCD
    Dim bool_PhidgetIOAttached As Boolean
    '...
End Class
  1. 在 Form1 的加载事件中添加以下代码,创建 m_PhidgetIO 和 m_PhidgetLCD 对象的新实例:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    '
    m_PhidgetIO = New Phidgets.InterfaceKit
    m_PhidgetIO.open()
    '
    m_PhidgetLCD = New Phidgets.TextLCD
    m_PhidgetLCD.open()
    '
    labelTemp.Text = ""
    '
End Sub
  1. 由于 Phidget 框架使用线程的方式以及 .NET Compact 框架的设计,需要以下委托辅助函数将文本显示到“labelStatus”标签控件上,将以下代码添加到 Form1 中:
Protected Delegate Sub PrintGUI_delegate(ByVal arg As String)
Private Sub PrintGUI(ByVal arg As String)
    labelStatus.Text = arg
End Sub
  1. 为 PhidgetTextLCD 的附加事件添加以下代码,在 Form1 的“labelStatus”标签控件上显示状态,并更新 PhidgetTextLCD 模块上的 LCD:
Private Sub PhidgetIO_Attach(ByVal sender As Object, ByVal e As Phidgets.Events.AttachEventArgs) Handles m_PhidgetIO.Attach
    'Initialize relevant properties
    m_PhidgetIO.outputs(0) = False
    m_PhidgetIO.ratiometric = True
    '
    bool_PhidgetIOAttached = True
    '
End Sub

Private Sub PhidgetLCD_Attach(ByVal sender As Object, ByVal e As Phidgets.Events.AttachEventArgs) Handles m_PhidgetLCD.Attach
    '
    m_PhidgetLCD.rows.Item(0).DisplayString = "VB2005 CE 6.0 App"
    m_PhidgetLCD.rows.Item(1).DisplayString = "Temperature Sensor"
    '
    Dim s As String = "Attached: " + e.Device.Name + " " + e.Device.SerialNumber.ToString()
    Me.Invoke(New PrintGUI_delegate(AddressOf PrintGUI), s)
    '
End Sub
  1. 为 PhidgetTextLCD 的分离事件添加以下代码,更新 Form1 上的“labelStatus”标签控件,并更新“bool_PhidgetIOAttached”变量的值:
Private Sub PhidgetLCD_Detach(ByVal sender As Object, ByVal e As Phidgets.Events.DetachEventArgs) Handles m_PhidgetLCD.Detach
    '
    Dim s As String = "Detached: " + e.Device.Name + " " + e.Device.SerialNumber.ToString()
    Me.Invoke(New PrintGUI_delegate(AddressOf PrintGUI), s)
    '
End Sub

Private Sub PhidgetIO_Detach(ByVal sender As Object, ByVal e As Phidgets.Events.DetachEventArgs) Handles m_PhidgetIO.Detach
    '
    bool_PhidgetIOAttached = False
    '
End Sub
  1. 在“btnRefresh”按钮控件的点击事件中添加以下代码,读取连接到 PhidgetTextLCD 的温度传感器:
Private Sub btnRefresh_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRefresh.Click
    '
    Dim temp As Double
    '
    If bool_PhidgetIOAttached Then
        ' Read sensor data from port 0
        temp = m_PhidgetIO.sensors(0).Value
        ' Convert value to temperature and display thru 
        ' labelTemp
        temp = (temp / 1000 * 222.22)
        labelTemp.Text = temp.ToString
        '
        m_PhidgetLCD.rows.Item(0).DisplayString = "Current Temperature:"
        m_PhidgetLCD.rows.Item(1).DisplayString = temp.ToString
        '
    Else
        MessageBox.Show("PhidgetInterfaceKit Module is not available.", "Missing Phidget Device")
    End If
End Sub
  1. 在 Form1_Closing 事件中添加以下代码,销毁事件处理程序并终止 Phidget 对象的实例:
Private Sub Form1_Closing(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
    RemoveHandler m_PhidgetIO.Attach, AddressOf PhidgetIO_Attach
    RemoveHandler m_PhidgetIO.Detach, AddressOf PhidgetIO_Detach
    '
    RemoveHandler m_PhidgetLCD.Attach, AddressOf PhidgetLCD_Attach
    RemoveHandler m_PhidgetLCD.Detach, AddressOf PhidgetLCD_Detach
    '
    m_PhidgetIO.close()
    m_PhidgetLCD.close()
End Sub
  1. 在 VS2005 IDE 中,选择“Build” -> “Build Solution”来构建并生成二进制可执行文件。
5. 准备 eBox - 4300 - MSJK 进行应用部署

为了创建更高效的应用开发环境,将上述创建的操作系统运行时映像部署到 eBox - 4300 - MSJK 上。使用 USB 便携式闪存存储设备将“nk.bin”映像文件从开发工作站复制到 eBox - 4300 - MSJK,具体步骤如下:
1. 如果尚未打开 eBoxPhidget 操作系统设计项目,启动一个新的 VS2005 IDE 实例并打开该项目,然后将该项目生成的运行时映像下载到 eBox - 4300 - MSJK。
2. eBoxPhidget 操作系统设计的运行时映像“nk.bin”在以下目录生成:

_EBOXPHIDGET\RELDIR\ICOP_EBOX4300_60E_X86_RELEASE
  1. 将“nk.bin”文件从上述目录复制到便携式 USB 闪存存储驱动器,该文件大小约为 18 MB。
  2. 在 eBox - 4300 - MSJK 的 Windows 桌面上,运行 eBoxPhidget 项目的 CE 运行时,双击“MyDevice”图标,启动文件资源管理器并访问文件系统的根目录。默认视图设置会隐藏文件扩展名,“NK”文件即为运行时映像文件。
  3. 将 USB 闪存存储设备插入 eBox - 4300 - MSJK 的一个 USB 端口,CE 会在一两秒内检测到 USB 闪存存储设备的存在,并显示“USB Storage”图标。
  4. 使用与桌面 Windows 相同的文件复制方法,将“nk.bin”文件从 USB 存储设备复制到 eBox - 4300 - MSJK 的根文件系统,覆盖现有的“nk.bin”文件,文件复制过程可能需要几分钟。
  5. 将操作系统运行时映像文件复制到 eBox - 4300 - MSJK 的本地存储后,无需再将运行时映像下载到该设备。

复制“nk.bin”文件到 eBox - 4300 - MSJK 的本地存储后,重置电源。当 eBox - 4300 - MSJK 启动到 DOS 选择菜单时,选择第一个选项从本地存储启动映像文件。

6. 远程显示应用

在操作系统设计配置阶段,已将远程显示应用(RDA)组件添加到操作系统设计中。RDA 的工作方式与桌面 Windows 的远程桌面类似。访问运行 CE 的 eBox - 4300 - MSJK 上的 RDA,可按以下步骤操作:
1. 找到“cerhost.exe”文件,双击启动该应用程序,调出 Windows CE 的远程显示控制界面。
2. 选择“File” -> “Connect”,调出“Connect”屏幕。当 eBoxPhidget 运行时映像在 eBox - 4300 - MSJK 上启动时,“eBox4300”设备将显示在“Active target devices”中。
3. 在“Active target devices”窗口中,点击高亮显示列出的设备,然后点击“OK”建立连接。

连接建立后,RDA 应用程序屏幕将弹出,显示 eBox - 4300 - MSJK 的 CE 桌面。最初开发操作系统运行时映像时,需要将显示监视器连接到 eBox - 4300 - MSJK。创建稳定的运行时映像后,可以将远程显示应用组件添加到运行时映像中,并使用自动启动实用程序在运行时映像启动时启动远程显示应用程序,从而无需为 eBox - 4300 - MSJK 使用监视器。通过远程显示应用程序,可以将 eBox - 4300 - MSJK 的显示重定向到开发工作站的显示器上,节省桌面或工作台空间。

以下为配置 eBox - 4300 - MSJK 进行应用部署和访问远程显示应用的流程图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px

    A([开始]):::startend --> B(准备eBox - 4300 - MSJK):::process
    B --> C(复制nk.bin到USB):::process
    C --> D(插入USB到eBox - 4300 - MSJK):::process
    D --> E(复制nk.bin到本地存储):::process
    E --> F(重启并选择本地存储启动):::process
    F --> G(访问RDA):::process
    G --> H(找到cerhost.exe并启动):::process
    H --> I(选择File - Connect):::process
    I --> J{设备显示在Active target devices?}:::decision
    J -->|是| K(点击设备并OK建立连接):::process
    J -->|否| I(选择File - Connect):::process
    K --> L([结束]):::startend

智能家居自动化应用开发指南

7. 应用程序部署到 eBox - 4300 - MSJK

使用 CoreCon 连接框架将应用程序从 VS2005 IDE 部署到 eBox - 4300 - MSJK,具体步骤如下:

7.1 获取 eBox - 4300 - MSJK 的 IP 地址
  1. 在运行于 eBox - 4300 - MSJK 的 CE 桌面上,双击任务栏上的网络图标,调出“PCI\RTL81391 IP Information”屏幕。
  2. 记录 eBox - 4300 - MSJK 的 IP 地址设置。
7.2 配置 CoreCon 连接框架
  1. 在 Phidget VS2005 IDE 中,选择“Tools” -> “Options”,调出“Options”屏幕。
  2. 在“Options”屏幕的左窗格中,展开“Device Tools”节点,然后点击“Devices”节点。
  3. 在“Show devices for platform”选择中,选择“eBoxPhidgetSDK”。
  4. 点击“Properties”,调出“eBoxPhidgetSDK x86 Device Properties”屏幕。
  5. 点击“Configure”,调出“Configure TCP/IP Transport”屏幕,输入 eBox - 4300 - MSJK 的 IP 地址。
  6. 输入 IP 地址后,点击“OK”关闭“Configure TCP/IP Transport”屏幕。
  7. 点击“OK”关闭“eBoxPhidgetSDK x86 Device Properties”屏幕。
  8. 点击“OK”关闭“Options”屏幕。
  9. 在 VS2005 IDE 中,选择“Project” -> “Change Target Platform”,调出“Change Target Platform”屏幕。
  10. 在“Change Target Platform”屏幕中,从“Change to”选择中选择“eBoxPhidgetSDK”。
  11. 点击“OK”接受更改,会弹出 Microsoft Visual Studio 消息框,点击“Yes”接受,项目将关闭并以新设置重新打开。
  12. 在 VS2005 IDE 中,选择“Tools” -> “Connect to Device”,调出“Connect to Device”屏幕。
  13. 在“Connect to Device”屏幕中,点击“Connect”,连接成功后,“Connecting”屏幕将显示“Connection succeeded”消息。
  14. 点击“Close”关闭“Connecting”屏幕。
7.3 部署 VBTempSensor 应用程序
  1. 在 VS2005 IDE 中,选择“Debug” -> “Start Without Debugging”,调出“Deploy VBTempSensor”屏幕。
  2. 在“Deploy VBTempSensor”屏幕中,点击“Deploy”将应用程序部署到 eBox - 4300 - MSJK,应用程序将在 eBox - 4300 - MSJK 的 CE 桌面上启动。

若要部署应用程序并在达到预设断点时能够逐行调试代码,可使用“Start Debugging”选项代替“Start Without Debugging”选项。

8. Phidget 继电器开关应用

在之前的 VBTempSensor 应用程序基础上,添加控制继电器的代码,步骤如下:
1. 在 Form1 上放置一个“CheckBox”控件,将“Text”属性更改为“Relay control”,将“Name”属性更改为“chkboxRelay”。
2. 双击“chkboxRelay”复选框控件,调出代码编辑器窗口,在“chkboxRelay_CheckStateChanged”事件中添加以下代码:

Private Sub chkboxRelay_CheckStateChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkboxRelay.CheckStateChanged
    '
    If chkboxRelay.Checked Then
        '
        m_PhidgetIO.outputs(2) = True
        '
    Else
        '
        m_PhidgetIO.outputs(2) = False
        '
    End If
    '
End Sub

应用程序运行时,点击“chkbox_Relay”控件,上述代码将执行,切换关联的数字输出信号的高低电平,从而使继电器吸合或断开。编译代码生成更新后的应用程序可执行文件,进行部署和功能测试。

9. 其他 Phidget 传感器应用

继续使用现有的 VBTempSensor 应用程序,添加代码以捕获光传感器和运动传感器的输入,步骤如下:

9.1 添加控件
  1. 在 Form1 上放置一个“Label”控件,将“Text”属性更改为“Light Sensor”。
  2. 再放置一个“Label”控件,将其水平放置在“Light Sensor”标签旁边,将“Name”属性更改为“labelLight”。
  3. 在 Form1 上放置另一个“Label”控件,将“Text”属性更改为“Motion Sensor”。
  4. 放置一个“Label”控件,将其水平放置在“Motion Sensor”标签旁边,将“Name”属性更改为“labelMotion”。
  5. 在 Form1 的最顶部放置一个“Label”控件,将“Name”属性更改为“labelTime”。
  6. 在 Form1 上放置一个“Checkbox”控件,将其水平放置在“Refresh”按钮旁边,将“Name”属性更改为“chkboxAuto”。
  7. 为项目添加一个“Timer”控件。

完成上述步骤后,将 Form1 上的控件布局调整为与示例类似。

9.2 添加代码
  1. 在 Form1_Load 事件中添加以下代码,初始化标签控件和 Timer1 的显示:
labelTime.Text = ""
labelLight.Text = ""
labelMotion.Text = ""
'
Timer1.interval = 1000
Timer1.Enabled = True
  1. 添加以下委托辅助函数,将捕获的传感器数据显示到标签控件上:
Protected Delegate Sub PrintGUI_Temp_delegate(ByVal arg As String)
Private Sub PrintGUI_Temp(ByVal arg As String)
    labelTemp.Text = arg
End Sub

Protected Delegate Sub PrintGUI_Light_delegate(ByVal arg As String)
Private Sub PrintGUI_Light(ByVal arg As String)
    labelLight.Text = arg
End Sub

Protected Delegate Sub PrintGUI_Motion_delegate(ByVal arg As String)
Private Sub PrintGUI_Motion(ByVal arg As String)
    labelMotion.Text = arg
End Sub
  1. 在“btnRefresh”按钮控件的点击事件“btnRefresh_Click”中添加以下代码:
' Read sensor data from port 1 - Light sensor
temp = m_PhidgetIO.sensors(1).Value
labelLight.Text = temp.ToString
'
' Read sensor data from port 1 - Motion sensor
temp = m_PhidgetIO.sensors(2).Value
labelMotion.Text = temp.ToString
  1. 在“Timer1_Tick”事件中添加以下代码:
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    '
    Dim dt As Date = DateTime.Now
    Dim s As String
    Dim temp As Double
    '
    s = dt.ToString("G")
    Me.Invoke(New PrintGUI_Time_delegate(AddressOf PrintGUI_Time), s)
    '
    If bool_PhidgetIOAttached Then
        If chkboxAuto.Checked Then
            temp = m_PhidgetIO.sensors(0).Value
            ' Convert value to temperature and display thru 
            ' labelTemp
            temp = (temp / 1000 * 222.22)
            s = temp.ToString
            Me.Invoke(New PrintGUI_Temp_delegate(AddressOf PrintGUI_Temp), s)
            '
            ' Read sensor data from port 1 - Light sensor
            temp = m_PhidgetIO.sensors(1).Value
            If temp < 180 Then
                chkboxRelay.Checked = True
            Else
                chkboxRelay.Checked = False
            End If
            s = temp.ToString
            Me.Invoke(New PrintGUI_Light_delegate(AddressOf PrintGUI_Light), s)
            '
            ' Read sensor data from port 1 - Motion sensor
            temp = m_PhidgetIO.sensors(2).Value
            s = temp.ToString
            Me.Invoke(New PrintGUI_Motion_delegate(AddressOf PrintGUI_Motion), s)
            '
            'chkboxRelay
            '
        End If
    End If
    '
End Sub

“Timer1_Tick”事件中的代码每秒执行一次。当“Auto Update”复选框被选中时,该事件中的代码将捕获温度、光和运动传感器的数据并更新显示。当光传感器数据低于 180 时,“Timer1_Tick”事件中的代码将把“chkboxRelay”的“Checked”属性设置为“True”,从而触发“chkboxRelay_CheckStateChanged”事件中的代码执行,控制连接到继电器的 PhidgetTextLCD 的数字输出。

以下为添加其他 Phidget 传感器应用代码的步骤表格:
|步骤|操作|
| ---- | ---- |
|1|在 Form1 上添加各种标签、复选框和计时器控件|
|2|在 Form1_Load 事件中初始化控件显示和计时器|
|3|添加委托辅助函数用于显示传感器数据|
|4|在 btnRefresh_Click 事件中读取光和运动传感器数据|
|5|在 Timer1_Tick 事件中定时更新传感器数据并控制继电器|

以下为添加其他 Phidget 传感器应用的流程图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px

    A([开始]):::startend --> B(添加控件到Form1):::process
    B --> C(在Form1_Load事件添加初始化代码):::process
    C --> D(添加委托辅助函数):::process
    D --> E(在btnRefresh_Click事件添加读取传感器代码):::process
    E --> F(在Timer1_Tick事件添加定时更新和控制代码):::process
    F --> G([结束]):::startend

通过以上步骤,可以完成智能家居自动化应用的开发、部署和功能扩展,实现对多种 Phidget 传感器和设备的控制与数据采集。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值