你好,我是吴老师。
第 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);
3. 同时通过串口打印"x=__, y=__, 是否按下";
4. 屏幕顶部留一条信息栏,高度 ___ 像素(参考 34),固定显示最近一次的坐标,
并且这一条不要被手指画上点。
请用中文注释,参考项目里已经验证过的触摸示例,烧录前核对端口。
想好了再点开:我们的参考数字
**这不是标准答案。**参考值:圆点半径 3,信息栏高度 34。
半径决定你能不能看清"点在哪":3 正好标出位置又不遮周围;1 远看像个脏点;10 糊掉一片。
信息栏高度要能放下一行中文(16 像素高)加四周留白。
这里有个坑:画点前要先判断
y > 信息栏高度,否则手指在顶部也会画上点、把坐标糊掉。 这就是提示词特意说"这一条不要被画上点"的原因。
请边做边记:
| 我的手指按在 | 屏幕显示 x= | 屏幕显示 y= | 和我想的一样吗 |
|---|---|---|---|
| 左上角 | |||
| 右上角 | |||
| 正中间 | |||
| 左下角 |
重点看两件事:
- 按左上角时,坐标是不是接近 (0, 0)? 如果按左边却显示很大的 x,说明触摸坐标和屏幕坐标方向不一致——不是你错了,是两个芯片"看法"不同,需要转换。
- 点的位置对得上手指吗? 差了一截就要校准。
这就是真实工程:两个零件各自都对,凑一起却要对齐一下。 而且板子不会报错,它只是静静地给出坐标对不对。
四、作品一:挡板球
屏幕底部有块挡板,手指左右移动,挡板跟着走,别让小球掉下去。
请做一个"挡板球"游戏:
1. 屏幕底部有一块挡板,宽 ___、高 ___(你自己定,参考 60 和 8);
2. 我的手指在屏幕上左右移动时,挡板跟着我的手指【横坐标】移动,
手指移到哪儿挡板就跟到哪儿(只跟横向,不跟纵向);
3. 一个小球从屏幕上方往下落,撞到左右和上方边界会反弹;
4. 小球碰到挡板就弹回去,每接住一次加 1 分;
5. 小球掉到屏幕底部以下就结束,屏幕显示"坚持了__秒,接住__次";
6. 小球一开始下落的速度你自己定 ___(参考 每帧 3 像素);
7. 按 BOOT 重新开始。
请用中文注释,保留旧程序,烧录前核对端口,亮度不超过 80。
想好了再点开:我们的参考数字
**这不是标准答案。**参考值:挡板 60 宽 × 8 高,小球速度 每帧 3 像素。
这三个数字全都在调"难度",而且互相牵制:
| 你改的是 | 改小 | 改大 |
|---|---|---|
| 挡板宽 | 更难接(手要更准) | 更容易接 |
| 挡板高 | 球容易从边上溜过去 | 更容易碰到 |
| 小球速度 | 更悠闲 | 更紧张,容易掉 |
先想清楚你要做成什么样的游戏:放松玩,还是有点挑战?
提示词让你"保留旧程序"就是为了这个——先跑一版,再只改一个数字,体会难度怎么变。
玩起来后回答三个问题:
- 挡板跟手吗? 快速划过去,是立刻跟上还是慢半拍?
- 如果慢半拍,问题出在"读手指读得不够勤"还是"画得不够快"?(想想第 7 课的帧预算。)
- 挡板宽度从 60 改成 20,难度变了多少?——难度是可以量化调整的,这是游戏设计里很重要的事。
这里藏着一个关键概念
挡板跟着手指走,本质上是什么?写成中文步骤:
每一帧:
问一次触摸芯片:现在手指在哪儿?
如果按下了:
把挡板的横坐标改成手指的横坐标
如果没按下:
挡板留在原地
盖掉旧的挡板
画出新的挡板
算出小球的新位置
如果碰到挡板:让小球往上弹,加 1 分
如果掉出屏幕底部:游戏结束
找一找:"问一次触摸芯片"多久做一次合适? 这直接决定手感,第七节再算这笔账。
五、作品二:电子画板
请做一个电子画板:
1. 黑色背景,手指在屏幕上划过时留下线条(用画小圆点或画短线实现);
2. 屏幕顶部留出 4 个小方块,分别是红、绿、蓝、黄,每个宽 ___、高 ___(参考 40 和 30),
点一下就切换画笔颜色(手指按在那个区域里就算选中);
3. 再留一个"清屏"方块,位置你自己定 ___(想想放哪最不容易点错),点一下清空画布;
4. 顶部最右边显示当前画笔颜色;
5. 颜色亮度都不超过 ___(参考 80)。
请参考项目里已验证的触摸画板示例,用中文注释,烧录前核对端口。
想好了再点开:我们的参考数字
这不是标准答案。参考值:色块 40×30,清屏方块放最右边,亮度 80。
色块大小要按"手指"来定,不是按"好看"来定:
- 手指尖接触面积约 8~10 像素宽,但手指看得见的范围更大;
- 40×30 点下去不会同时压到两个;
- 太小(20×15)→ 点红色结果选中绿色,这就是"按钮点不准"。
清屏放最右边是为了离颜色块远一点——不然你正画得高兴,一点错就全没了。
还能再算一步:4 个色块占 160 像素,屏幕 240。 剩下的 80 够不够放清屏方块和"当前颜色"?这就是布局要算的账。
做完观察一件事:慢慢划和快速划,画出来的线一样吗?
大概率不一样——快速划会画成一串断开的点。
为什么?因为板子不是一直看着你的手指,它是每隔一小会儿才问一次。你划太快,两次询问之间手指跑出去一大截,中间那段它没看见。
打个比方:像在雪地上踩脚印——走得慢脚印连成线,跑起来脚印就一格一格分开。
修正:雪地是连续的,而屏幕是被"问"出来的——中间没被问到的时刻是彻底没记录,不是记录得模糊。
两个解法,都试试:
- 问得更勤(提高读取频率)
- 把两次的点连成线(用第 5 课的
drawLine把上一个点和这一个点连起来)
第二个更聪明——不需要板子变快,只需要记住上一个点在哪儿。
请改进画板:
记住上一次手指的位置,用画线的方式把上一次和这一次连起来,
这样快速划过也能画出连续的线,不再是一串断点。
如果手指刚刚按下(还没有"上一次"),就只画一个点。
线宽你自己定 ___(参考 2)。请用中文注释,保留旧版本,烧录前核对端口。
想好了再点开:我们的参考数字
**这不是标准答案。**参考值:线宽 2。
不过这一节真正的难点不是线宽,是那个"上一次"。请先想清楚:
"上一次手指的位置"是什么时候被更新的?
- 只在"手指按下"时更新 —— 对的;
- 如果没按下时也更新,那抬手期间的位置会被记进去, 下次落笔时会从很远的地方连一条线过来。
正确做法:只在按下时更新,并且在刚按下那一帧判断"还没有上一次",只画点、不画线。
六、按钮,是自己做出来的
做画板时你做了"点一下颜色方块就换色"。停下来想一想:
屏幕上有"按钮"这个东西吗?
没有。屏幕上只有像素点。按钮是我们自己判断出来的:
如果 手指的 x 在 130 到 170 之间
并且 手指的 y 在 75 到 115 之间:
那么 画笔换成绿色
就这几行判断,一个按钮诞生了。
所以手机上每一个按钮、每一个图标,背后都是这样的判断:坐标落在这块区域里吗?
这也解释了为什么有的按钮"点不准"——多半是区域划得不对,不是屏幕坏了。
做按钮还要考虑误触:区域之间留点空隙;按下之后"锁定"一下,别让手指轻微移动就乱跳(和第 2 课的消抖思路一样)。
把鼠标移到色块上,看右边怎么把"判断过程"一行行读出来:
再拖一下最下面的"空隙"滑杆 —— 把它拖到 0,看三个按钮贴在一起时,是不是很容易点错。
七、触摸能听懂哪些"动作"
上一节你做出了一个按钮:坐标落在这块区域里,就算点中了。
那是"点一下"。可手指在屏幕上还能做很多别的事——按两下、按住不放、拖着走、往左划……板子能听懂哪些?
先记住一句话,它是这一节的总纲:
触摸芯片只会报告两件事:手指现在在哪、手指现在按着没有。 别的所有"动作",都是程序算出来的。
这跟上一节的按钮是同一个道理:屏幕上没有按钮,也没有"双击"这个东西——都是你写的判断。
把"动作"翻译成数字
既然芯片只给位置和时间,那每个动作都得翻译成可判断的数字。下面是我们课上用的规则(不是唯一答案,你可以改):
| 动作 | 怎么判断 | 为什么这么定 |
|---|---|---|
| 单击 | 按下的时间 < 300 毫秒,位移 < 20 像素 | 点一下就抬手:时间短、位置几乎没动 |
| 双击 | 两次单击之间 < 350 毫秒 | 第二下来得够快 |
| 长按 | 按住不放超过 800 毫秒 | 时间够长,还没抬手 |
| 拖拽 | 按住时位移 > 20 像素 | 手指真的移动了 |
| 左滑 / 右滑 | 抬手时,横向位移 > 60 像素且横向位移 > 纵向位移 | 横向走得比纵向远,才算"横着划" |
| 上滑 / 下滑 | 抬手时,纵向位移 > 60 像素且纵向位移 > 横向位移 | 同上的道理 |
看出规律了吗?每个动作都是"时间"和"位移"两个量的组合。
- 时间短 + 位移小 = 单击
- 时间长 + 位移小 = 长按
- 时间任意 + 位移大 = 拖拽(或滑动)
第 2 课学按键时,你已经见过这套思路了:单击、双击、长按,靠的是"等待窗口"。 现在手指换成按钮,道理一模一样。
六个数字,三个注意
上面那张表里有 6 个数字(300、20、350、800、20、60)。它们没有标准答案,但每一个都有取舍:
| 数字 | 改小了会怎样 | 改大了会怎样 |
|---|---|---|
| 单击的时间上限(300) | 点得慢一点就不算单击了 | 手放着不动也算点击 |
| 双击的间隔(350) | 双击很难触发,容易变成两次单击 | 两次无关的单击会被认成双击 |
| 长按的时间(800) | 还没按住就触发长按 | 要按很久才有反应 |
| 拖拽的位移(20) | 手指轻微抖动就被当成拖拽 | 真要拖动时没反应 |
| 滑动的距离(60) | 轻轻一蹭就算滑动 | 划很远才算 |
最关键的一条:如果不设时间上限,"长按"和"单击"就分不开了——你按 3 秒抬起,程序会先报"长按",松开时又报一次"单击",一件事被报告了两遍。
所以做事件判断时,永远要问自己:这次抬手,是"单击的抬手"还是"长按的抬手"? 得用一个变量记着。
亲眼看一遍
下面这个演示把"点击/滑动"的判断过程摊开给你看。按住拖动,它会实时显示位移、时间和判定结果:
试着做这几件事:
- 原地快速点一下 —— 看它判成"单击";
- 按住 1 秒以上再松手 —— 看它判成"长按"(而且不会再报单击);
- 按着往左拖很远 —— 看它判成"左滑";
- 按着慢慢画个小圈 —— 位移够大,判成"拖拽"。
第 2 条最重要:松手时程序得知道"我刚才报过长按了,就不要再报单击"。
右边那几根滑杆就是上面表格里的数字,故意调极端试试:
- 把"单击时间上限"拖到最小 —— 正常点一下都不算单击了(人手没这么快);
- 把"滑动距离"拖小 —— 手指轻轻一蹭就成了"左滑";
- 把"单击位移上限"拖到最小 —— 手指轻微抖动都会被当成拖动。
自己动手:让板子认出这些动作
请给触摸程序加一套"动作识别":
1. 单击(按下时间 < ___ 毫秒且位移 < ___ 像素)
2. 双击(两次单击间隔 < ___ 毫秒)
3. 长按(按住超过 ___ 毫秒,只报一次,松手时不要再报单击)
4. 拖拽(按住时位移超过 ___ 像素,实时报告手指位置)
5. 四方向滑动(抬手时判断:往左/往右/往上/往下)
每个动作发生时,在屏幕上用中文显示动作名称,并通过串口打印日志。
为了避免误判,请说明你是怎么保证"一次动作只报一次"的。
亮度不超过 80,请用中文注释,保留旧版本,烧录前核对端口。
想好了再点开:我们的参考数字
这不是标准答案。 参考值就是上面表格里那 6 个:
| 参数 | 参考值 | 提示 |
|---|---|---|
| 单击时间上限 | 300 毫秒 | 一般人点一下 100~200 毫秒,300 留了余量 |
| 单击位移上限 | 20 像素 | 比手指抖动大,比有意拖动小 |
| 双击间隔 | 350 毫秒 | 太短你双击不出来,太长会把两次单击认成双击 |
| 长按时间 | 800 毫秒 | 明显比"点一下"长,又不用等到不耐烦 |
| 拖拽位移 | 20 像素 | 和单击位移共用一条线:超过就是拖拽,没超过就是点击 |
| 滑动距离 | 60 像素 | 屏幕才 240 宽,60 是"确实划了一下"的量 |
几个值得故意改坏试试的:
- 把单击时间上限改成 50 毫秒 —— 你会发现正常点一下都不算单击了(因为人没那么快);
- 把双击间隔改成 2000 毫秒 —— 你随便点两下不相干的,都会被判成双击;
- 把滑动距离改成 10 像素 —— 手指轻轻一蹭就成了"左滑",页面乱翻。
这和第 2 课"把消抖改成 1 毫秒会怎样"是同一个玩法:故意改错,才知道这条线画在哪儿。
一个真会踩的坑:点击被误判成滑动
这是我们在真实调试里踩到过的:
早期版本只用一个条件判断——位移超过 12 像素就算滑动。 结果:上下滑动能翻页,但怎么点按钮都没反应。
为什么?因为电容屏单次轻点,采样抖动也能超过 12 像素。每一次点击都被当成了滑动。
修法:加一个正交的维度——时间。
是点击:按住 <= 600 毫秒 并且 最大位移 <= 40 像素
否则 :算滑动
真实拖拽必然有持续时间,所以"时间 + 位移"两个条件一起用,就分得开了。
这条经验很值钱:当你发现"用单一阈值区分两类事件总在某些场景失灵", 就该问自己——我是不是只用了单一维度? 再补一个正交的判据。
八、用什么去碰它
前面几节都在讲"手指做什么动作"。但有个问题一直没问过:
必须用手指吗?用笔行不行?戴着手套行不行?
要回答这个,得先知道屏幕底下到底在发生什么。
它认的不是"压力",是"电"
我们的屏幕是电容屏。它上面盖着一层看不见的透明导电膜—— 细得像头发丝的网格,铺满整个屏幕,上面一直通着很微弱的电。
你可以把它想成一张铺开的"电的网",每一小块都记着自己的电量。
手指是导体(人身上有水分和盐)。手指一碰到哪里, 就像在那张电网上"接了个小电容",把那一小块的电量吸走一点儿。
控制器不停地挨个测量:哪块的电量变了、变了多少 → 就算出手指在哪。
所以关键就一句话:
它认的是"能不能导电",不是"按得重不重"。
网上那些"用香蕉玩手机"是怎么回事
你可能见过这类搞笑视频:拿一根香蕉去划手机,居然能操作。
这不是特效。香蕉含水、含电解质,是导体——和手指一样能改变电容。
| 拿什么碰 | 能不能点亮 | 为什么 |
|---|---|---|
| 香蕉、苹果 | 能 | 含水 + 电解质,是导体 |
| 塑料尺、干木棍 | 不能 | 绝缘体,不导电 |
| 一杯水 | 能 | 水(尤其自来水)能导电 |
理解了这个,下面这张表就全都能自己推出来了。
什么能碰、什么不能碰
| 用什么碰 | 能不能 | 为什么 |
|---|---|---|
| 手指 | ✅ 最好用 | 导体,而且接触面积正合适 |
| 金属笔 | ✅ 能 | 金属是导体 |
| 塑料笔 | ❌ 不能 | 塑料不导电——它"接不上"那张电网 |
| 普通手套(毛线、棉) | ❌ 不能 | 不导电,把手指和屏幕隔开了 |
| 触摸手套 | ✅ 能 | 指尖织进了导电纤维(专门为电容屏做的) |
| 香蕉 / 苹果 | ✅ 能(好玩) | 导体 |
| 刚洗完还湿着的手 | ⚠️ 能,但容易乱跳 | 水导电,一滴水会被当成好几个触点 |
所以屏幕上那支"触控笔"为什么贵?因为它不能用普通塑料做—— 笔尖得是导电的(导电橡胶或金属),不然写了也没反应。
两个几乎人人都想错的地方
误解一:"手指太粗就点不准"
反了。接触面积越大,电容变化越明显,越好检测。
真正会出问题的是相反的情况:
- 接触面太小(指甲尖、很细的笔尖)→ 电容变化太小,可能检测不到或位置飘;
- 手指太粗 → 不是"认不出",而是一次会压到两个相邻的按钮 → 误触。
第二种情况你其实已经遇到过——第六节说"按钮之间要留空隙",防的就是这个。 它不是识别问题,是布局问题。
误解二:"金属笔不能用"
**能用。**金属是导体,和手指一个道理。
真正不能用的是塑料笔——这俩经常被记混。
一个快速判断法:这东西能导电吗? 能 → 屏幕认;不能 → 屏幕不理。 (家里找不到触控笔时,一根金属勺子柄其实可以应急。)
亲手试一遍:给身边的东西做一次"触摸体检"
光看上面的表没用——你得自己上手试,而且要留下记录。
测试仪就是你自己写的程序:把第三节那个画点程序(手指按哪儿就画哪儿)烧在板子上, 然后换各种东西去碰屏幕,看它认不认。这比任何演示都真实。
顺序不能反:先猜,再试,最后记录。 猜错了才有收获。
| # | 我找来的东西 | 我猜能 / 不能 | 实测认不认 | 它导电吗 | 猜对了吗 |
|---|---|---|---|---|---|
| 1 | 手指(对照组) | ||||
| 2 | 塑料笔 / 塑料尺 | ||||
| 3 | 金属笔 / 钥匙 / 勺柄 | ||||
| 4 | 普通手套(毛线、棉) | ||||
| 5 | 触摸手套(如果有) | ||||
| 6 | 香蕉 / 橘子 | ||||
| 7 | 铝箔(锡纸) | ||||
| 8 | 湿纸巾 | ||||
| 9 | |||||
| 10 |
第 1 行是"对照组",别跳过。 先用手指确认"程序和屏幕都是好的", 否则后面所有"不行"都可能是别的原因——这是做实验的基本规矩。
几条注意事项:
- 每试完一样,先擦一下屏幕——别让残留的水或果汁骗了你;
- 试"不认"的东西时,多按一会儿、稍微加点力,确认不是你没按到位;
- 第 7、8 行和第 9、10 行,上面的表里没有答案,得靠原理自己推。
填完表,回答三个问题:
- "能认出"的那些,共同点是什么?"认不出"的那些呢?用一句话说清楚。
- 哪一行你猜错了?为什么猜错?——猜错的那一行,才是这节课最值钱的。
- 第 9、10 行是你自己加的。光凭"它导不导电",能猜准吗?有没有反例?
想好了再点开:那几样表里没有的,怎么推
这不是标准答案,是你的推理练习对照——以你亲手测出来的为准。
| 东西 | 大概率 | 道理 |
|---|---|---|
| 铝箔(锡纸) | ✅ 能 | 金属,导体。摊平了碰效果最好(接触面积大) |
| 湿纸巾 | ⚠️ 能,但容易乱跳 | 含水,导电。但水分会摊开,一片水可能被当成好几个触点——和"刚洗完还湿着的手"是同一个现象 |
| 橘子 | ✅ 能 | 含水 + 电解质,和香蕉一个道理 |
| 干纸巾、木头、玻璃 | ❌ 不能 | 绝缘体 |
第 3 题的答案在这里:光靠"导不导电"基本能猜准方向, 但猜不准"好不好用"——湿纸巾导电却乱跳,铝箔导电但皱了就时灵时不灵。
"能不能"和"好不好用"是两件事。 这也是为什么金属笔能用、 但专业的电容触控笔还要在笔尖上做文章。
硬件定死的几件事
有些事不是"程序写得好不好"的问题,是硬件就那样:
| 想做的事 | 能不能 | 为什么 |
|---|---|---|
| 两根手指同时按 | ✅ 支持(已实测) | 驱动能读 2 个触点,在板上试过——两个手指能分别认出 |
| 三根手指以上 | ❌ 不能 | 芯片只有 TOUCH_1 / TOUCH_2 两个位置 |
| 捏合放大、双指旋转 | ✅ 能做(要自己算) | 两个触点各有一个坐标,两指的距离和角度都能算出来 |
| 用多大力气按 | ❌ 不能 | 没有压力感应(有些设备有,叫 3D Touch) |
| 手指悬空不碰屏幕 | ❌ 不能 | 我们的驱动只报告"按下 / 没按下"两态 |
| 手指移到屏幕外还继续滑 | ❌ 不能 | 出了屏幕就没信号了 |
关于"两根手指"多说一句:芯片和驱动支持最多 2 个触点,而且已经在板上实测过—— 两个手指同时按,板子能分别认出它们,各自报一个坐标。所以双人对战可以直接做。
那"捏合放大、双指旋转"为什么能做?道理很简单:你手上有了两个坐标。
- 捏合(缩放):算两个触点之间的距离。距离变大 = 放大,变小 = 缩小。
- 旋转:算两个触点连成的线,角度变了多少。
不过要提醒一句:这两样都得你自己算——芯片只负责"报出两个坐标", 至于这两个坐标连起来是什么意思,还是和"按钮"一样,是判断出来的。
请做一个"两根手指"的测试:
屏幕上同时显示两个触点,手指按下去就画点在对应位置,
并显示当前检测到几个触点、每个触点的坐标,
再顺便算出两个触点之间的距离,显示在屏幕上。
我要亲眼看看:两根手指分开、合拢时,那个距离数字是不是跟着变。
先看清数据,再做作品。"算得出距离"是捏合放大的地基。
屏幕碎了还能用吗
先说结论:看碎在哪一层。
我们这块屏是"三明治"结构,从上到下三层:
| 层 | 是什么 | 坏了会怎样 |
|---|---|---|
| ① 保护玻璃 | 你手指直接摸到的那层 | 只是裂了 → 触摸可能还正常,但扎手,别用 |
| ② 触摸层 | 就是上面说的"透明导电膜" | 被划断 → 那片区域永久失灵,修不了 |
| ③ 显示层 | LCD,负责发光出画面 | 坏了 → 花屏、黑块、漏液 |
所以有两种很不一样的结果:
- 只是外层玻璃碎:触摸还能用,画面也正常——但玻璃渣会划伤手,不能继续用;
- 伤到触摸层:会出现"某一块区域怎么点都没反应"——这种没法靠改程序补救。
给个实在的建议:这块屏经不起当"耐摔实验品"。 贴上保护膜、别用力戳、别压重物、收进包里时给它垫一下。 修屏幕的钱,够买好几块新的了。
回头看一眼这几节的关系
到这儿,你已经把"触摸"这件事从里到外看了一遍:
| 节 | 回答了什么问题 |
|---|---|
| 第二、三节 | 位置是怎么测出来的(I2C、坐标) |
| 第四、五节 | 用它做出两件作品(挡板球、画板) |
| 第六节 | "按钮"是判断出来的,不是屏幕本来就有的 |
| 第七节 | 各种动作都是"时间 + 位移"算出来的 |
| 第八节(本节) | 用什么东西能碰、哪些事硬件上做不到 |
一句话把这几节串起来:
屏幕只给你两样东西——一个坐标和一个"按着没"。 剩下的一切,都是你写出来的。
九、还能做出什么(挑一个自己改)
入门:改一改就能成
| 方向 | 你要定什么规则 | 值得继续想 |
|---|---|---|
| 触摸调色板 | 排一排颜色格,点哪个用哪个 | 格子要多大才不容易点错? |
| 点击计数器 | 每点一下数字加 1,显示在中间 | 按住不放,算一次还是很多次? |
| 触摸开关灯 | 点一下屏幕,RGB 灯开;再点一下关 | 和第 2 课按键开关灯,做法哪里不同? |
| 分区变色屏 | 屏幕分四块,点哪块哪块变色 | 分块边界该怎么判断? |
| 画板加橡皮 | 多个"橡皮"方块,选它以后划过就擦掉 | 橡皮其实就是用背景色画线,对吗? |
进阶:要自己设计规则
| 方向 | 你要定什么规则 | 值得继续想 |
|---|---|---|
| 滑动切屏 | 手指向左划,画面切下一页 | 划多少距离才算"一次滑动"? |
| 触摸进度条 | 按住拖动滑块,用它调屏幕背光 | 滑块跑到最左/最右怎么办? |
| 虚拟方向键 | 屏幕下方画左右箭头,按住就往那边走 | 它和"手指直接拖挡板",手感有什么不同? |
| 连线小游戏 | 几个点按顺序点过去连成图案 | 点错了该重来还是提示? |
| 打地鼠 | 随机位置冒方块,点中得分 | 方块出现多久消失,才既好玩又不慌? |
| 触摸迷宫 | 手指画墙,让小球在墙之间弹 | 画出来的墙怎么存下来? |
跨界:接上前面学过的
| 方向 | 接哪一课 | 值得继续想 |
|---|---|---|
| 触摸弹球(多点玩法) | 第 6、7 课 | 能两只手指各控制一块挡板吗? |
| 会说话的画板 | 第 4 课(串口) | 能把画的东西发到电脑上存起来吗? |
| 触摸相册 | 第 10 课(TF 卡) | 滑动翻页看照片,翻页要多久? |
| 呼吸灯调色盘 | 第 1 课(RGB 灯) | 手指选颜色,让板载那颗灯也跟着变 |
| 触摸节拍器 | 第 6 课(动画) | 点一下出一个跳动的圆,像打鼓 |
当你把几课的东西拼在一起,作品才真正变成"你的"。
十、自检小测
1. 按键和触摸屏,告诉板子的信息差多少?
按键 2 种(按下/没按下),触摸屏 240×320 = 76,800 种(能指出具体坐标)。
2. 触摸芯片叫什么?走什么总线、用哪两个 GPIO?
FT6336,走 I2C,SDA=GPIO16、SCL=GPIO15。
3. I2C 上挂了好几个设备,靠什么区分?
靠地址。主控先喊地址,只有对应设备应答。注意同一时间只能有一个在说(轮流说)。
4. 屏幕上有"按钮"这个东西吗?
没有,只有像素点。按钮是判断出来的:手指坐标是否落在某块区域内。
5. 触摸芯片能"看见"哪些动作?
芯片只会报告两件事:手指在哪、按着没有。 别的一个都不会。
单击、双击、长按、拖拽、四方向滑动——全都是程序用"时间 + 位移"算出来的,跟"按钮是判断出来的"是同一个道理。
6. 单击和长按都是"按下再抬起",凭什么分得开?
看时间:按下到抬起不超过阈值(参考 300 毫秒)算单击,超过(参考 800 毫秒)算长按。
还要注意一件事:报过长按之后,松手时不能再报一次单击——否则一个动作被报告两遍。程序要拿个变量记着。
7. 为什么"点击被误判成滑动"是个经典坑?怎么修?
因为电容屏轻点时采样抖动也能超过位移阈值(我们踩过:12 像素就误判了)。
修法是加一个正交维度——时间。改成"按住时间短 且 位移小 = 点击,否则 = 滑动"。真实拖拽必然有持续时间,两个条件一起用就分得开了。
8. 我们这块板能同时认几根手指?做不了什么?
最多 2 根(驱动里写死 touches < 3,芯片只有 TOUCH_1/TOUCH_2 两个位置),已实测可用。
所以:双人对战可以做,捏合放大、双指旋转也能做(两个坐标都在手上,距离和角度自己算)。 只有三指以上的手势做不了。另外也测不出按压力度(没有压力感应)、不支持悬停。
9. 快速划过画板会画成断点,为什么?怎么解决?
板子每隔一小会儿才问一次手指,两次之间手指跑掉的部分没被记录。解法:①问得更勤 ②记住上一个点,用 drawLine 连起来(更聪明)。
10. 电容屏认的是什么?为什么塑料笔不能用?
认的是**"能不能导电"**,不是"按得重不重"。
屏幕盖着一层透明导电膜,一直通着微弱的电。导体(手指、金属笔、香蕉——含水含电解质)一碰, 就会把那一小块的电量吸走一点,控制器测出变化就知道位置了。 塑料笔是绝缘体,接不上这张电网,所以写了也没反应。
11. "手指太粗就点不准",这句话对吗?
**反了。**接触面积越大,电容变化越明显,越好检测。
真正会出问题的是接触面太小(指甲尖、很细的笔尖)——电容变化太小,可能检测不到或位置飘。
而"手指太粗"导致的麻烦是另一种:一次压到两个相邻按钮 → 误触。 那是布局问题(按钮要留空隙),不是识别问题。
12. 我们这块板能同时认几根手指?能直接拿来做双人对战吗?
能认 2 个(驱动里有 TOUCH_1 / TOUCH_2 两个位置,代码判断 touches < 3),已实测可用。
不过要注意:项目里的 demo 大多只用 points[0](第一个触点)。
所以双人对战、捏合放大都能做,但你得自己去读 points[1]——默认的程序不会帮你看第二根手指。
工程上的一条常识:"芯片手册说支持" ≠ "我这边真的能用"。 这条依然成立——所以当初的"先自己验一遍"是对的,只是现在我们已经验过了:能用。
13. 屏幕碎了还能用吗?
**看碎在哪一层。**这块屏是三层"三明治":
- 只碎外层保护玻璃 → 触摸和显示可能都还正常,但扎手,别继续用;
- 伤到触摸层(导电膜) → 特定区域永久失灵,改程序救不回来;
- 伤到显示层 → 花屏、黑块、漏液。
结论:别把它当耐摔实验品。贴膜、别用力戳、别压重物。
14. 触摸坐标和屏幕坐标一定一致吗?
不一定。方向和范围可能有差异,需要实测核对、必要时转换或校准——板子不会报错提醒你。
十一、最后留给你
手指这一点,把"我能告诉板子什么"从 2 种可能变成了 76,800 种。
再想想:既然手指能说出位置,它还能说出什么别的?
- 用了多大力气? 我们的板测不出来(有些设备能,叫压力感应)
- 能同时按几根手指? 我们的触摸芯片最多认两根(已实测)——那能不能做成两个人对战?两根手指分开合拢,能不能做成放大缩小?
- 划过的速度能算出来吗?用第 2 课的
millis()和第 5 课的坐标,你其实已经具备全部工具了
这些答案,都要你动手去试。
现在选一个最想做的,先自己补完:
我想用触摸做____,用来____。
手指____的时候,程序就____。
判断的规则是:如果手指在____范围内,就____。
有没说清楚的地方请先问我,再另存程序并烧录,保留旧作品。
我会这样检查它做对了:____。
我希望你带来的不只是"我的画板能画了",而是这段介绍:"手指告诉板子的不是'是'或'否',而是七万六千八百个坐标里的某一个。我发现快速划过会画成断点,因为板子每隔一小会儿才问一次手指;把两个点连成线就解决了。我还发现按钮其实是我们自己用坐标判断出来的。"
