Files
IOT_SIM/samples/p7-t2-智慧寝室/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

6.6 KiB
Raw 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,点"开启情景模式",按钮变成"停止情景模式",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 时自己切进起床模式。