Files
IOT_SIM/samples/p7-t3-智慧会议室/task.md
T
xuyueandClaude Opus 5.5 46e0f40cce
CI/CD / test (push) Canceled after 0s
CI/CD / deploy (push) Canceled after 0s
实训台接线:串口要选对。接线做成数据(BoardState.wiring),默认按教材布局图 COM2 ADAM-4017+、COM3 ADAM-4150、COM4 ZigBee 协调器、COM5 LED 屏,实验可在 meta.json 的 wiring 里改:项目 7 的书上代码在一个串口上打开两个模块,这三个实验把 4150 并到 COM2 的 485 总线上。选错串口时返回值照反编译的真机版 dll(4017 全 null、4150 全 false,4150 的 OnOff 和 LED 推送返回成功但设备不动作,ZigBee 返回 false);串口没打开时照教材仿真版。Open / Close / 没打开就读写报告给服务器,实训台最上方用红字提示("程序在 COM2 上打开 ADAM-4150,它接在 COM3""ADAM-4150 的串口没有打开,程序却在读写它"),评分不通过时也附上。只读接线展示:鼠标移到实训台设备上,标题栏写出线路,对应通道、模块、串口高亮;串口服务器按接线列出设备,程序打开的口亮绿点;程序里串口下拉框的灰字按当前接线。打开实验时浏览器发 experiment 消息换接线,老师看学生提交时按作业的实验接线(提交接口返回 sampleId)。"4017"统一写成 ADAM-4017+
上课前逐个检查 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>
2026-10-28 17:40:57 +08:00

87 lines
8.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 任务目标
做一个"智慧会议室"预约窗体:程序一启动就每秒显示当前时间和光照度、温度、湿度、气压、空气质量。填好时、分、秒,选一种模式(会议、讨论、展示),点"预约";到了预约时间,程序自动开启这种模式,控制灯光、窗帘和主、客话筒:
| 模式 | 灯光 | 窗帘(滑动条) | 主话筒 | 客话筒 |
| ---- | ---- | -------------- | ------ | ------ |
| 会议 | 开 | 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-4150 和 ADAM-4017+ 并在 COM2 的同一条 485 总线上,书上在一个串口上打开两个模块也能用。在实训台上拖动光照、温度滑块;气压、空气质量在 ADAM-4017+ 那块点"Vin3–6 更多传感器"展开。几秒内文本框应跟着变。刚运行还没选串口时,实训台会提示串口没选(书上在定时器里每秒打开一次串口),选了 COM2 就消失。
2. 先点"实训台复位"(上次运行开着的灯会一直亮着)。模式选"讨论",时分秒填 13、20、00,然后把时钟拨到 **13:19:40**,马上点"预约"。
3. 预约时间没到时,ADAM-4150 的 **DO1 照明灯**不亮;到 13:20:00 后,应显示"智慧会议室已开启讨论模式",照明灯亮,窗帘滑块到 0,主、客话筒都是开。
4. 点"退出",灯、话筒都关掉。想再试一次,先点"实训台复位",再重新运行程序。
> 模式开启后第一次点灯光或话筒的开关图片没有反应,第二次才变:书上的 ChooseMode 只换了开关图片,没有改记录开关状态的变量,参考工程也是这样,不是你写错了。