## 任务目标 做一个"智慧寝室"控制窗体:点"开启情景模式"后,程序每秒显示当前时间和光照度、温度、湿度,并按时间段自动切换四种情景模式,控制灯光、窗帘和广播: | 时间段 | 模式 | 灯光 | 窗帘(滑动条) | 广播 | | ----------- | -------- | ---- | -------------- | ------ | | 6:45–7:30 | 起床模式 | 开 | 5(半开) | 放铃声 | | 7:30–21:00 | 上课模式 | 关 | 0(全开) | 关 | | 21:00–22:00 | 回寝模式 | 开 | 10(全关) | 放铃声 | | 其他时间 | 熄灯模式 | 关 | 10(全关) | 关 | 练习重点:DateTime 的比较,自己写方法(CheckMode、PlayMp3),用线程(Thread)播放声音,媒体播放器控件。详细步骤见书 p141–145。 ## 先添加项目资源 点代码上方的**项目资源**,在素材库里勾选开关图片 `switch_on`、`switch_off` 和铃声 `ring`(就是书上的 ring.mp3,可以先试听)。名字和书上一样,不能自己上传。 广播图片框的**图片**属性选 `Resources.switch_off`。 ## 界面和控件名 | 控件 | 名称(Name) | 文字(Text)和用途 | | ---------- | ---------------------------------------------- | ------------------------------------------------------------- | | 窗体 | `frm_control` | 智慧寝室情景控制 | | 分组框 | `grp_mode` | 模式选择 | | 文本框 | `txt_time` | 显示当前时间 | | 标签 | `lbl_mode` | 显示现在是哪种模式(文字先空着) | | 按钮 | `btn_apply` | 开启情景模式(开启后变成"停止情景模式") | | 分组框 | `grp_input` | 采集量 | | 下拉框 | `com_import` | 采集器的串口 | | 文本框 | `txt_light`、`txt_temperature`、`txt_humidity` | 光照度、温度、湿度 | | 分组框 | `grp_status` | 状态栏 | | 滑动条 | `trb_curtain` | 模拟窗帘:0 全开,10 全关(最小值 0、最大值 10 用默认的就行) | | 图片框 | `pic_boardcastStatus` | 广播状态,图片选 switch_off | | 灯泡 | `lamp` | 窗体上显示灯的亮灭 | | 定时器 | `timer` | 间隔 1000(1 秒) | | 媒体播放器 | `axWindowsMediaPlayer1` | 播放铃声;可见设为 False | 其余标签(当前时间、串口、光照度、温度、湿度、窗帘、全开、全关、广播、灯光)照书上的图摆好,名字不影响评分。 媒体播放器在工具箱的"物联网设备"里,直接拖到窗体上就行,不用像书上小贴士那样去"选择工具箱项"添加 COM 组件。 > 窗体名:在设计器里点窗体空白处,把属性窗口的**名称**从 `Form1` 改成 `frm_control`,类名、文件名和 Program.cs 会跟着改。先改名再双击窗体,生成的 Load 事件才叫 `frm_control_Load`。 ## 实现步骤 1. 代码开头加上 `using System.IO.Ports;`、`using DeviceCtrlLibrary;`、`using DeviceCtrlLibrary.Model;`、`using System.Threading;`。 2. 声明全局变量:串口、灯、广播是否打开(三个 bool),`ADAM4017ResModel ResModel`,`DateTime now`,以及四个时间点:起床 `DateTime.Today.AddHours(6.75)`、上课 `AddHours(7.5)`、回寝 `AddHours(21.0)`、熄灯 `AddHours(22.0)`。 3. **Load**:清空 `com_import`,把串口号加进去。 4. **btn_apply 的 Click**:没打开时打开 `adam4017Helper`、`adam4150Helper`,按钮改成"停止情景模式",启动 `timer`;打开着就反过来。 5. 写 **PlayMp3()** 方法:广播图片换成 switch_on,给媒体播放器的 `URL` 设铃声文件的路径(`AppDomain.CurrentDomain.BaseDirectory + "//Resources//ring.mp3"`),调用 `Ctlcontrols.play()`,`Thread.Sleep(4000)` 等 4 秒,图片换回 switch_off。 6. 写 **CheckMode()** 方法:用 `now` 和四个时间点比较,判断现在是哪种模式,`lbl_mode` 显示"智慧寝室正处于××模式",再按上面的表格控制: - 开灯 / 关灯:`adam4150Helper.OnOff(1, ...)` 和 `lamp.OnOff(...)`,只在状态要变时才做; - 放铃声:广播还没开时 `new Thread(PlayMp3).Start()`,让铃声在另一个线程里放,不卡住界面;关广播:图片换成 switch_off; - 窗帘:设 `trb_curtain.Value`。 7. **timer 的 Tick**:`now = DateTime.Now`,`txt_time` 显示 `now.ToString("HH:mm:ss")`,读出数据填进三个文本框,最后调用 `CheckMode()`。 ## 在平台上怎么用时钟和广播 - **时钟**在实训台上:填一个时刻点"拨到",程序里的 `DateTime.Now` 就从这个时刻往后走;还可以选 10×、60× 倍速,点"恢复真实时间"回到现在。不用等到早上 6:45 才能测试起床模式。 - 拨时间时**日期别动**:四个时间点是程序启动时按"今天"算好的,改了日期就对不上了。 - 程序放铃声时,实训台上的**广播**喇叭亮起,浏览器里能听到声音(电脑要开音量)。 ## 在平台上怎么试 1. 运行后串口选 **COM2**,点"开启情景模式",按钮变成"停止情景模式",`txt_time` 每秒走一次,拖动实训台的光照、温度、湿度滑块,文本框跟着变。 2. 在实训台的时钟上拨到 **06:50:00**:应显示起床模式,ADAM-4150 的 **DO1 照明灯**亮,窗帘滑块到 5,广播响一声铃。 3. 拨到 **08:00:00**:上课模式,灯灭,窗帘到 0。 4. 拨到 **21:30:00**:回寝模式,灯亮,窗帘到 10,广播响铃。 5. 拨到 **23:00:00**:熄灯模式,灯灭,窗帘到 10。 6. 也可以拨到 6:44:50,看程序到 6:45 时自己切进起床模式。