自学读本:跟着读、照着做,卡住就问 AI
你好,我是吴老师。
这份是给你自己读的——不用等我讲,你一段一段往下看,看到让你停下来的地方,就照着做一遍。看不懂的整段复制给 AI,加一句"请一次只解释一个概念,讲完问我一个小问题"。
读完之后,你应该能:说出 BOOT 按钮是输入、RGB 灯是输出,中间的主控在"处理";解释 LOW/HIGH 和二进制有什么关系;说清为什么要"记住上一次状态"、消抖在解决什么问题;做出一个用按钮控制的自己的作品。
用时:约 90 分钟。准备:板子、数据线、已经接入板卡 Skill 的 WorkBuddy(第 1 课的 RGB 灯程序留着)。
一、今天的目标:按一下,灯换一种颜色
上一课,我们教会了 RGB 灯变颜色。可是一直自己变化的灯,还不算真正"听话"——它不知道你在旁边。
今天给它介绍一位小伙伴:板子上的 BOOT 按钮。按一下,灯换一种颜色;再按一下,再换。你会发现:**人的动作可以进入电脑,电脑也能让灯回应。**这就是"输入"和"输出"。
先做两件事。第一件,让 AI 先查资料再动手:
我是小学生,正在学习触摸屏板。
请先读取 esp32s3-touchboard-hardware-dev Skill,确认:
1. BOOT 按钮实际连接哪个 GPIO;
2. 板载 RGB 灯的数据引脚和灯珠类型;
3. 现在电脑检测到哪些开发板和端口。
只检查,不写程序、不烧录。请用小学生能听懂的话告诉我。
如果 AI 直接猜答案,追问它依据的文件路径。
第二件,确认无误后让它写程序:
请新建一个教学程序:每按下一次 BOOT,RGB 灯按红色、绿色、蓝色的顺序换色。
每次按下只换一次,按住不重复换色;灯光使用较低亮度。
在屏幕上显示"按下""松开"和当前颜色。
请使用中文注释,保留上一课程序,不使用 WiFi。
编译和烧录前先运行 arduino-cli board list,确认目标端口后再操作。
烧录后实际按三次按钮,记录:第一次什么颜色、第二次什么颜色、按住不放时有没有疯狂换色。观察比"上传成功"更重要。
二、人的动作,怎样变成数字?
先讲个比喻。按钮像一扇只有两种状态的小门:门关着、门开着。电路也有两种容易判断的状态——低电平 LOW 和 高电平 HIGH。
在这块板上,BOOT 通常是按下时 LOW、松开时 HIGH(一定以板卡资料和实测为准)。你可以把它想成:松手是"1",按下是"0"。
这个 1 和 0 不是考试分数,而是电路给主控的两个信号。
ESP32-S3 不会"看见"你的手指。它只做一件事:读 GPIO0 上的电平。读到 LOW,它知道按钮可能被按下;读到 HIGH,它知道按钮可能松开了。然后程序决定要不要换灯。
完整链路是:
手指按下 → BOOT 电路变化 → GPIO0 读到 LOW → ESP32-S3 判断 → RGB 灯收到新颜色 → 你看见灯变色。
三、LOW、HIGH 怎样变成 0 和 1
电脑处理文字、数字、颜色,底层都是开关状态。为了好记,我们约定:LOW 记成 0,HIGH 记成 1。这里的 0 和 1 不是说电路里完全没有电,而是主控把电平分成两类后用的数字名字。
| 按钮状态 | 电路电平 | 记号 |
|---|---|---|
| 按下(本板常见情况) | LOW | 0 |
| 松开(本板常见情况) | HIGH | 1 |
如果你看到一串 1010,别当成"一千零一十"——它其实是"1、0、1、0"四个开关的状态。
为什么电脑偏爱只有 0 和 1 的二进制?
电脑里面有很多很多小小的电子开关。开关只有开、关两种,最容易可靠判断。要是硬让一个开关表示 0 到 9 十种状态,电压就得分得很细,温度一干扰就容易认错。
用"低 / 高"两类,电路简单又可靠——这就是二进制:只使用 0 和 1。
十进制数到 9 进一位,二进制数到 1 就进一位:10 表示"右边的 0 个 1 + 左边的 1 个 2"。101 表示 4+0+1,也就是十进制的 5。今天不要求背换算,只要知道:每一个 0 或 1,都可以对应一个开关状态。
想让 AI 用按钮带你数一遍:
请用 BOOT 按钮解释二进制。
先让我观察按下和松开对应的 LOW、HIGH,
再把 LOW 写成 0、HIGH 写成 1。
请用三个开关解释 000、001、010、011、100 分别表示什么,
一次讲一个,不要先讲复杂数学。
四、输入、处理和输出:三个小角色
- 输入:把外界消息送进板子。BOOT 是输入,触摸屏、麦克风也可以是输入。
- 处理:ESP32-S3 像小指挥员——读取消息、记住上一次颜色、决定下一步做什么。
- 输出:把结果表现出来。RGB 灯、屏幕、扬声器都是输出。
让 AI 用这块板子给你举例:
请用"输入—处理—输出"解释刚才的 BOOT 换色程序。
每次只讲一个角色,并问我一个小问题,等我回答后再继续。
不要先讲复杂代码。
五、信号:按钮慢,数据线快
"信号"可以理解成电路里传递消息的变化。按钮按下、松开,造成的是比较慢的高低电平变化;RGB 灯的数据线上也在用高低电平传消息,但变化非常快、有严格顺序。
所以高低电平不是"按钮才有":
| 方向 | 快慢 | 干什么 | |
|---|---|---|---|
| BOOT 按钮 | 进板子(输入) | 慢(人手一下) | 告诉主控:按下/松开了 |
| RGB 灯数据线 | 出板子(输出) | 很快、有顺序 | 把颜色一位一位送给灯 |
可以请 AI 用"传纸条"的故事解释这个区别,然后让它指出故事和真实电路哪里不完全一样。
六、为什么按住按钮,不能换很多次?
这里有个很关键的问题。
程序会每隔很短的时间就读一次按钮——一秒钟读几千次。如果"读到 LOW 就换色",你按住一秒,它就读到几千次 LOW,灯就会疯狂闪烁。
我们想要的,是**"刚刚从松开变成按下"的那一刻**。这需要程序记住上一次读到的状态:
- 上一次是 HIGH(松开),这一次变成 LOW(按下)→ 算一次新按下;
- 上一次已经是 LOW(一直按着)→ 不重复处理。
真实按钮还有个麻烦:按下时金属片会轻微抖动,像门碰到门框后弹几下——一瞬间电平会跳来跳去。程序需要消抖:等状态稳定后再确认。
不用背这些名词,但要知道一句话:一次手指动作,程序应该只算一次。
让 AI 做个对比实验,你会印象更深:
请做两个版本进行对比:
A 版本:只要读到 LOW 就换色;
B 版本:只在 HIGH 变成 LOW 时换色,并做消抖。
分别烧录或在程序中切换,告诉我观察重点。
请保留旧版本,先让我观察再解释原因。
A 版本按住会刷屏换色,B 版本稳稳只换一次——这就是程序里"判断"的价值。
七、动手做
任务 1:按键换色三连按
完成第一节的内容。烧录后按三次按钮,填写记录:
| 第几次按 | 看到的颜色 | 和我预想的一样吗 |
|---|---|---|
| 第 1 次 | 自己填写 | |
| 第 2 次 | 自己填写 | |
| 第 3 次 | 自己填写 |
再按住不放 3 秒:是稳稳停在一种颜色,还是疯狂换色?把现象如实告诉 AI——两种结果都是有用的观察。
任务 2:看一次"抖动"现形
做第六节的 A/B 对比。先预测:A 版本按住 3 秒会换几次色?再看实际现象,然后请 AI 解释"按下瞬间"和"按住期间"两种事件的区别。
作品 1:猜颜色(彩虹定格机)
让灯像转盘一样不停变色,你按一下 BOOT 定住它——像玩"转盘抽奖":
请做一个"猜颜色"小游戏:
RGB 灯每 200 毫秒在红、绿、蓝、黄、紫之间循环,亮度较低。
按下 BOOT 时锁定当前颜色并停止闪烁;让屏幕显示当前锁定的颜色。
再次按下开始下一轮。每次按下只触发一次,必须消抖。
请先画出"输入—规则—输出"的流程,再编译烧录。
观察:屏幕显示的颜色和灯一致吗?连按两次会不会跳过一轮?
作品 2:开关灯(单键小夜灯)
这个最像家里的电灯:按一下开,再按一下关。程序需要记住"现在是开还是关"——这就是程序里的状态。
请做一个"开关灯":第一次按 BOOT 点亮低亮度白灯,第二次按下熄灭,之后交替进行。
让屏幕显示"灯已打开"或"灯已关闭"和按下次数。
请解释程序怎样记住灯的状态,按住按钮时不要重复切换。
猜一下:程序"记住开还是关",是存在哪里的?(提示:不是存在纸上,也不是存在云端——就是上一课说的主控的内存里。)
挑战:反应力挑战
让灯等待一段随机时间后变绿。看到绿灯后,尽快按下 BOOT——看谁反应快:
请做一个反应力挑战:
开始后等待一段随机时间,RGB 灯变绿;
从绿灯亮起开始计时,按下 BOOT 后停止计时;
把反应时间用毫秒显示在屏幕上,例如"用时 438 毫秒";
绿灯出现前按下,显示"抢跑",并等待下一轮。
使用消抖,只用屏幕显示结果;请保留开始、等待、成功、抢跑这几个状态。
"毫秒"是千分之一秒——屏幕上的是电脑测量出来的时间,不是人眼估的。连做五次,记录最短和平均用时,看看你的反应力范围。先想一个问题:为什么要在"绿灯前按下"算抢跑?这利用了今天学的哪个判断?
八、自检小测
先自己想,再点开对答案。
1. 为什么说 BOOT 是输入、RGB 灯是输出?
输入把外界消息送进板子(按钮把手指动作变成电平信号);输出把结果表现出来(灯把程序结果变成光)。中间 ESP32-S3 做"处理"。
2. LOW 和 HIGH 是什么?和 0、1 是什么关系?
LOW 和 HIGH 是电路里两种容易判断的电平状态。我们约定 LOW 记成 0、HIGH 记成 1,方便电脑处理。0/1 不是电压值本身,是给两类状态起的数字名字。
3. 为什么电脑要用二进制?
电脑内部是大量电子开关,开关开/关两种状态最可靠。用高低两类电平判断,比把电压分成很多档更不容易出错。
4. 为什么程序要记住"上一次"按钮状态?
为了区分"刚按下"和"一直按着"。只有上一次是松开、这次变按下,才算一次新按下;一直按着就不重复处理,否则按住一秒灯会疯狂换色。
5. 消抖是在解决什么问题?
按钮按下时金属片会轻微抖动,一瞬间电平跳来跳去。消抖是等状态稳定后再确认,保证一次手指动作只算一次。
6. 开关灯作品里,"现在是开还是关"记在哪里?
记在主控的内存里(一个会变化的变量)。程序按一下就把这个状态翻一次面,再决定输出什么。
九、还想玩点什么
一个按钮 + 一颗灯,可以玩出不少花样:
| 方向 | 可以描述给 AI 的效果 | 值得继续想 |
|---|---|---|
| 彩虹定格机 | 灯不停变色,按一下定住,屏幕显示颜色名 | 锁定的是哪一刻的哪种颜色? |
| 单键小夜灯 | 一下开、一下关,带屏幕状态显示 | 程序怎么"记住"开关状态? |
| 反应力大赛 | 随机变绿后计时,比谁按得快 | 随机时间真的"随机"吗?怎么验证? |
| 摩斯电码 | 按的时间长短不同,灯亮长短不同 | 多长算"长"?这个标准谁定? |
| 密码门铃 | 按固定节奏(快-快-慢)灯才亮 | 板子怎么知道节奏对不对? |
想做"屏幕上有按钮、能点能滑"的同学,把想法记下来——那是触摸屏的事,会在后面课程专门学。
下一课,我们把主角从一颗小灯换成一块大屏幕:让整块屏幕亮出一种颜色。到时候你会发现,同样叫"变红",屏幕和灯干的事可完全不一样。
本课的配套资源
本节配套的演示程序源码与可烧录固件,已整合到课程页面底部的「配套资源 · 在线烧录」区——插上你的 ESP32-S3 触摸屏板(Chrome / Edge 浏览器),点「在线烧录」即可直接写入,无需安装软件。
给 AI 的第一句话(每次新开对话都先说这句):
请使用课程的 esp32s3-touchboard-hardware-dev Skill,
我现在做第 2 课(BOOT 按钮与灯),需要你帮我____。
改动前先说清依据的项目文件路径,烧录前先运行 arduino-cli board list 确认端口。