上课前逐个检查 23 个实验后的修改:补上三处评分漏洞(项目 3 任务 1、项目 4 任务 3 的关闭和项目 7 任务 2 的熄灯,程序什么都不做也能通过);评分说明的空格;任务说明按实测补充(项目 2 任务 1–3、项目 3 任务 2、项目 4 任务 2、项目 7 任务 1–3、项目 8 任务 5)。使用说明、设计方案同步,设计方案记下以后可能扩展"物联网设备安装与调试"课 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
72 lines
6.7 KiB
Markdown
72 lines
6.7 KiB
Markdown
## 任务目标
|
||
|
||
做一个"智慧寝室"控制窗体:点"开启情景模式"后,程序每秒显示当前时间和光照度、温度、湿度,并按时间段自动切换四种情景模式,控制灯光、窗帘和广播:
|
||
|
||
| 时间段 | 模式 | 灯光 | 窗帘(滑动条) | 广播 |
|
||
| ----------- | -------- | ---- | -------------- | ------ |
|
||
| 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**(这几个实验的实训台把 ADAM-4150 和 ADAM-4017+ 并在 COM2 的同一条 485 总线上,所以书上在一个串口上打开两个模块也能用),点"开启情景模式",按钮变成"停止情景模式",`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 时自己切进起床模式。
|