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

手指变成指令 ——触摸坐标、点击和滑动

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

自学读本:跟着读、照着做,卡住就问 AI

你好,我是吴老师。

第 2 课我们认识了一个输入设备:BOOT 按键。它能告诉板子一件事——按下了,还是没按下。就两种可能。

今天认识第二个输入设备:你的手指。

先问你一个问题:手指按在屏幕上,和按在按键上,告诉板子的信息一样多吗?

**不一样,而且差得很远。**按键只能说"是"或"否";手指能说出"在哪儿"。

读完之后,你应该能:说出手指比按键多给了多少信息;知道触摸芯片走哪条总线、靠什么区分设备;用坐标判断做出自己的"按钮";独立完成挡板球和电子画板两个作品。

用时:90 分钟以上(两个作品,可分两次做)。准备:板子、数据线、已接入板卡 Skill 的 WorkBuddy。


一、手指比按键多说了什么

按键与触摸的信息量

BOOT 按键触摸屏
能说什么按下 / 没按下按在哪个坐标
有多少种可能2 种240 × 320 = 76,800 种
换一种说法只能回答"是不是"能回答"在哪里"
能做的事换色、开关、开始/停止画、拖、选、点、滑……

注意这个数字 76,800——第 3 课我们数过屏幕上有 76,800 个像素点。现在你的手指,可以单独指出其中任何一个

所以按键给你的是"1 个开关",手指给你的是"七万六千八百个开关"。

打个比方:按键像门铃,只有"响"和"不响";触摸屏像地图,你指哪儿它就知道哪儿。

这个比喻有个地方要修正:手指其实是被"测量"出来的,不是被"看见"的——屏幕底下有一层感应层在测电容变化。

二、手指的位置是怎么被知道的

屏幕下面藏着一块触摸芯片,叫 FT6336,专门测量手指位置,再把结果告诉主控。

它们说话走的是 I2C(读作 I 平方 C):

I2C 总线

线的名字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=和我想的一样吗
左上角________
右上角________
正中间________
左下角________

重点看两件事:

  1. 按左上角时,坐标是不是接近 (0, 0)?如果按左边却显示很大的 x,说明触摸坐标和屏幕坐标方向不一致——不是你错了,是两个芯片"看法"不同,需要转换。
  2. **点的位置对得上手指吗?**差了一截就要校准。

这就是真实工程:**两个零件各自都对,凑一起却要对齐一下。**而且板子不会报错,它只是静静地给出坐标对不对。

四、作品一:挡板球

屏幕底部有块挡板,手指左右移动,挡板跟着走,别让小球掉下去。

请做一个"挡板球"游戏:
1. 屏幕底部有一块挡板,宽 60、高 8;
2. 我的手指在屏幕上左右移动时,挡板跟着我的手指【横坐标】移动,
   手指移到哪儿挡板就跟到哪儿(只跟横向,不跟纵向);
3. 一个小球从屏幕上方往下落,撞到左右和上方边界会反弹;
4. 小球碰到挡板就弹回去,每接住一次加 1 分;
5. 小球掉到屏幕底部以下就结束,屏幕显示"坚持了__秒,接住__次";
6. 按 BOOT 重新开始。
请用中文注释,保留旧程序,烧录前核对端口,亮度不超过 80。

玩起来后回答三个问题:

  1. **挡板跟手吗?**快速划过去,是立刻跟上还是慢半拍?
  2. 如果慢半拍,问题出在"读手指读得不够勤"还是"画得不够快"?(想想第 7 课的帧预算。)
  3. 挡板宽度从 60 改成 20,难度变了多少?——难度是可以量化调整的,这是游戏设计里很重要的事。

这里藏着一个关键概念

挡板跟着手指走,本质上是什么?写成中文步骤:

每一帧:
    问一次触摸芯片:现在手指在哪儿?
    如果按下了:
        把挡板的横坐标改成手指的横坐标
    如果没按下:
        挡板留在原地

    盖掉旧的挡板
    画出新的挡板

    算出小球的新位置
    如果碰到挡板:让小球往上弹,加 1 分
    如果掉出屏幕底部:游戏结束

找一找:**"问一次触摸芯片"多久做一次合适?**这直接决定手感,第七节再算这笔账。

五、作品二:电子画板

请做一个电子画板:
1. 黑色背景,手指在屏幕上划过时留下线条(用画小圆点或画短线实现);
2. 屏幕顶部留出 4 个小方块,分别是红、绿、蓝、黄,
   点一下就切换画笔颜色(手指按在那个区域里就算选中);
3. 再留一个"清屏"方块,点一下清空画布;
4. 顶部最右边显示当前画笔颜色。
颜色亮度都不超过 80。请参考项目里已验证的触摸画板示例,用中文注释。

做完观察一件事:慢慢划和快速划,画出来的线一样吗?

大概率不一样——快速划会画成一串断开的点

为什么?因为板子不是一直看着你的手指,它是每隔一小会儿才问一次。你划太快,两次询问之间手指跑出去一大截,中间那段它没看见。

打个比方:像在雪地上踩脚印——走得慢脚印连成线,跑起来脚印就一格一格分开。

修正:雪地是连续的,而屏幕是被"问"出来的——中间没被问到的时刻是彻底没记录,不是记录得模糊。

两个解法,都试试:

  1. 问得更勤(提高读取频率)
  2. 把两次的点连成线(用第 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 确认端口。

本节配套资源 · 在线烧录

查看全部固件 →

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

第 8 课 · 读坐标
可烧录

手指按哪儿画哪儿;顶部实时显示坐标,串口同步打印。理解触摸坐标如何变成屏幕坐标。

08 触摸 demo
第 8 课 · 自制按钮
可烧录

屏幕下方点红/绿/蓝方块,大区域就变对应颜色——按钮不是硬件,是自己画出来的区域。

08 触摸 demo