任务说明:实验页"任务"面板、布置作业时可改写;先写项目 3 任务 2、项目 6 任务 2 两份

- 每个实验一份 task.md(任务目标、控件名表格、实现步骤、和书上不一样的地方、在平台上怎么试)
- 工具栏"评价项"改成"任务":上面是任务说明,下面是评价项和自己检查;不遮挡页面,第一次打开实验时自动打开
- 自己写的 Markdown 子集渲染,先转义全部 HTML(老师可以改写说明)
- 作业保存任务说明(新列 task),以前布置的作业用实验现在的说明
- 测试:任务说明表格里的控件名都在示例的 Designer.cs 里
- 修改作业时实验下拉框显示标题而不是编号

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
xuyueandClaude Opus 5.5 committed 2026-10-26 10:04:05 +08:00
1 parent 3b9f635c35
commit 90b739a2c7
17 files changed
+759 -219

No files matched your search

@@ -0,0 +1,42 @@
## 任务目标
做一个"楼梯灯":勾选**人体开关**后,程序每 5 秒检查一次人体红外传感器,有人就开路灯,没人就关灯;不勾选时用"开""关"两个按钮手动控制。
练习重点:复选框的 Click 事件、定时器(Timer)、控件的 Enabled 属性。详细步骤见书 p58–61。
## 界面和控件名
| 控件 | 名称(Name) | 文字(Text)和用途 |
|---|---|---|
| 窗体 | `Form1` | 人体红外ZigBee联动 |
| 灯泡 | `lamp1` | 窗体上显示路灯的亮灭 |
| 按钮 | `btn_lampOpen` | 开(手动开灯) |
| 按钮 | `btn_lampClose` | 关(手动关灯) |
| 分组框 | `groupBox1` | 配置 |
| 下拉框 | `com_lamp` | 路灯(ZigBee 协调器)的串口 |
| 下拉框 | `com_environment` | 环境采集(ADAM-4150)的串口 |
| 复选框 | `ch_bodyInfrared` | 人体开关 |
| 按钮 | `btn_open` | 打开(打开后变成"关闭") |
| 定时器 | `timer1` | Interval 设为 5000(5 秒),Enabled 保持 False |
> 书上的表格写的是 `btn_Open`,代码里是 `btn_open`。名字区分大小写,请按代码写成 `btn_open`,否则自动评分找不到这个按钮。
## 实现步骤
1. 代码开头加上 `using System.IO.Ports;` 和 `using DeviceCtrlLibrary;`。
2. **Form1_Load**:清空两个下拉框,用 `SerialPort.GetPortNames()` 把串口号加进去。
3. 写一个方法 `LampOnOff(int RelayNum, bool IsOpen)`:调用 `DeviceCtrlHelper.zigBeeHelper.OnOff` 控制实训台的路灯,再调用 `lamp1.OnOff` 让窗体上的灯泡跟着变。
4. **btn_open 的 Click**:和任务 1 一样,按钮文字是"打开"时打开 ZigBee 串口(`com_lamp.Text`)并改成"关闭",反之关闭串口。
5. **btn_lampOpen、btn_lampClose 的 Click**:分别调用 `LampOnOff(1, true)`、`LampOnOff(1, false)`。
6. **ch_bodyInfrared 的 Click**:
- 勾上时:打开 ADAM-4150 串口(`adam4150Helper.Open(com_environment.Text)`),启动 `timer1`,两个手动按钮设为不可用;
- 取消时:关闭串口,停止 `timer1`,两个按钮恢复可用。
7. **timer1 的 Tick**:读 `adam4150Helper.SetData().bodyInfraredValue`,是 `true`(有人)就开灯,否则关灯。
> 书上第 15 步说"进入 Click 事件",定时器的事件其实是 **Tick**:在设计器里双击 timer1 就会生成 `timer1_Tick`。
## 在平台上怎么试
1. 运行后,"路灯"选 **COM4**(ZigBee 协调器),"环境采集"选 **COM3**(ADAM-4150),点"打开"。
2. 点"开""关",看窗体上的灯泡和实训台的**照明灯 1** 是否一起亮灭。
3. 勾选"人体开关","开""关"按钮应变成灰色;在实训台上把**人体红外**点成"有人",5 秒内路灯应亮起,点回"无人"后 5 秒内熄灭。
+57
View File
@@ -0,0 +1,57 @@
## 任务目标
从 ADAM-4017+ 读出光照度、温度、湿度,点"保存"存进 SQL Server 数据库的 CampusEnvironment 表,在表格里显示全部记录;还能在表格里改数据后点"修改"保存,选中一行点"删除"删掉。
练习重点:ADO.NET 的 SqlConnection、SqlCommand、SqlDataAdapter,insert / update / delete 语句,DataGridView 绑定数据。详细步骤见书 p119–124。
## 先准备数据库
这个任务用任务 1 建的**环境数据表**库,并在库里新建 **CampusEnvironment** 表:ID(int,标识列,主键)、light、humidity、temperature(都是 varchar(50))、addtime(datetime)。
在右上角的**数据库**页面里建表;还没做任务 1,或者数据弄乱了,点**恢复实验初始数据**,选这个实验,库和表会自动建好。
## 界面和控件名
| 控件 | 名称(Name) | 文字(Text)和用途 |
|---|---|---|
| 窗体 | `Form1` | 校园灾情数据存储 |
| 分组框 | `groupBox2` | 配置 |
| 下拉框 | `com_port` | ADAM-4017+ 的串口 |
| 按钮 | `btn_Open` | 开启(打开后变成"关闭") |
| 分组框 | `groupBox1` | 数据显示 |
| 文本框 | `txt_light`、`txt_temperature`、`txt_humidity` | 光照度、温度、湿度 |
| 按钮 | `btn_get` | 获取 |
| 按钮 | `btn_save` | 保存 |
| 按钮 | `btnUpdate` | 修改 |
| 按钮 | `btnDelete` | 删除 |
| 分组框 | `groupBox3` | 历史记录 |
| 数据表格 | `dataGridView1` | 显示数据库里的记录 |
> 注意按钮名字的写法不统一:`btn_Open`、`btn_get`、`btn_save` 带下划线,`btnUpdate`、`btnDelete` 不带,照书上的写,自动评分按这些名字找按钮。
## 实现步骤
1. 引用 `System.Data.SqlClient`、`System.IO.Ports`、`DeviceCtrlLibrary`、`DeviceCtrlLibrary.Model`。
2. 声明全局变量:连接字符串、SqlConnection、SqlCommand、SqlDataAdapter、DataSet、串口是否打开(bool)、ADAM4017ResModel。
3. **Form1_Load**:打开数据库连接,把串口号加进 `com_port`。
4. **btn_Open 的 Click**:串口没打开就打开(`adam4017Helper.Open`)并把按钮改成"关闭",否则关闭并改回"开启"。
5. **btn_get 的 Click**:`adam4017Helper.SetData()` 读出数据,把 lightValue、temperatureValue、humidityValue 填进三个文本框。
6. 写一个 **Databind()** 方法:用 select 语句(列名起中文别名:编号、温度、湿度、光照度、时间)查出全部记录,用 SqlDataAdapter 填进 DataSet,绑定到 `dataGridView1`。
7. **btn_save 的 Click**:用 insert 语句把三个值和当前时间存进表,提示"保存成功!",再调用 Databind() 刷新表格。
8. **btnUpdate 的 Click**:用 SqlCommandBuilder 生成更新语句,`sqldata.Update(...)` 把表格里改过的数据写回数据库。
9. **btnDelete 的 Click**:按表格当前行第一列的编号,用 delete 语句删掉这一行,再刷新表格。
## 和书上不一样的地方
> **连接字符串**:平台只看 `Initial Catalog=环境数据表`,服务器名、用户名和密码照书上写或写成 `Data Source=.` 都可以。
> **insert 要写列名**:书上写的是 `insert into CampusEnvironment values (温度, 湿度, 光照度, 时间)`,没写列名时值按建表的列顺序(light、humidity、temperature)存进去,温度和光照度就存反了。要写成 `insert into CampusEnvironment (temperature, humidity, light, addtime) values (...)`。
> 书上的 `True` / `False` 大写、中文引号 `”关闭”`、`privatevoid` 都是印刷错误,照抄会编译不过。
## 在平台上怎么试
1. 运行后串口选 **COM2**(ADAM-4017+),点"开启"。
2. 在实训台上拖动光照、温度、湿度的滑块,点"获取",三个文本框应显示对应的值。
3. 点"保存",弹出"保存成功!",表格最后一行是刚存的数据——检查温度、湿度、光照度有没有存进对应的列。
4. 在表格里改一个温度,点"修改";点中某一行,点"删除"。到**数据库**页面查询 CampusEnvironment 表,看数据是不是真的变了。