- bunfig.toml 的 [fmt]:不写分号、单引号、一行最长 160,和原来的写法一致 - .prettierignore:docs/教材摘要/ 是书上的摘录,不格式化 - 模板里一行写两条语句的事件处理(@keydown.delete、@dblclick)改成调用方法:去掉分号后拆成两行,Vue 编译不过 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7.9 KiB
任务目标
做一个"智慧会议室"预约窗体:程序一启动就每秒显示当前时间和光照度、温度、湿度、气压、空气质量。填好时、分、秒,选一种模式(会议、讨论、展示),点"预约";到了预约时间,程序自动开启这种模式,控制灯光、窗帘和主、客话筒:
| 模式 | 灯光 | 窗帘(滑动条) | 主话筒 | 客话筒 |
|---|---|---|---|---|
| 会议 | 开 | 0(全开) | 开 | 关 |
| 讨论 | 开 | 0(全开) | 开 | 开 |
| 展示 | 开 | 10(全关) | 开 | 关 |
勾选"拍照记录"时,预约时间到了还要打开网络摄像头,每 5 分钟存一张照片。点"退出"关掉所有设备。
练习重点:DateTime 的计算和比较(AddHours、AddMinutes、AddSeconds),switch 语句,用 += 订阅事件。详细步骤见书 p148–153。
先添加项目资源
点代码上方的项目资源,在素材库里勾选 switch_on、switch_off 两张开关图片(名字和书上一样,不能自己上传)。三个开关图片框的图片属性都选 Resources.switch_off。
界面和控件名
| 控件 | 名称(Name) | 文字(Text)和用途 |
|---|---|---|
| 窗体 | frm_control |
智慧会议室情景模式 |
| 分组框 | grp_mode |
模式选择 |
| 标签 | lbl_time |
当前时间:00:00:00(运行时显示当前时间) |
| 标签 | lbl_mode |
智慧会议室未开启情景模式 |
| 复选框 | chk_record |
拍照记录 |
| 文本框 | txt_hour、txt_minute、txt_second |
预约的时、分、秒,默认 13、20、00 |
| 标签 | lbl_hour、lbl_minute、lbl_second |
时、分、秒将会有场 |
| 下拉框 | com_mode |
选择模式,默认文字"会议" |
| 按钮 | btn_reserve |
预约 |
| 按钮 | btn_exit |
退出 |
| 分组框 | grp_input |
采集量 |
| 下拉框 | com_import |
采集器的串口 |
| 文本框 | txt_light、txt_temperature、txt_humidity |
光照度、温度、湿度 |
| 文本框 | txt_airPressure、txt_airQuality |
气压、空气质量 |
| 文本框 | txt_camera |
摄像头 IP 地址,默认 192.168.14.131 |
| 分组框 | grp_status |
状态栏 |
| 滑动条 | trb_curtain |
模拟窗帘:0 全开,10 全关 |
| 图片框 | pic_lightsStatus |
灯光开关,点它手动开关灯 |
| 灯泡 | lamp |
窗体上显示灯的亮灭 |
| 图片框 | pic_mainMicrophone、pic_subMicrophone |
主、客话筒开关,点它手动开关 |
| 定时器 | timer |
间隔 1000(1 秒) |
其余标签(串口、光照度、温度、湿度、气压、空气质量、摄像头IP地址、窗帘、全开、全关、灯光、话筒、主、客)照书上的图摆好,名字不影响评分。书上表格里还有 CO₂ 浓度一行,但代码里没有用到,可以不做。
窗体名:在设计器里点窗体空白处,把属性窗口的名称从
Form1改成frm_control,类名、文件名和 Program.cs 会跟着改。先改名再双击窗体,生成的 Load 事件才叫frm_control_Load。
实现步骤
- 代码开头加上
using System.IO;、using System.IO.Ports;、using DeviceCtrlLibrary;、using DeviceCtrlLibrary.Model;。 - 声明全局变量:灯、主话筒、客话筒是否打开,模式是否已经开启(
IsInitialized),ADAM4017ResModel ResModel,DateTime now,预约时间reserve(先设成DateTime.Now.AddDays(1),也就是明天,免得一启动就"到时间"),摄像头读到的图片Image ReadImage = null。 - Load:
- 清空两个下拉框,把串口号加进
com_import,com_mode加入"会议""讨论""展示"; - 启动
timer; - 程序目录下没有
Camera/文件夹就建一个(Directory.Exists、Directory.CreateDirectory); - 用
+=给ipCameraHelper.ImageRead绑定一个方法,在方法里把e.img存进ReadImage。
- 清空两个下拉框,把串口号加进
- btn_reserve 的 Click:
reserve = DateTime.Today,再依次加上三个文本框里的时、分、秒(Convert.ToInt16转成数字)。 - 写 ChooseMode() 方法:
lbl_mode显示"智慧会议室已开启××模式",用switch (com_mode.Text)按上面的表格设置灯(图片、lamp、adam4150Helper.OnOff(1, ...))、trb_curtain.Value和两个话筒的图片。 - timer 的 Tick:
- 用
com_import.Text打开adam4017Helper、adam4150Helper; now = DateTime.Now,lbl_time显示HH:mm:ss,读出数据填进五个文本框;now >= reserve时:模式还没开启就调用ChooseMode(),勾了"拍照记录"就打开并启动摄像头(ipCameraHelper.Open(txt_camera.Text, "admin", "")、Start()),然后记下已开启;分钟能被 5 整除且秒是 0 时,把ReadImage存到Camera/文件夹,文件名用当前时间。
- 用
- 三个开关图片框的 Click:灯、主话筒、客话筒各自开着就关、关着就开(灯还要控制
lamp和实训台的照明灯)。 - btn_exit 的 Click:停止
timer,reserve改回明天,"拍照记录"设为不可用,关灯、关两个话筒,trb_curtain.Value = 0,IsInitialized改回 false,关闭两个采集器和摄像头。
和书上不一样的地方
书上 Load 里没有把串口号加进
com_import(注释写了,代码漏了),下拉框是空的,选不了串口。要补上foreach (string item in SerialPort.GetPortNames())那几行。
书上表格里温度文本框写的是
txt_temperation,代码里用的是txt_temperature,请按代码写,自动评分按txt_temperature找。
在平台上怎么用时钟
- 实训台上的时钟可以拨到任意时刻:填好时刻点"拨到",程序里的
DateTime.Now就从这个时刻往后走,点"恢复真实时间"回到现在。不用真的等到下午 1 点 20 分。 - 拨时间时日期别动:预约时间是按"今天"算的。
- 摄像头拍的照片会出现在运行区下方的"程序保存的图片"里,只在这次运行中保留。"每 5 分钟拍照"这一项自动评分不检查,由老师看代码评阅。
在平台上怎么试
- 运行后串口选 COM2(程序一启动就在采集,不用点别的按钮)。在实训台上拖动光照、温度滑块;气压、空气质量在 ADAM-4017+ 那块点"Vin3–6 更多传感器"展开。几秒内文本框应跟着变。
- 把时钟拨到 13:19:54;模式选"讨论",时分秒填 13、20、00,点"预约"。
- 预约时间没到时,ADAM-4150 的 DO1 照明灯不亮;到 13:20:00 后,应显示"智慧会议室已开启讨论模式",照明灯亮,窗帘滑块到 0,主、客话筒都是开。
- 点"退出",灯、话筒都关掉。想再试一次,重新运行程序。