AI 编程课
完整教案
自学课件
2 课 · 共 2/48

按一下 BOOT,灯就听懂了

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

自学读本:跟着读、照着做,卡住就问 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 不是说电路里完全没有电,而是主控把电平分成两类后用的数字名字。

按钮状态电路电平记号
按下(本板常见情况)LOW0
松开(本板常见情况)HIGH1

如果你看到一串 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 确认端口。

本节配套资源 · 在线烧录

查看全部固件 →

下列演示程序已编译为可烧录固件。把你的 ESP32-S3 触摸屏板 用 USB 接上电脑(需 Chrome / Edge 浏览器),点「在线烧录」即可直接写入,无需安装任何软件。

第 2 课 · BOOT 换色
可烧录

每按一次 BOOT 键换一种颜色:红→绿→蓝循环。理解「从松开变成按下」那一刻才算一次(边沿+消抖)。

02 BOOT 入门
第 2 课 · 消抖 A/B 对照
可烧录

A 版按住疯狂换色、B 版按住只换一次。对照两种写法,亲手确认边沿判断与消抖为什么必要。

02 消抖 对比
第 2 课 · 猜颜色(作品一)
可烧录

灯每 200ms 循环变色,按下锁定当前颜色,再按开始下一轮;屏幕显示锁定的颜色。

02 作品 状态
第 2 课 · 开关灯(作品二)
可烧录

第一次按亮低亮度白灯、第二次熄灭,交替。重点是记住「开/关」这个状态。

02 作品 状态
第 2 课 · 反应力挑战(作品三)
可烧录

随机等待后灯变绿,按下后屏幕显示用时毫秒;提前按显示「抢跑」。用 millis() 计时。

02 作品 计时