Files
IOT_SIM/samples/p7-t3-智慧会议室/task.md
T
xuyueandClaude Opus 5.5 de277d3e9d
CI/CD / test (push) Canceled after 0s
CI/CD / deploy (push) Canceled after 0s
用 bun fmt 格式化全部代码和文档
- bunfig.toml 的 [fmt]:不写分号、单引号、一行最长 160,和原来的写法一致
- .prettierignore:docs/教材摘要/ 是书上的摘录,不格式化
- 模板里一行写两条语句的事件处理(@keydown.delete、@dblclick)改成调用方法:去掉分号后拆成两行,Vue 编译不过

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 14:02:33 +08:00

7.9 KiB
Raw Blame History

任务目标

做一个"智慧会议室"预约窗体:程序一启动就每秒显示当前时间和光照度、温度、湿度、气压、空气质量。填好时、分、秒,选一种模式(会议、讨论、展示),点"预约";到了预约时间,程序自动开启这种模式,控制灯光、窗帘和主、客话筒:

模式 灯光 窗帘(滑动条) 主话筒 客话筒
会议 开 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。

实现步骤

  1. 代码开头加上 using System.IO;、using System.IO.Ports;、using DeviceCtrlLibrary;、using DeviceCtrlLibrary.Model;。
  2. 声明全局变量:灯、主话筒、客话筒是否打开,模式是否已经开启(IsInitialized),ADAM4017ResModel ResModel,DateTime now,预约时间 reserve(先设成 DateTime.Now.AddDays(1),也就是明天,免得一启动就"到时间"),摄像头读到的图片 Image ReadImage = null。
  3. Load:
    • 清空两个下拉框,把串口号加进 com_import,com_mode 加入"会议""讨论""展示";
    • 启动 timer;
    • 程序目录下没有 Camera/ 文件夹就建一个(Directory.Exists、Directory.CreateDirectory);
    • 用 += 给 ipCameraHelper.ImageRead 绑定一个方法,在方法里把 e.img 存进 ReadImage。
  4. btn_reserve 的 Click:reserve = DateTime.Today,再依次加上三个文本框里的时、分、秒(Convert.ToInt16 转成数字)。
  5. 写 ChooseMode() 方法:lbl_mode 显示"智慧会议室已开启××模式",用 switch (com_mode.Text) 按上面的表格设置灯(图片、lamp、adam4150Helper.OnOff(1, ...))、trb_curtain.Value 和两个话筒的图片。
  6. 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/ 文件夹,文件名用当前时间。
  7. 三个开关图片框的 Click:灯、主话筒、客话筒各自开着就关、关着就开(灯还要控制 lamp 和实训台的照明灯)。
  8. 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 分钟拍照"这一项自动评分不检查,由老师看代码评阅。

在平台上怎么试

  1. 运行后串口选 COM2(程序一启动就在采集,不用点别的按钮)。在实训台上拖动光照、温度滑块;气压、空气质量在 ADAM-4017+ 那块点"Vin3–6 更多传感器"展开。几秒内文本框应跟着变。
  2. 把时钟拨到 13:19:54;模式选"讨论",时分秒填 13、20、00,点"预约"。
  3. 预约时间没到时,ADAM-4150 的 DO1 照明灯不亮;到 13:20:00 后,应显示"智慧会议室已开启讨论模式",照明灯亮,窗帘滑块到 0,主、客话筒都是开。
  4. 点"退出",灯、话筒都关掉。想再试一次,重新运行程序。