上课前逐个检查 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>
6.7 KiB
6.7 KiB
任务目标
做一个"智慧寝室"控制窗体:点"开启情景模式"后,程序每秒显示当前时间和光照度、温度、湿度,并按时间段自动切换四种情景模式,控制灯光、窗帘和广播:
| 时间段 | 模式 | 灯光 | 窗帘(滑动条) | 广播 |
|---|---|---|---|---|
| 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。
实现步骤
- 代码开头加上
using System.IO.Ports;、using DeviceCtrlLibrary;、using DeviceCtrlLibrary.Model;、using System.Threading;。 - 声明全局变量:串口、灯、广播是否打开(三个 bool),
ADAM4017ResModel ResModel,DateTime now,以及四个时间点:起床DateTime.Today.AddHours(6.75)、上课AddHours(7.5)、回寝AddHours(21.0)、熄灯AddHours(22.0)。 - Load:清空
com_import,把串口号加进去。 - btn_apply 的 Click:没打开时打开
adam4017Helper、adam4150Helper,按钮改成"停止情景模式",启动timer;打开着就反过来。 - 写 PlayMp3() 方法:广播图片换成 switch_on,给媒体播放器的
URL设铃声文件的路径(AppDomain.CurrentDomain.BaseDirectory + "//Resources//ring.mp3"),调用Ctlcontrols.play(),Thread.Sleep(4000)等 4 秒,图片换回 switch_off。 - 写 CheckMode() 方法:用
now和四个时间点比较,判断现在是哪种模式,lbl_mode显示"智慧寝室正处于××模式",再按上面的表格控制:- 开灯 / 关灯:
adam4150Helper.OnOff(1, ...)和lamp.OnOff(...),只在状态要变时才做; - 放铃声:广播还没开时
new Thread(PlayMp3).Start(),让铃声在另一个线程里放,不卡住界面;关广播:图片换成 switch_off; - 窗帘:设
trb_curtain.Value。
- 开灯 / 关灯:
- timer 的 Tick:
now = DateTime.Now,txt_time显示now.ToString("HH:mm:ss"),读出数据填进三个文本框,最后调用CheckMode()。
在平台上怎么用时钟和广播
- 时钟在实训台上:填一个时刻点"拨到",程序里的
DateTime.Now就从这个时刻往后走;还可以选 10×、60× 倍速,点"恢复真实时间"回到现在。不用等到早上 6:45 才能测试起床模式。 - 拨时间时日期别动:四个时间点是程序启动时按"今天"算好的,改了日期就对不上了。
- 程序放铃声时,实训台上的广播喇叭亮起,浏览器里能听到声音(电脑要开音量)。
在平台上怎么试
- 运行后串口选 COM2(这几个实验的实训台把 ADAM-4150 和 ADAM-4017+ 并在 COM2 的同一条 485 总线上,所以书上在一个串口上打开两个模块也能用),点"开启情景模式",按钮变成"停止情景模式",
txt_time每秒走一次,拖动实训台的光照、温度、湿度滑块,文本框跟着变。 - 在实训台的时钟上拨到 06:50:00:应显示起床模式,ADAM-4150 的 DO1 照明灯亮,窗帘滑块到 5,广播响一声铃。
- 拨到 08:00:00:上课模式,灯灭,窗帘到 0。
- 拨到 21:30:00:回寝模式,灯亮,窗帘到 10,广播响铃。
- 拨到 23:00:00:熄灯模式,灯灭,窗帘到 10。
- 也可以拨到 6:44:50,看程序到 6:45 时自己切进起床模式。