自学读本:跟着读、照着做,卡住就问 AI
你好,我是吴老师。
第 2 课我们认识了一个输入设备:BOOT 按键。它能告诉板子一件事——按下了,还是没按下。就两种可能。
今天认识第二个输入设备:你的手指。
先问你一个问题:手指按在屏幕上,和按在按键上,告诉板子的信息一样多吗?
**不一样,而且差得很远。**按键只能说"是"或"否";手指能说出"在哪儿"。
读完之后,你应该能:说出手指比按键多给了多少信息;知道触摸芯片走哪条总线、靠什么区分设备;用坐标判断做出自己的"按钮";独立完成挡板球和电子画板两个作品。
用时:90 分钟以上(两个作品,可分两次做)。准备:板子、数据线、已接入板卡 Skill 的 WorkBuddy。
一、手指比按键多说了什么
| BOOT 按键 | 触摸屏 | |
|---|---|---|
| 能说什么 | 按下 / 没按下 | 按在哪个坐标 |
| 有多少种可能 | 2 种 | 240 × 320 = 76,800 种 |
| 换一种说法 | 只能回答"是不是" | 能回答"在哪里" |
| 能做的事 | 换色、开关、开始/停止 | 画、拖、选、点、滑…… |
注意这个数字 76,800——第 3 课我们数过屏幕上有 76,800 个像素点。现在你的手指,可以单独指出其中任何一个。
所以按键给你的是"1 个开关",手指给你的是"七万六千八百个开关"。
打个比方:按键像门铃,只有"响"和"不响";触摸屏像地图,你指哪儿它就知道哪儿。
这个比喻有个地方要修正:手指其实是被"测量"出来的,不是被"看见"的——屏幕底下有一层感应层在测电容变化。
二、手指的位置是怎么被知道的
屏幕下面藏着一块触摸芯片,叫 FT6336,专门测量手指位置,再把结果告诉主控。
它们说话走的是 I2C(读作 I 平方 C):
| 线的名字 | GPIO | 干什么 |
|---|---|---|
| SDA 数据 | 16 | 真正传数据的线 |
| SCL 时钟 | 15 | 打节拍,每响一下传一位 |
只有两根线,却要同时管好几个设备(触摸芯片、音频芯片都挂上面)。它们怎么不打架?靠地址。
打个比方:I2C 像一条走廊,两边好几间办公室。主控想找谁,就先喊一声房间号(地址),只有那间应答,其他装作没听见。
修正:走廊上同时只能有一个人说话,不像办公室里大家能同时聊。所以 I2C 是轮流说。
先去查一查:
我是小学生,正在学习这块 ESP32-S3 触摸屏板。
请先读取 esp32s3-touchboard-hardware-dev Skill,确认:
1. 触摸芯片的型号,以及它在 I2C 上的地址;
2. I2C 用的是哪两个 GPIO;
3. 项目里已经验证过的触摸示例在哪个文件;
4. 触摸坐标的范围是多少,和屏幕的 240×320 一致吗。
只检查和解释,不改代码、不烧录。
三、先读出坐标来看看
别急着做游戏,第一步永远是先看见数据。
请新建一个触摸实验:
1. 初始化屏幕和触摸芯片(I2C,SDA=16、SCL=15);
2. 手指按在屏幕上时,在那个位置画一个小圆点;
3. 同时通过串口打印"x=__, y=__, 是否按下";
4. 屏幕顶部固定显示最近一次的坐标。
请用中文注释,参考项目里已经验证过的触摸示例,烧录前核对端口。
请边做边记:
| 我的手指按在 | 屏幕显示 x= | 屏幕显示 y= | 和我想的一样吗 |
|---|---|---|---|
| 左上角 | ____ | ____ | |
| 右上角 | ____ | ____ | |
| 正中间 | ____ | ____ | |
| 左下角 | ____ | ____ |
重点看两件事:
- 按左上角时,坐标是不是接近 (0, 0)?如果按左边却显示很大的 x,说明触摸坐标和屏幕坐标方向不一致——不是你错了,是两个芯片"看法"不同,需要转换。
- **点的位置对得上手指吗?**差了一截就要校准。
这就是真实工程:**两个零件各自都对,凑一起却要对齐一下。**而且板子不会报错,它只是静静地给出坐标对不对。
四、作品一:挡板球
屏幕底部有块挡板,手指左右移动,挡板跟着走,别让小球掉下去。
请做一个"挡板球"游戏:
1. 屏幕底部有一块挡板,宽 60、高 8;
2. 我的手指在屏幕上左右移动时,挡板跟着我的手指【横坐标】移动,
手指移到哪儿挡板就跟到哪儿(只跟横向,不跟纵向);
3. 一个小球从屏幕上方往下落,撞到左右和上方边界会反弹;
4. 小球碰到挡板就弹回去,每接住一次加 1 分;
5. 小球掉到屏幕底部以下就结束,屏幕显示"坚持了__秒,接住__次";
6. 按 BOOT 重新开始。
请用中文注释,保留旧程序,烧录前核对端口,亮度不超过 80。
玩起来后回答三个问题:
- **挡板跟手吗?**快速划过去,是立刻跟上还是慢半拍?
- 如果慢半拍,问题出在"读手指读得不够勤"还是"画得不够快"?(想想第 7 课的帧预算。)
- 挡板宽度从 60 改成 20,难度变了多少?——难度是可以量化调整的,这是游戏设计里很重要的事。
这里藏着一个关键概念
挡板跟着手指走,本质上是什么?写成中文步骤:
每一帧:
问一次触摸芯片:现在手指在哪儿?
如果按下了:
把挡板的横坐标改成手指的横坐标
如果没按下:
挡板留在原地
盖掉旧的挡板
画出新的挡板
算出小球的新位置
如果碰到挡板:让小球往上弹,加 1 分
如果掉出屏幕底部:游戏结束
找一找:**"问一次触摸芯片"多久做一次合适?**这直接决定手感,第七节再算这笔账。
五、作品二:电子画板
请做一个电子画板:
1. 黑色背景,手指在屏幕上划过时留下线条(用画小圆点或画短线实现);
2. 屏幕顶部留出 4 个小方块,分别是红、绿、蓝、黄,
点一下就切换画笔颜色(手指按在那个区域里就算选中);
3. 再留一个"清屏"方块,点一下清空画布;
4. 顶部最右边显示当前画笔颜色。
颜色亮度都不超过 80。请参考项目里已验证的触摸画板示例,用中文注释。
做完观察一件事:慢慢划和快速划,画出来的线一样吗?
大概率不一样——快速划会画成一串断开的点。
为什么?因为板子不是一直看着你的手指,它是每隔一小会儿才问一次。你划太快,两次询问之间手指跑出去一大截,中间那段它没看见。
打个比方:像在雪地上踩脚印——走得慢脚印连成线,跑起来脚印就一格一格分开。
修正:雪地是连续的,而屏幕是被"问"出来的——中间没被问到的时刻是彻底没记录,不是记录得模糊。
两个解法,都试试:
- 问得更勤(提高读取频率)
- 把两次的点连成线(用第 5 课的
drawLine把上一个点和这一个点连起来)
第二个更聪明——不需要板子变快,只需要记住上一个点在哪儿。
请改进画板:
记住上一次手指的位置,用画线的方式把上一次和这一次连起来,
这样快速划过也能画出连续的线,不再是一串断点。
如果手指刚刚按下(还没有"上一次"),就只画一个点。
请用中文注释,保留旧版本。
六、按钮,是自己做出来的
做画板时你做了"点一下颜色方块就换色"。停下来想一想:
屏幕上有"按钮"这个东西吗?
没有。屏幕上只有像素点。按钮是我们自己判断出来的:
如果 手指的 x 在 130 到 170 之间
并且 手指的 y 在 75 到 115 之间:
那么 画笔换成绿色
就这几行判断,一个按钮诞生了。
所以手机上每一个按钮、每一个图标,背后都是这样的判断:坐标落在这块区域里吗?
这也解释了为什么有的按钮"点不准"——多半是区域划得不对,不是屏幕坏了。
做按钮还要考虑误触:区域之间留点空隙;按下之后"锁定"一下,别让手指轻微移动就乱跳(和第 2 课的消抖思路一样)。
七、手感:多久问一次手指才够
| 多久问一次 | 一秒问几次 | 手感 |
|---|---|---|
| 每 100 毫秒 | 10 次 | 明显迟钝,挡板跟不上手 |
| 每 33 毫秒 | 30 次 | 基本跟手 |
| 每 20 毫秒 | 50 次 | 比较顺滑 |
| 每 5 毫秒 | 200 次 | 不一定更好,还可能挤占别的时间 |
注意最后一行:**不是越快越好。**问得太勤,读触摸本身也花时间,反而可能把画动画的时间挤掉——画面变卡,手感更差。
这就是工程师天天在做的取舍。自己测测:
请给挡板球加一个对比:
用 BOOT 切换"多久问一次手指"(100 毫秒 / 33 毫秒 / 10 毫秒三档),
每档都在屏幕上显示当前档位和实际的每秒帧数。
我来比较哪一档手感最好。请用中文注释,保留旧版本。
先预测再烧录:哪一档最好?为什么"最快"那档不一定赢?
八、还能做出什么(挑一个自己改)
入门:改一改就能成
| 方向 | 你要定什么规则 | 值得继续想 |
|---|---|---|
| 触摸调色板 | 排一排颜色格,点哪个用哪个 | 格子要多大才不容易点错? |
| 点击计数器 | 每点一下数字加 1,显示在中间 | 按住不放,算一次还是很多次? |
| 触摸开关灯 | 点一下屏幕,RGB 灯开;再点一下关 | 和第 2 课按键开关灯,做法哪里不同? |
| 分区变色屏 | 屏幕分四块,点哪块哪块变色 | 分块边界该怎么判断? |
| 画板加橡皮 | 多个"橡皮"方块,选它以后划过就擦掉 | 橡皮其实就是用背景色画线,对吗? |
进阶:要自己设计规则
| 方向 | 你要定什么规则 | 值得继续想 |
|---|---|---|
| 滑动切屏 | 手指向左划,画面切下一页 | 划多少距离才算"一次滑动"? |
| 触摸进度条 | 按住拖动滑块,用它调屏幕背光 | 滑块跑到最左/最右怎么办? |
| 虚拟方向键 | 屏幕下方画左右箭头,按住就往那边走 | 它和"手指直接拖挡板",手感有什么不同? |
| 连线小游戏 | 几个点按顺序点过去连成图案 | 点错了该重来还是提示? |
| 打地鼠 | 随机位置冒方块,点中得分 | 方块出现多久消失,才既好玩又不慌? |
| 触摸迷宫 | 手指画墙,让小球在墙之间弹 | 画出来的墙怎么存下来? |
跨界:接上前面学过的
| 方向 | 接哪一课 | 值得继续想 |
|---|---|---|
| 触摸弹球(多点玩法) | 第 6、7 课 | 能两只手指各控制一块挡板吗? |
| 会说话的画板 | 第 4 课(串口) | 能把画的东西发到电脑上存起来吗? |
| 触摸相册 | 第 10 课(SD 卡) | 滑动翻页看照片,翻页要多久? |
| 呼吸灯调色盘 | 第 1 课(RGB 灯) | 手指选颜色,让板载那颗灯也跟着变 |
| 触摸节拍器 | 第 6 课(动画) | 点一下出一个跳动的圆,像打鼓 |
当你把几课的东西拼在一起,作品才真正变成"你的"。
九、自检小测
1. 按键和触摸屏,告诉板子的信息差多少?
按键 2 种(按下/没按下),触摸屏 240×320 = 76,800 种(能指出具体坐标)。
2. 触摸芯片叫什么?走什么总线、用哪两个 GPIO?
FT6336,走 I2C,SDA=GPIO16、SCL=GPIO15。
3. I2C 上挂了好几个设备,靠什么区分?
靠地址。主控先喊地址,只有对应设备应答。注意同一时间只能有一个在说(轮流说)。
4. 屏幕上有"按钮"这个东西吗?
没有,只有像素点。按钮是判断出来的:手指坐标是否落在某块区域内。
5. 快速划过画板会画成断点,为什么?怎么解决?
板子每隔一小会儿才问一次手指,两次之间手指跑掉的部分没被记录。解法:①问得更勤 ②记住上一个点,用 drawLine 连起来(更聪明)。
6. 多久问一次手指最好?越快越好吗?
不是。问太勤会挤占画动画的时间,画面变卡手感反而更差。一般 20–33 毫秒比较合适,要实测。
7. 触摸坐标和屏幕坐标一定一致吗?
不一定。方向和范围可能有差异,需要实测核对、必要时转换或校准——板子不会报错提醒你。
十、最后留给你
手指这一点,把"我能告诉板子什么"从 2 种可能变成了 76,800 种。
再想想:既然手指能说出位置,它还能说出什么别的?
- **用了多大力气?**我们的板测不出来(有些设备能,叫压力感应)
- 能同时按几根手指?我们的触摸芯片最多认两根——那能不能做成两个人对战?
- 划过的速度能算出来吗?用第 2 课的
millis()和第 5 课的坐标,你其实已经具备全部工具了
这些答案,都要你动手去试。
现在选一个最想做的,先自己补完:
我想用触摸做____,用来____。
手指____的时候,程序就____。
判断的规则是:如果手指在____范围内,就____。
有没说清楚的地方请先问我,再另存程序并烧录,保留旧作品。
我会这样检查它做对了:____。
我希望你带来的不只是"我的画板能画了",而是这段介绍:"手指告诉板子的不是'是'或'否',而是七万六千八百个坐标里的某一个。我发现快速划过会画成断点,因为板子每隔一小会儿才问一次手指;把两个点连成线就解决了。我还发现按钮其实是我们自己用坐标判断出来的。"
本课的配套资源
本节配套的演示程序源码与可烧录固件,已整合到课程页面底部的「配套资源 · 在线烧录」区——插上你的 ESP32-S3 触摸屏板(Chrome / Edge 浏览器),点「在线烧录」即可直接写入,无需安装软件。
给 AI 的第一句话(每次新开对话先说这句):
请使用课程的 esp32s3-touchboard-hardware-dev Skill,
我现在做第 8 课(触摸输入),需要你帮我____。
改动前先说清依据的项目文件路径,烧录前先运行 arduino-cli board list 确认端口。