10 年级 · 联网设备

一个 LED,三种信息

将已能运行的 LED 改造成清晰的状态指示器。设计三种信号,测试同伴能否识别,再依据证据改进其中一种。

本课资料

5 页 · 完整说明、示例与作答区域请见学习资料。

信号工作室一盏灯 · 三种信息

读代码,观察灯光。

选择起始模式。播放以同时观察代码与灯光,或使用单步功能在每个延时处暂停。可使用这些示例,也可改编成自己的三种信息。

状态指示灯灭

已停止。选择信息,再按“播放”。

延时计时器—

LED 在以下期间保持原状态: delay()。程序等待时,灯不会自动熄灭。

跟随指令

已停止
  1. void showReady() {
  2. ledOn();
  3. delay(1000);
  4. ledOff();
  5. }
返回 loop(),处于信息之间
showReady();调用函数
delay(3000);然后保持熄灯并等待

从 loop() 中的函数调用开始。程序运行指定函数,再返回下一行。

刚刚执行了开关指令正在此处等待

ledOn() 与 ledOff() 表示你自己的可用 LED 指令。下方框架说明如何填写。

就绪 · 时序指南每个区块的长度与持续时间成比例。
  1. 1亮 · 1000 毫秒
  2. 2灭 · 3000 毫秒 · 信息之间

1000 毫秒(ms)= 1 秒。此处短闪持续 250 毫秒,即四分之一秒。

你的设计挑战

一盏灯,清晰传达信息。

某设备只有一盏灯,没有屏幕。选择一种设备及其用户,为“就绪”“运行中”和“需要注意”设计信号。这些是假设的设备状态:程序决定显示哪种信息,并不会感测设备状态或连接互联网。

代码能运行,但用户看得懂吗?
今日流程

制作 → 测试 → 改进

55 分钟
  1. 01
    0–5 分钟

    从可用程序开始

    运行最近成功的闪烁程序并保存备份,保持原来有效的电路和设置。

  2. 02
    5–10 分钟

    选择设备和用户

    选择一种设备,例如教室打印机、充电站或桌面助手。说明谁使用它,以及为什么需要这三种信息。

  3. 03
    10–17 分钟

    规划信号指南

    规划“就绪”“运行中”和“需要注意”信号。记录每种模式、每次亮灭时长(毫秒),并解释为什么应该容易区分。示例可直接使用,也可改编。

  4. 04
    17–30 分钟

    编写三个命名函数

    将各模式放入 showReady()、showWorking() 或 showAttention(),从 loop() 调用,并逐一测试。每个信号都以熄灯结束,信息之间统一保留三秒熄灯间隔。

  5. 05
    30–34 分钟

    准备公平的测试

    教同伴使用信号指南并练习。准备每种信息各出现两次的混合序列。保持指南可见,但隐藏代码和信息顺序。上传一次,先观察一轮练习。该轮结束后的十秒长熄灯间隔一过,立即开始计分测试第 1 次。

  6. 06
    34–42 分钟

    记录六次识别测试

    每次记录预期信息、同伴回答及困惑或犹豫。测试期间不要指导。统计六次中答对的次数,诚实结果比满分更重要。

  7. 07
    42–49 分钟

    修改并复测

    根据观察修改一个时长或模式特点。如果所有信号都清晰,可预测一项有用改进,例如缩短信号。说明预测,再以不同混合顺序测试六次,记录识别效果变好、不变还是变差。

  8. 08
    49–55 分钟

    保存并解释

    保存最终程序、信号指南、两份测试记录及解释。向教师展示有效信号,或录制短视频。共用开发板时,保留自己的代码和证据。

一个新的编程小概念

为每种信息命名

函数让你为一组指令命名,再让程序运行它。你已经有可用的 LED 开关指令,今天将把它们组合成信息。

定义一次void showReady() {
  // Instructions for the ready signal
}

定义说明要执行什么。

需要时调用showReady();

调用会运行这些指令,然后继续下一行。

不熟悉这些代码术语?阅读快速指南。
函数
一组有名称的指令。void showReady() { ... } 定义函数做什么;showReady(); 调用函数,程序执行这些指令后返回下一行。
void
该函数执行指令,但不返回值。
花括号与分号
花括号 { } 包含函数指令。showReady(); 这样的函数调用以分号结束。新函数应写在 setup() 和 loop() 外部,不能写进它们的花括号中。
delay
delay(1000); 暂停程序 1000 毫秒,即一秒。亮灯后的延时控制持续发光的时长,熄灯后的延时控制黑暗的时长。
setup 与 loop
保留现有 setup() 和引脚声明。setup() 在程序启动时执行一次;loop() 反复执行,因此六条信息的测试轮次也会重复。
从可用的闪烁程序出发

起始代码

上传前填写两个辅助函数

ledOn() 与 ledOff() 下方为空。只有把以下来源中准确的 LED 开启和关闭指令复制进去,它们才能控制 LED:你自己的可用程序。保留引脚声明及 setup()。替换原来的 loop();不要再添加第二个。

  1. 保留成功闪烁程序中的引脚声明和 setup(),删除旧 loop(),再将完整代码块粘贴到 setup() 的结束花括号后。
  2. 将现有 LED 开启语句复制到 ledOn(),关闭语句复制到 ledOff()。这些空辅助函数在填写前不起作用。例如,只有当 digitalWrite(LED, HIGH); 已经是有效的开启指令时才复制它。保留自己的引脚名称和开关电平。
  3. 检查只有一个 setup() 和一个 loop()。保存、验证并上传。看完一轮练习后,在十秒长熄灯间隔结束时立即开始计分测试第 1 次。
  4. 根据设计调整信号时长。第二次测试时重新排列六次调用,让每种仍出现两次。保留五个 3000 毫秒间隔,以及最后用于结束该轮的 10000 毫秒间隔。
Arduino / ESP32 · C++
// Keep your existing pin declarations and setup() unchanged.
// Do not add a second setup() or a second loop().
// Add these two small helper functions OUTSIDE setup() and loop().
void ledOn() {
  // Paste the exact LED ON instruction from your working sketch here.
}
void ledOff() {
  // Paste the exact LED OFF instruction from your working sketch here.
}

// Each signal function ends with the light OFF.
void showReady() {
  ledOn();
  delay(1000);
  ledOff();
}

void showWorking() {
  ledOn(); delay(250);
  ledOff(); delay(250);
  ledOn(); delay(250);
  ledOff(); delay(250);
  ledOn(); delay(250);
  ledOff();
}

void showAttention() {
  ledOn(); delay(250);
  ledOff(); delay(250);
  ledOn(); delay(250);
  ledOff(); delay(250);
  ledOn(); delay(1000);
  ledOff();
}

// REPLACE your old loop() with this one.
// Each message occurs twice. Hide this order from your partner.
void loop() {
  showWorking(); delay(3000);
  showReady(); delay(3000);
  showAttention(); delay(3000);
  showReady(); delay(3000);
  showAttention(); delay(3000);
  showWorking(); delay(10000); // Longer darkness ends the test round.
}

将这些函数复制到可用程序中。这个框架不能直接替换整个程序。

可以请 AI 帮助将现有可用代码组织为函数,要求保留 LED 引脚、开发板设置和开关指令。自己检查结果,并准备解释一次函数调用和一个延时。

先了解,再改进

测试信息表达,而不是记忆力

6 次测试 + 6 次复测

指南可见

教同伴识别信号并练习,将信号指南放在他们看得见的位置。

顺序隐藏

以混合顺序让每种信息出现两次,隐藏代码和序列,不要指导同伴。

修改后再测试

根据观察或预测修改一个特点,再用不同混合顺序测试六条信息。

明确各轮边界: 练习后等待十秒熄灯间隔,下一个信号即第 1 次测试。信息之间保持三秒熄灯,第六条后保持十秒。较长间隔告知同伴该轮已结束。

每次测试都记录以下内容

测试序号预期信息同伴回答困惑或犹豫

使用学习单中的表格,比较修改前后六次测试的正确次数。诚实结果比满分更重要。

展示你的能力

课堂任务分数

8分

每行展示了证据得 1 分,尚未展示得 0 分,总分 8 分。这是形成性课堂任务分数,不是官方 MYP 评估标准等级。识别结果不必六次全对,修改也不必改善结果才能得分。请解释实际发生的情况。

  1. 1

    目的与信号指南

    写明设备和用户,记录三种信息的模式及时长。

    1 分
  2. 2

    三个有效信号

    在自己的或共用的可用设备上演示三种计划模式,每种时序或闪烁序列有所不同,信息之间保留熄灯间隔。

    1 分
  3. 3

    代码组织

    使用三个命名信号函数,从 loop() 调用。允许使用代码框架或 AI 辅助。

    1 分
  4. 4

    解释代码

    用书面或口头方式,正确解释自己代码中的一次函数调用和一个延时值。

    1 分
  5. 5

    首次测试记录

    记录六条预期信息、六个同伴回答和至少一项具体观察。指南可见,顺序隐藏。

    1 分
  6. 6

    有依据的修改

    更改一个时长或模式特点,解释首次测试或明确的预测为什么支持这项修改。

    1 分
  7. 7

    复测与比较

    以不同混合顺序再记录六次测试,诚实比较两次结果,解释结果说明了什么。

    1 分
  8. 8

    完整证据

    保存最终 .ino 代码、指南、两份测试记录,以及演示或教师确认。

    1 分
结束之前

将证据保存在一起

  • 包含 .ino 文件的最终程序文件夹
  • 附时长的信号指南
  • 两份各六次的测试记录,以及有依据的修改
  • 教师现场确认的演示或短视频

准备解释

“我们修改了 ______,因为 ______。第二次测试中,______。这说明 ______。”

在线阅读学习资料正文

如需查看图示、视觉示例与完整排版,请打开上方的学习单。

一颗 LED,三种信息

十年级设计 | 2026 年 9 月 23 日 | 55 分钟 | 任务满分 8 分

将已能运行的 LED 改造成清晰的状态指示器。设计三种信号,测试同伴能否识别,再依据证据改进其中一种。

姓名 __________________________________ 班级 __________ 日期 ______________

从可用的闪烁程序开始

使用现有且可正常工作的 ESP32、电脑和 LED 配置。保持接线、LED 引脚、开关指令和已验证的开发板设置,不需要额外元件或新接线。

运行最近成功的闪烁程序,保存备份,再创建 G10_Three_Messages_Name。保留外接 LED 电路中已有的限流电阻。如果设备停止工作,请询问教师,并在可用的共用设备上测试自己的代码。

设计状态指示灯

某设备只有一盏灯,没有屏幕。选择一种设备及其用户,为“就绪”“运行中”和“需要注意”设计信号。这些是假设的设备状态:程序决定显示哪种信息,并不会感测设备状态或连接互联网。

我的设备及其用户

________________________________________________________________________________

这位用户为什么需要这些信息?

________________________________________________________________________________

规划信号指南

记录闪烁及每次亮灭时长。单位为毫秒:1000 毫秒 = 1 秒。让模式容易区分,每种都以 LED 熄灭结束。

信息闪烁模式及亮灭时长(毫秒)
就绪
运行中
需要注意

起始构思:一次长闪;三次短闪;两次短闪后一次长闪。代码框架中长闪为 1000 毫秒,短闪和内部熄灯间隔为 250 毫秒。你可以调整。

今日安排:0–5 分钟备份 / 5–10 分钟设备和用户 / 10–17 分钟计划 / 17–30 分钟编程 / 30–34 分钟准备测试 / 34–42 分钟测试 / 42–49 分钟修改并复测 / 49–55 分钟保存

用函数构建信号

函数为一组指令命名,写出名称即可运行这组指令。每种信息使用一个函数,让程序更易读、易改。

函数:一组有名称的指令。void showReady() { ... } 定义函数做什么;showReady(); 调用函数,程序执行这些指令后返回下一行。

void:该函数执行指令,但不返回值。

花括号与分号:花括号 { } 包含函数指令。showReady(); 这样的函数调用以分号结束。新函数应写在 setup() 和 loop() 外部,不能写进它们的花括号中。

delay:delay(1000); 暂停程序 1000 毫秒,即一秒。亮灯延时控制持续发光的时长,熄灯延时控制黑暗的时长。

setup 与 loop:保留现有 setup() 和引脚声明。setup() 在程序启动时执行一次;loop() 反复执行,因此六条信息的测试轮次也会重复。

使用下一页的代码框架

1. 保留成功闪烁程序中的引脚声明和 setup(),删除旧 loop(),再将完整代码块粘贴到 setup() 的结束花括号后。

2. 将现有 LED 开启语句复制到 ledOn(),关闭语句复制到 ledOff()。这些空辅助函数在填写前不起作用。例如,只有当 digitalWrite(LED, HIGH); 已经是有效的开启指令时才复制它。保留自己的引脚名称和开关电平。

3. 检查只有一个 setup() 和一个 loop()。保存、验证并上传。看完一轮练习后,在十秒长熄灯间隔结束时立即开始计分测试第 1 次。

4. 根据设计调整信号时长。第二次测试时重新排列六次调用,让每种仍出现两次。保留五个 3000 毫秒间隔,以及最后用于结束该轮的 10000 毫秒间隔。

两个辅助函数 ledOn() 和 ledOff() 也是有名称的小指令组,各自包含你自己的可用指令。通过这些名称,信号函数可以使用硬件,而无需猜测引脚或开关电平。

检查理解

从代码中选一次函数调用。程序执行到此处时会发生什么?

________________________________________________________________________________

________________________________________________________________________________

选择一个延时值。它是多少毫秒?此时灯是亮还是灭?

________________________________________________________________________________

________________________________________________________________________________

可以请 AI 帮助将现有可用代码组织为函数,要求保留 LED 引脚、开发板设置和开关指令。自己检查结果,并准备解释一次函数调用和一个延时。

信号代码框架参考

这是现有程序的一部分,不能替换完整文件。保留引脚声明和 setup(),删除旧 loop(),粘贴代码块,再填写两个空辅助函数。

// 保持现有引脚声明和 setup() 不变。

// 不要再添加第二个 setup() 或 loop()。

// 将这两个小辅助函数添加在 setup() 和 loop() 外部。

void ledOn() {

// 在此粘贴可用程序中准确的 LED 开启指令。

}

void ledOff() {

// 在此粘贴可用程序中准确的 LED 关闭指令。

}

// 每个信号函数都以熄灯结束。

void showReady() {

ledOn();

delay(1000);

ledOff();

}

void showWorking() {

ledOn(); delay(250);

ledOff(); delay(250);

ledOn(); delay(250);

ledOff(); delay(250);

ledOn(); delay(250);

ledOff();

}

void showAttention() {

ledOn(); delay(250);

ledOff(); delay(250);

ledOn(); delay(250);

ledOff(); delay(250);

ledOn(); delay(1000);

ledOff();

}

// 用这个 loop() 替换旧版本。

// 每种信息出现两次。不要让同伴看到此顺序。

void loop() {

showWorking(); delay(3000);

showReady(); delay(3000);

showAttention(); delay(3000);

showReady(); delay(3000);

showAttention(); delay(3000);

showWorking(); delay(10000); // 较长的熄灯间隔标志该轮测试结束。

}

3000 毫秒的熄灯间隔分隔各条信息。第六条信息后,10000 毫秒的熄灯标志该轮结束,之后 loop() 重复运行。先练习一轮,再在长熄灯间隔结束时立即开始计分测试第 1 次。

在线课程及可复制代码:mistera.tech/curriculum/lessons/grade-10-one-led-three-messages/

与同伴测试信号

向同伴展示指南并练习一次。保持指南可见,隐藏代码和顺序。每轮有六条混合顺序的信息,每种出现两次。十秒长熄灯间隔结束后开始第 1 次测试,不要指导同伴。至少记录一项具体观察。

同伴 ______________________________;首次测试答对 ______ / 6

试验预期信息同伴回答犹豫或困惑
1
2
3
4
5
6

修改一个时长或模式特点。你改了什么?为什么?

________________________________________________________________________________

________________________________________________________________________________

用首次测试中的观察论证修改。如果所有信号都清晰,预测一项有用改进,例如缩短信号,再测试该预测。

以不同混合顺序复测

保持指南可见,隐藏新顺序。每种信息仍出现两次。

试验预期信息同伴回答犹豫或困惑
1
2
3
4
5
6

复测答对 ______ / 6。识别效果:更好 / 相同 / 更差。

结果说明你的修改带来了什么?

________________________________________________________________________________

展示所学

最后六分钟保存最终程序、信号指南、两份测试记录和解释。向教师展示三个有效信号,或录制短视频。共用开发板时,保留自己的代码和证据。

你的任务分数(满分 8 分)

每行展示了证据得 1 分,尚未展示得 0 分,总分 8 分。这是形成性课堂任务分数,不是官方 MYP 评估标准等级。识别结果不必六次全对,修改也不必改善结果才能得分。请解释实际发生的情况。

展示内容获得 1 分所需的证据分数
目的与信号指南写明设备和用户,记录三种信息的模式及时长。/ 1
三个有效信号在自己的或共用的可用设备上演示三种计划模式,每种时序或闪烁序列有所不同,信息之间保留熄灯间隔。/ 1
代码组织使用三个命名信号函数,从 loop() 调用。允许使用代码框架或 AI 辅助。/ 1
解释代码用书面或口头方式,正确解释自己代码中的一次函数调用和一个延时值。/ 1
首次测试记录记录六条预期信息、六个同伴回答和至少一项具体观察。指南可见,顺序隐藏。/ 1
有依据的修改更改一个时长或模式特点,解释首次测试或明确的预测为什么支持这项修改。/ 1
复测与比较以不同混合顺序再记录六次测试,诚实比较两次结果,解释结果说明了什么。/ 1
完整证据保存最终 .ino 代码、指南、两份测试记录,以及演示或教师确认。/ 1

总分 ______ / 8

保存包含 .ino 文件的最终程序文件夹、本指南与测试记录,以及演示或教师确认。今天没有额外硬件任务。

我现在能独立解释或完成的一件事

________________________________________________________________________________

________________________________________________________________________________

教师反馈或下一步

________________________________________________________________________________

________________________________________________________________________________