AI脑洞板
完整教案
自学课件
第 34 课 · 共 34/51 课

我的课程表——用数据组织一天 用数据组织一天

课时
待定
器材
ESP32-S3 触摸屏板 + USB 线
前置知识
无
配套代码
见项目 demo 目录

开始之前:今天来了一个人

你好,我是吴老师。

前面几课我们让板子陪你玩:下棋、打游戏、听音乐。今天换个活法——让板子帮你。

而且,今天有人来找你帮忙。

他叫小明,四年级。他把麻烦说给你听:

请你扮演一个四年级的小学生,名字叫小明。

你有一个麻烦:经常忘记带今天上课要用的书,很头疼 ——
每天早上到教室才发现,只能跟同桌借。
(别的你也不知道 —— 你就是个普通小学生,没想过怎么解决。)

规则:
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]。这个小差别,等你写代码时会踩到。

七、"现在在上一节什么课"是怎么判断的

那行绿色高亮怎么来的?板子拿两样东西做比较:

  1. 今天是星期几(一个 0–6 的数);
  2. 现在几点(现在几时几分)。

然后它去查表:如果今天是周一,且现在正好落在"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 的回答,自己说一遍:

  1. ⭐ 小明嘴上说"帮我做个工具",他真正的麻烦是什么? 你是怎么问出来的?
  2. 板子手里的课程表和屏幕上的课程表,是同一个东西吗?哪个是"原因"、哪个是"结果"?
  3. 二维数组存"7 天 × 6 节",查周二的第 3 节课,下标该写哪两个数?为什么是从 0 开始?
  4. "正在上"怎么判断?板子拿了哪两个数去比?
  5. 为什么说"提示词 = 把心里想要的翻译成 AI 能听懂的"?漏说一个条件,会发生什么?
  6. 这个项目用了哪些技术?分别干什么?
  7. 板子断电后时间会怎样?为什么?为什么这件事必须告诉小明?

今天请留下三样东西:一张课程表数据(存进数组)、一个你改过的条件(比如 7 节课)、 以及一句"我问出的哪一句话,改变了我的做法"。

十五、最后留给你:能"帮"的才刚开始

一张课表,只是"帮"你的第一步。想想看,同样是"数据 + 判断 + 显示"这个套路,还能做出什么?

方向用什么数据想让板子帮你什么
作业清单科目 + 截止日 + 是否完成没做完的置顶提醒
考试倒计时科目 + 考试日期离考试还有几天
社团日程活动 + 时间今天下午有什么活动
家庭值班表谁 + 星期几今天谁洗碗

这些全是"我们把一件事抽象成一张表,让板子去查、去比、去显示。" 数据结构变了,板子"帮"你的方式就变了。

下一课,我们要加上一样新东西——AI。让板子不仅"记得你的安排",还能"想一想、答一答"。那时候你会发现,"精确描述"这一手功夫,正是让 AI 听懂你的关键。


教师备课备注(不作为课堂口播)

课程定位

  • 第七章「学习助手」开篇。此章 4 课(34–37)主题是让板子从"玩"转向"帮",同时把"提示词精确描述"作为贯穿全章的能力主线。本课是纯本地数据课,不进 AI,但第一次系统引入"提示词=翻译需求",为第 35、36 课的 AI 课打底。
  • ⭐ 2026-09-24 改版:本课加了一层「产品经理」范式(连同 36/37/46/47)。 结构变成:小明来求助 → 学生采访他 → 挖出真需求 → 做 → 交付 → 听反馈。
    • 为什么加:原来的入口是"你的板子能不能当日程管家"(老师提问), 现在换成一个同龄人带着真麻烦来找你 —— 学生要自己问出需求,而不是被给一个任务。
    • 和"提示词主线"的关系:提示词要"说清楚",前提是你自己先想清楚。 采访这一层正好补上前半段:先问明白,再说明白。
    • ⚠️ 技术主轴一字未动:二维数组 / 数据vs画面 / "正在上"判断 / 时间边界,全部原样保留。
  • 本课技术落点:二维数组组织数据、RTC 时间判断、触摸操作、重绘呈现。核心认知是"改数据 → 重画 → 新画面",即"数据是原因,画面是结果"。明确不讲"整屏重画的性能优化"(这是第 6/7 课已解决的)。
  • 与第 29 课(五子棋)严格关联:棋盘是"二维数组存静态数据",课表是"二维数组存一维时间表",复用同一思维。教学边界:不深入代码实现——学生要能说清"用了哪几种技术、各干什么、数据怎么组织",而不是背语法(符合全章"不深究实现"的要求)。

本课新增的核心知识点

  1. 数据 vs 画面:屏幕上的课表是"结果",内存里的二维数组是"原因"。改数据才改画面。这是"数据组织"的总纲。
  2. 二维数组:[行][列],行=星期、列=第几节;下标从 0 开始。这是本课技术核心。
  3. "正在上"判断:一对数字比较(时间落在 [开始,开始+45) 区间)+ 星期匹配。无魔法,全是比较。
  4. 提示词 = 翻译需求:AI 不会猜,只按你说的整理;漏掉条件它就擅自补。这是全章提示词主线的第 1 课,要让学生亲眼看到"模糊→乱、精确→对"。
  5. 时间边界(真难点):本板无独立 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 课。

第 34 课 · 电子课程表

第 34 课 · 电子课程表

屏幕显示我的一周课程表,点底部按钮翻星期,还会自动高亮「正在上」的那一节。

34数据结构二维数组界面布局
第 34 课 · 数据与画面

第 34 课 · 数据与画面

一样的课程表,但左下角多一个红色小方块,写着内存里现在的第几行数据。

34数据结构二维数组