开始之前:今天来了一个人
你好,我是吴老师。
前面几课我们让板子陪你玩:下棋、打游戏、听音乐。今天换个活法——让板子帮你。
而且,今天有人来找你帮忙。
他叫小明,四年级。他把麻烦说给你听:
请你扮演一个四年级的小学生,名字叫小明。
你有一个麻烦:经常忘记带今天上课要用的书,很头疼 ——
每天早上到教室才发现,只能跟同桌借。
(别的你也不知道 —— 你就是个普通小学生,没想过怎么解决。)
规则:
1. 你说话要像一个真的四年级学生:句子短,想到什么说什么
2. 一次只说一点,别一口气把情况全说完了 —— 等对方问你
3. 对方问你什么,你就老实回答什么
4. 你不知道"该做什么工具",你只知道自己有这个麻烦
现在开始:先打个招呼,然后说说你的麻烦。
说完就停下来,等对方提问。
把这段发给电脑上的 AI(第 3 课装好 Skill 的那个)。从现在起,它就是小明,不是 AI 助手。
今天你是产品经理。 有人跑来说"我有个麻烦",你要做的是:问清楚他到底需要什么 → 做出个东西给他 → 交到他手上,问他好不好用。 他往往说不清自己要什么 —— 那是你的事了。
本课一句话(先说,看不懂没关系,后面会懂): 课程表不是"画在屏幕上的几行字",而是"存进板子内存里的一张表"。 数据是货,画面是摆出来的摊。
一、⚠️ 停 —— 先别动手
小明说完,你脑子里多半已经冒出来答案了:"做个课程表呗。"
很合理。先别动手。
⭐ 你现在知道的信息还不够。
你知道:他老忘带书。 你不知道:他什么时候忘、在哪儿想起来、他试过什么办法。
二、像侦探一样问他
| 该问 | 想挖出什么 |
|---|---|
| "能说说你最近一次忘带书是什么时候吗?" | 一个真实的故事 —— 比任何总结都有用 |
| "然后呢?那时候你在哪儿?" | 细节。细节里藏着答案 |
| "你以前想过什么办法吗?" | 他试过的,说明什么不管用 |
| ⭐ "你什么时候会想起这件事?" | 决定了工具该什么时候出现 |
| ❌ 别问 | 为什么 |
|---|---|
| "你要什么功能?" | 他要是知道,就不用找你了 |
| "是不是要个课程表?" | 你把答案塞给他了 —— 他会说"对对对",做出来才发现不对 |
⭐ 一句"能举个例子吗",胜过十句"你到底要什么"。 因为人讲不准确自己的需求,但讲得清楚发生过的事。
三、你到底问出了什么
聊几轮之后,你会发现他说的都是零碎的事:
- "我都是到教室才想起来的"
- "有一次美术课要彩笔,我忘了,只能借同桌的"
- ⭐ "晚上收书包的时候我懒得翻课表,太麻烦了"
最后一句话最值钱。 把零碎的话拼起来:
| 要回答 | 从小明的话里 |
|---|---|
| 他真正的麻烦 | 不是"不知道明天有什么课",是收书包的时候懒得查 |
| 什么时候用 | 晚上收书包那几分钟 |
| 怎么算做成了 | 收书包时看一眼,第二天不用借东西 |
⭐ 看出来了吗? 他嘴上说"帮我做个工具",但真正的麻烦是"收书包时懒得翻课表"。 你要是直接做个课程表,他还是懒得看。
💡 而且注意:他要看的不只是"有什么课",更是 "要带什么东西"。 这一条会直接决定你那张表里该存什么数据 —— 记住它,第七节要用。
四、先看板子怎么"想"这件事
现在轮到技术了。先别听我讲,让板子先演示一遍,你负责猜它接下来会干什么。
请使用课程的 esp32s3-touchboard-hardware-dev Skill,
烧录本课配套程序 assets/codes/demo01_schedule_table:
板子会显示一张课程表,屏幕底部左右各有一个按钮"< 前一天 / 后一天 >",
用手指点它们可以翻看不同星期。板子会判断"现在是第几节课"并高亮出来。
烧录前把 firmware 里的中文字体复制好(见 README),不需要联网。
烧录后告诉我:屏幕上一开始显示的是星期几、正在上的那节是什么课。
几秒后,板子上会出现一张课程表:标题栏写着"课程表 · 周一",下面 6 行,每行是"第几节 + 几点上 + 什么课",其中有一行是绿色的——那是"正在上"的课。
五、先看"画面",再找"数据"
问一个最根本的问题:板子的课程表,是从屏幕上"画"出来的,还是从内存里"查"出来的?
为了让你看清,我们做第二个演示,把"数据"和"画面"拆开。
请改烧录 assets/codes/demo02_data_vs_view:
同样一张课程表,但屏幕左下角会用一个小方块显示"内存里的第几行数据"。
你点"后一天"时,先留意这个数据角标是怎么变的,再看整屏画面是怎么变的。
烧录后告诉我:翻页的时候,是"数据先变"还是"画面先变"?
你会发现:每次翻页,其实是先把内存里的"当前星期"这个数改掉,再重画一遍。那个数,就是数据的"开关"。
关键点:屏幕上的课程表是"结果",内存里那张表是"原因"。改数据 → 重画 → 看到新画面。这就是"数据组织"的法则:你想让画面变,就去改数据,而不是去擦屏幕。
六、这张"表"长什么样:二维数组
现在说说"表"本身。我们要存的是 7 天 × 6 节课,一共 42 个格子。每个格子里头放一个字:那节课的名字。
| 行(星期) | 第1节 | 第2节 | 第3节 | 第4节 | 第5节 | 第6节 |
|---|---|---|---|---|---|---|
| 周一 | 语文 | 数学 | 英语 | 物理 | 体育 | 自习 |
| 周二 | 数学 | 英语 | 语文 | 化学 | 音乐 | 班会 |
| …… | ||||||
| 周日 | 自习 | 自习 | 自习 | 自习 | 自习 | 自习 |
计算机里,这种"行×列"的格子,叫二维数组——一个"装表格的格子"。它长这样(中文伪代码,不用背):
课表 = [
["语文","数学","英语","物理","体育","自习"], ← 周一
["数学","英语","语文","化学","音乐","班会"], ← 周二
... ← 周三到周六
["自习","自习","自习","自习","自习","自习"] ← 周日
]
查某一节课,就报两个数:第几行(星期几)、第几列(第几节)。比如 课表[0][2] = 周一的第 3 节课 = "英语"。
⚠️ 给比喻划边界:说它是"座位表"很贴切,但注意计算机是从 0 开始数的——第 1 节是第 0 列。所以"周三第 3 节"是
课表[2][2],不是[3][3]。这个小差别,等你写代码时会踩到。
七、"现在在上一节什么课"是怎么判断的
那行绿色高亮怎么来的?板子拿两样东西做比较:
- 今天是星期几(一个 0–6 的数);
- 现在几点(现在几时几分)。
然后它去查表:如果今天是周一,且现在正好落在"8:00 到 8:45"之间,那第 1 节的"语文"就是现在正在上的。 这就是一条判断规则:
如果 今天 == 正在显示的星期
并且 现在的时间 ≥ 这节课的开始时间
并且 现在的时间 < 这节课的开始时间 + 45分钟
那么 高亮这节课
你看,这里没有一个"魔法",全是拿数据比大小。板子没有"课程表"这个概念,它只是在做一道又一道的比较题。
八、⭐ 把小明的话,变成 AI 听得懂的
刚才演示的是我提前写好的课程表。现在换你 ——
⭐ 你要做的是"小明那张表"。
而这里有个你自己采访出来的东西别浪费:第三节你问出来,他要看的不只是"有什么课",更是"要带什么东西"。
💡 所以你这张表,可能和演示里那张不一样。 演示里只存了"课名";小明那张可能还要存"要带什么"。
这就是你当产品经理的价值 —— 表里该存什么,是由他的需求定的,不是由"课程表一般长什么样"定的。
怎么把它装进板子?你有两条路:
- A. 自己一行一行填:把他周一到周五的课,一个个敲进那个数组里。课多的时候这就很累。
- B. 请 AI 帮你生成这张表:你告诉它"他有哪些课、要带什么",让它帮你整理成那个二维数组的格式。
今天我们要练的,就是 B 这条路——因为你会看到:你说得越清楚,AI 给的课表就越接近他要的。
请先把"小明的课表"用一句话说清楚(注意:要说全):
小明的情况是这样的:周一到周五上课,周六日休息。
每天 6 节,每节 45 分钟,从上午 8:00 开始,10:00 之间有个课间操(跳过一节安排)。
他的课是:周一 语文、数学、英语、物理、体育、自习。……
⭐ 他还需要知道"每天要带什么":周一要带语文书、数学书、跳绳。
请帮我整理成一个二维数组(7 天 × 6 节,中文课程名),
另外告诉我:如果我想再加一列"要带的东西",该怎么加。
先别急着发给 AI,我们先玩一个"提示词猜谜":
| 我这样描述 | AI 会猜成什么 | 差在哪儿 |
|---|---|---|
| "帮我做个课程表" | 不知道几节、不知道几点上、不知道周几休 | 太模糊,AI 只能自己编 |
| "6 节课,从 8 点开始" | 还是没说第几节课上什么 | 缺了"每节上了什么"这个最关键的 |
| "周一到周五,6 节,8:00 起,每节 45 分钟,中间 10:00 课间操跳一节,周一[语数英物体自]" | 基本能成 | 就差"周日呢?"没交代 |
看出来了吗:AI 不会替你"猜"你心里想要的课程表。它只会按你真正说出来的去整理。漏掉"周日休不休息""这节到底上什么",它就会自作主张。
本课第一句话要说清:提示词 = 把"你心里想要的"翻译成"AI 能听懂的"。 缺了哪个条件,它就补哪个,补的往往不是你想要的。
九、动手:请 AI 生成小明那张表
现在真来一次。
小明的情况是这样的:周一到周五上课,周六日休息。
每天 6 节,每节 45 分钟。
第 1 节 8:00 开始,第 2 节 9:00,第 3 节 10:00(课间操,跳一节,这节自动顺延),
第 5 节 14:00 开始(下午),第 6 节 15:00。
具体课程:周一 语文数学英语体育自习;周二 数学英语语文音乐;……
(把你采访到的补全)
⭐ 另外,每天还要显示"要带什么"(比如周一要带语文书、跳绳)。
请把它整理成一个 C++ 的二维数组(7 天 × 6 节,中文课程名),
并说明第 0 列代表什么、行和列分别从几开始数。
请你把 AI 给的结果,和小明的真实情况对一遍。凡是它不一样的,几乎都是你没说清楚的。 把对照填进表里:
| 这一项 | AI 给的 | 小明真实的 | 我漏说了什么 |
|---|---|---|---|
| 周日 | 休息 | 没写"周日不上课" | |
| "要带什么" | |||
| 第 4 节的课 |
改一处,AI 就变给你看——这就是提示词的力量:精确描述一步,效果前进一步。
十、⭐ 交付给小明
这一步最容易被跳过,但它是产品经理的考试。
装好之后,回到对话里(它现在还是小明),告诉他你做了什么:
我做好了一个工具。它长这样:
____(把屏幕上的样子说给他听)
它能做到你上次说的那件事:晚上收书包的时候看一眼,
就知道明天要带什么。你觉得能帮上你吗?
然后 —— 认真听他怎么说。
小明多半会挑出毛病:
小明:嗯……可是我怎么知道"明天"是星期几啊?它会不会自己变? 小明:还有,它要是一直显示星期一的,那我岂不是每天都带一样的?
⭐ 两句都很值钱。
第一句戳中了一个真实的技术边界:这块板子没有电池时钟, 断电就忘了现在是几号 —— 所以它不会自己知道"明天是周几"。
第二句说明:得让他能自己翻(这就是演示里那两个"前一天 / 后一天"按钮的用处)。
改完再给他看。 来回几轮,东西才真的能用。
📌 下一课(第 37 课 番茄时钟)会专门面对"时间从哪来"这件事。 今天先记住:板子记着的那个"现在几点",是可能不准的。
十一、分析:这个项目用到了哪些技术
我们不让 AI 深挖代码,但你要能说清楚这个项目用了哪些技术、各自负责什么。读程序不如看这张"零件表":
| 技术 / 概念 | 在这个项目里干什么 | 你之前在哪学过 |
|---|---|---|
| 二维数组 | 把 7 天 × 6 节的课程名装进一张内存表 | 第 29 课(棋盘=二维数组) |
| RTC 时间 | 知道"现在是星期几、几点",用来高亮 | 第 11/14 课(时间概念) |
| 数字比较 | "现在 ≥ 开始 && 现在 < 结束"判断正在上 | 第 2 课(if 判断) |
| 触摸区域判断 | 点"前一天/后一天"按钮 = 坐标落在底部区域 | 第 8 课(按钮=区域判断) |
| 重绘 | 改一个数据 → 整屏重画 | 第 6/7 课(擦与画、帧) |
| 时间来源 | 板子没有独立时钟芯片,用主控计时 + 联网对时 | 第 19 课(NTP 对时) |
⚠️ 其中 "时间从哪来" 是个真实边界:这块板没有独立的 RTC 电池时钟芯片。它记住的"现在几点"是靠主控自己数数 + 连 WiFi 后从网络对时(第 19 课)。所以断电后要重新对时,它不会永远准。这个我们要在下一课(番茄时钟)里专门面对。
一句话总结:这个项目是"用一张二维数组存数据 + 用时间做判断 + 用触摸做操作 + 用重绘把结果画出来"。它没有用 AI,完全是本地规则。但它教会我们最重要的一课:把现实世界的"安排"抽象成计算机能操作的"数据"。
十二、改一个条件,看它怎么变
选一个来改,先预测再烧录:
| 我想改 | 该动哪一块数据 | 我预测会发生什么 |
|---|---|---|
| 把课改成 7 节 | 数组从 6 列变 7 列 | 屏幕该多画一行 |
| 每节课改成 40 分钟 | 那 45 这个数 | "正在上"的时间段变短了 |
| 周四下午全改成"社团" | 周四那几格的内容 | 只有周四变了 |
| 把"周一"改显示成"星期一" | 星期名那一格 | 标题栏文字变了 |
先预测,再验证。 你会看到:改动无论多大,你都是去改数据,而不是改画面。
十三、如果它没按你想的来
| 现象 | 先查什么 |
|---|---|
| "正在上"从来不变绿 | 时间有没有对?如果是硬编码的演示时间,现在到底几点? |
| 点按钮没反应 | 触摸坐标判断对吗?是不是点在了底部按钮区? |
| 高亮的是昨天/明天的课 | 星期几换算对了吗(计算机从周日还是周一开始数)? |
| 全部都是课,没有星期几 | 星期数组有没有读对? |
记住老规矩:现象是观察,原因要验证。 把"现在是星期几"这个数通过串口打印出来,看它到底是不是你以为的那个值。
十四、下课前,把"数据组织"讲给我听
先别看 AI 的回答,自己说一遍:
- ⭐ 小明嘴上说"帮我做个工具",他真正的麻烦是什么? 你是怎么问出来的?
- 板子手里的课程表和屏幕上的课程表,是同一个东西吗?哪个是"原因"、哪个是"结果"?
- 二维数组存"7 天 × 6 节",查周二的第 3 节课,下标该写哪两个数?为什么是从 0 开始?
- "正在上"怎么判断?板子拿了哪两个数去比?
- 为什么说"提示词 = 把心里想要的翻译成 AI 能听懂的"?漏说一个条件,会发生什么?
- 这个项目用了哪些技术?分别干什么?
- 板子断电后时间会怎样?为什么?为什么这件事必须告诉小明?
今天请留下三样东西:一张课程表数据(存进数组)、一个你改过的条件(比如 7 节课)、 以及一句"我问出的哪一句话,改变了我的做法"。
十五、最后留给你:能"帮"的才刚开始
一张课表,只是"帮"你的第一步。想想看,同样是"数据 + 判断 + 显示"这个套路,还能做出什么?
| 方向 | 用什么数据 | 想让板子帮你什么 |
|---|---|---|
| 作业清单 | 科目 + 截止日 + 是否完成 | 没做完的置顶提醒 |
| 考试倒计时 | 科目 + 考试日期 | 离考试还有几天 |
| 社团日程 | 活动 + 时间 | 今天下午有什么活动 |
| 家庭值班表 | 谁 + 星期几 | 今天谁洗碗 |
这些全是"我们把一件事抽象成一张表,让板子去查、去比、去显示。" 数据结构变了,板子"帮"你的方式就变了。
下一课,我们要加上一样新东西——AI。让板子不仅"记得你的安排",还能"想一想、答一答"。那时候你会发现,"精确描述"这一手功夫,正是让 AI 听懂你的关键。
教师备课备注(不作为课堂口播)
课程定位
- 第七章「学习助手」开篇。此章 4 课(34–37)主题是让板子从"玩"转向"帮",同时把"提示词精确描述"作为贯穿全章的能力主线。本课是纯本地数据课,不进 AI,但第一次系统引入"提示词=翻译需求",为第 35、36 课的 AI 课打底。
- ⭐ 2026-09-24 改版:本课加了一层「产品经理」范式(连同 36/37/46/47)。
结构变成:小明来求助 → 学生采访他 → 挖出真需求 → 做 → 交付 → 听反馈。
- 为什么加:原来的入口是"你的板子能不能当日程管家"(老师提问), 现在换成一个同龄人带着真麻烦来找你 —— 学生要自己问出需求,而不是被给一个任务。
- 和"提示词主线"的关系:提示词要"说清楚",前提是你自己先想清楚。 采访这一层正好补上前半段:先问明白,再说明白。
- ⚠️ 技术主轴一字未动:二维数组 / 数据vs画面 / "正在上"判断 / 时间边界,全部原样保留。
- 本课技术落点:二维数组组织数据、RTC 时间判断、触摸操作、重绘呈现。核心认知是"改数据 → 重画 → 新画面",即"数据是原因,画面是结果"。明确不讲"整屏重画的性能优化"(这是第 6/7 课已解决的)。
- 与第 29 课(五子棋)严格关联:棋盘是"二维数组存静态数据",课表是"二维数组存一维时间表",复用同一思维。教学边界:不深入代码实现——学生要能说清"用了哪几种技术、各干什么、数据怎么组织",而不是背语法(符合全章"不深究实现"的要求)。
本课新增的核心知识点
- 数据 vs 画面:屏幕上的课表是"结果",内存里的二维数组是"原因"。改数据才改画面。这是"数据组织"的总纲。
- 二维数组:
[行][列],行=星期、列=第几节;下标从 0 开始。这是本课技术核心。 - "正在上"判断:一对数字比较(时间落在 [开始,开始+45) 区间)+ 星期匹配。无魔法,全是比较。
- 提示词 = 翻译需求:AI 不会猜,只按你说的整理;漏掉条件它就擅自补。这是全章提示词主线的第 1 课,要让学生亲眼看到"模糊→乱、精确→对"。
- 时间边界(真难点):本板无独立 RTC 时钟芯片,时间来源是"主控计时 + 联网对时",断电需重对时。为 37 课番茄时钟做铺垫。
必须避免的错误
- 不要说"板子知道现在是几点"——要说"板子记着一个数,这个数可能不准(断电就丢了)"。它没有"感觉时间"的能力,只是个计数的。
- 不要提前剧透"二维数组下标从 0 开始"——先让学生用"第 1 节=第 0 列"踩一次,再点破。
- 不要在课表这一课引入 JSON 或 TF 卡存数据——本课重点是"内存里的表",存储是第 36 课(背单词)的事。
- 提示词训练不要变成"写作文"——引导学生在缺了什么、补了什么上观察,而不是比长。
执行约束
- FQBN:
esp32:esp32:esp32s3:FlashSize=16M,PartitionScheme=app3M_fat9M_16MB,CDCOnBoot=cdc,PSRAM=opi - 屏幕:CS=10 / DC=46 / MOSI=11 / SCLK=12 / BL=45(TFT_eSPI
User_Setup.h已内置);触摸 FT6336 I2C SDA=16 / SCL=15。 - 中文显示:本项目直接
tft.drawString画中文会乱码。学生代码必须用font/ChineseFont16.h里的drawUtf8()/drawCentered()(GB2312 全量 7445 字)。README 已给复制命令。务必在实板验证中文渲染(这是本课 demo 相对Example_37_schedule的改进点——原 demo 未接中文字库)。 - 依赖库:
TFT_eSPI、FT6336(项目内)、ESP32Time。本课随 demo 附带ChineseFont16.h。需PSRAM=opi。 - 密钥:本课不需要任何云 API Key,纯本地。不写进教案、截图。
课堂执行要点
- 顺序建议:小明出场(发角色提示词)→ ⚠️先别动手 → 采访 → 拼真需求 → demo01(现象:真课程表 + 绿格)→ demo02(拆开:数据先变还是画面先变)→ 提示词猜谜表 → 请 AI 生成小明那张表 → 对照纠偏 → 交付给小明 → 改一个条件 → 下课前复述。 ⚠️ 前四节不要压缩。学生第一次当产品经理,入口这口气松了,后面就变成"又被给了一个任务"。
- ⭐ 灵魂追问 ①(新增,采访主线):"小明嘴上说'帮我做个工具',他真正的麻烦是什么?" 正确方向是**"收书包时懒得翻课表"** —— 让他自己复述一遍这个反差。 再追一句:"他说要看'有什么课',那还不够 —— 他还想看什么?"(→ 要带什么) 这一问直接决定了第七节那张表里该存什么,务必接上。
- 灵魂追问 ②:"板子的课程表是从内存查出来的,不是从屏幕画出来的"——让学生看演示看到"先改数据角标,画面才变"。
- 灵魂追问 ③(提示词主线):"AI 不会猜,只按你说的整理;漏一个条件,它就会补一个你可能不想要的。" 用第八节(提示词猜谜)那张对照表当现场道具,先让学生填预测,再和 AI 结果比对。
- ⭐ 交付这一步不能省。小明的两句反馈是有意设计的,各自接一个真实技术点:
- "我怎么知道明天是星期几?" → 板子没有电池时钟(第七节技术边界 + 37 课铺垫)
- "它一直显示星期一的?" → 得让他能自己翻(对应 demo 里那两个翻页按钮)
- 观察表必须先预测后实测(八、改条件那张表的"我预测"列留空让学生填)。
- 时间可以靠演示值(如定时到"正在上"时段),但要点破"这不是真时间,断电就丢"。
待办与遗留
demo01_schedule_table/demo02_data_vs_view源码已写(含中文字库),尚未实板验证。吴老师实板验收重点:① 中文渲染是否正常(drawUtf8对ChineseFont16.h);② "正在上"高亮在演示时间段是否正确;③ 底部按钮触摸区域是否点得准。- 是否接入真实 NTP 对时(而非硬编码演示时间)由教师决定;本课为教学清晰,先用硬编码演示值,把"NTP 对时"留给第 37 课。