Files
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

6.7 KiB
Raw Permalink Blame History

任务目标

做一个"智慧寝室"控制窗体:点"开启情景模式"后,程序每秒显示当前时间和光照度、温度、湿度,并按时间段自动切换四种情景模式,控制灯光、窗帘和广播:

时间段 模式 灯光 窗帘(滑动条) 广播
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。

实现步骤

  1. 代码开头加上 using System.IO.Ports;、using DeviceCtrlLibrary;、using DeviceCtrlLibrary.Model;、using System.Threading;。
  2. 声明全局变量:串口、灯、广播是否打开(三个 bool),ADAM4017ResModel ResModel,DateTime now,以及四个时间点:起床 DateTime.Today.AddHours(6.75)、上课 AddHours(7.5)、回寝 AddHours(21.0)、熄灯 AddHours(22.0)。
  3. Load:清空 com_import,把串口号加进去。
  4. btn_apply 的 Click:没打开时打开 adam4017Helper、adam4150Helper,按钮改成"停止情景模式",启动 timer;打开着就反过来。
  5. 写 PlayMp3() 方法:广播图片换成 switch_on,给媒体播放器的 URL 设铃声文件的路径(AppDomain.CurrentDomain.BaseDirectory + "//Resources//ring.mp3"),调用 Ctlcontrols.play(),Thread.Sleep(4000) 等 4 秒,图片换回 switch_off。
  6. 写 CheckMode() 方法:用 now 和四个时间点比较,判断现在是哪种模式,lbl_mode 显示"智慧寝室正处于××模式",再按上面的表格控制:
    • 开灯 / 关灯:adam4150Helper.OnOff(1, ...) 和 lamp.OnOff(...),只在状态要变时才做;
    • 放铃声:广播还没开时 new Thread(PlayMp3).Start(),让铃声在另一个线程里放,不卡住界面;关广播:图片换成 switch_off;
    • 窗帘:设 trb_curtain.Value。
  7. timer 的 Tick:now = DateTime.Now,txt_time 显示 now.ToString("HH:mm:ss"),读出数据填进三个文本框,最后调用 CheckMode()。

在平台上怎么用时钟和广播

  • 时钟在实训台上:填一个时刻点"拨到",程序里的 DateTime.Now 就从这个时刻往后走;还可以选 10×、60× 倍速,点"恢复真实时间"回到现在。不用等到早上 6:45 才能测试起床模式。
  • 拨时间时日期别动:四个时间点是程序启动时按"今天"算好的,改了日期就对不上了。
  • 程序放铃声时,实训台上的广播喇叭亮起,浏览器里能听到声音(电脑要开音量)。

在平台上怎么试

  1. 运行后串口选 COM2(这几个实验的实训台把 ADAM-4150 和 ADAM-4017+ 并在 COM2 的同一条 485 总线上,所以书上在一个串口上打开两个模块也能用),点"开启情景模式",按钮变成"停止情景模式",txt_time 每秒走一次,拖动实训台的光照、温度、湿度滑块,文本框跟着变。
  2. 在实训台的时钟上拨到 06:50:00:应显示起床模式,ADAM-4150 的 DO1 照明灯亮,窗帘滑块到 5,广播响一声铃。
  3. 拨到 08:00:00:上课模式,灯灭,窗帘到 0。
  4. 拨到 21:30:00:回寝模式,灯亮,窗帘到 10,广播响铃。
  5. 拨到 23:00:00:熄灯模式,灯灭,窗帘到 10。
  6. 也可以拨到 6:44:50,看程序到 6:45 时自己切进起床模式。