一、先玩起来:让板子"长眼睛"
烧录 demo01_draw_guess(需要 WiFi + 密钥,见 README)。屏幕上是一张"白纸",下面是两个按钮:蓝色 Guess(问号) 和 灰色 Clear(X)。
用指头在白纸上画一个太阳(一个大圆 + 周围几条短线),点一下蓝色 "Guess" 按钮。屏幕先变成深蓝、写着 "AI guessing...",然后弹窗里出现 — 它猜出"太阳"了!还会开口念:"我猜你画的是,太阳。"
别急着画下一张,先记三件事:
- 点 Guess 后,屏幕先变成什么、再变成什么?
- 猜出来的结果是中文还是英文?
- 它念出来的那句,是不是"我猜你画的是,xxx"?
二、AI 是怎么"看见"的:记住"图要先变信"
AI 没有眼睛,它在云端的服务器里,看不见你的屏幕。它怎么知道你在画太阳?因为板子把你的画变了一封信(一串数据) 寄给它。这封信是这么做的:
flowchart LR
A[1 内存画布<br/>画笔画进 PSRAM<br/>uint16_t canvas] --> B[2 缩图+包 PNG<br/>240x320 缩到 120x160<br/>RGB565→RGB888]
B --> C[3 译成 base64<br/>图片变一长串<br/>字母数字]
C --> D[4 塞进 HTTP 信封<br/>手动拼 JSON<br/>WiFi 寄给火山]
D --> E[5 视觉模型猜画<br/>云端·看小图<br/>直接说答案]
E --> F[6 显示+念出来<br/>中文字体+百度 TTS]
style A fill:#22d3ee,color:#131a22
style B fill:#22d3ee,color:#131a22
style C fill:#22d3ee,color:#131a22
style D fill:#22d3ee,color:#131a22
style F fill:#22d3ee,color:#131a22
style E fill:#f472b6,color:#131a22
| 步骤 | 谁在做 | 在哪里 | 干了什么 |
|---|---|---|---|
| 1 内存画布 | 板子 | PSRAM | 手指每画一笔,同步写进 canvas(240×320 的 RGB565 数组) |
| 2 缩图 + 包 PNG | 板子 | PSRAM | 240×320 缩到 120×160,RGB565 转 RGB888,手动拼成一张 PNG |
| 3 译成 base64 | 板子 | 内存 | 把 PNG 字节译成一串字母数字 |
| 4 塞进 HTTP 信封 | 板子 | WiFi | HTTP POST JSON 到火山 Ark,带上提示词 + 这张图 |
| 5 视觉模型猜画 | 火山 | 云端 | 看着那张小图,按 system 提示词"直接说答案" |
| 6 显示 + 念出来 | 板子 | TFT+SD+喇叭 | 中文字体显示答案;百度 TTS 念"我猜你画的是,xxx" |
看第 2、3 步——这是本课的命根子:板子把"像素点"变成了"一张真正的小图片",再变成"一封信(文字)"。视觉模型不认识一堆像素数字,它只认"图片格式",所以要把像素点打包成 PNG 再寄。
三、关键一棒:画为什么存在"内存画布"里,不在屏幕上?
你可能想问:屏幕上都画出来了,直接从屏幕"截"下来寄走不就行了吗?不行。 这里有块板的硬件小秘密:
这块屏幕有一条线(MISO)物理没接,所以从屏幕"回读"画面,只会读回一堆噪点。换句话说:屏幕只能"往外画",不能"往里读"。
所以板子聪明的做法是:边画,边把画好的像素存进一块内存(画布)里。 寄信时,从这块内存里取画,不是去"截屏幕"。
一句话记住:屏幕负责"给人看",内存画布负责"给机器用"。 AI 看的,是内存里那份画,不是屏幕上那份。屏幕负责"给人看",内存画布负责"给机器用"。 AI 看的,是内存里那份画,不是屏幕上那份。
⚠️ 比喻的边界:说"从内存取画"像"从草稿本抄",但它不是"抄"——是从第一笔起就画在内存这份草稿上。屏幕是展示板,内存才是真正的草稿纸。AI 看的一直是内存草稿纸。
四、让 AI"猜"而不是"描述":那行提示词
同一张太阳图,提示词写法不同,AI 的回答差很多:
写法 A——让它"讲讲":
请描述这幅画。
AI 可能回:"图中有一个黄色圆形,周围有几条放射状线条……"——在描述,不猜。
写法 B——让它"直接说答案"(本课的写法):
system:你是猜画游戏助手。用户画了简笔画,请直接说出答案,
回复尽量简短(几个字即可),不要解释、不要思考过程。
AI 会回:"太阳。"——猜中了!
差别就在这四句话:
| 提示词里写的 | 它"指挥" AI 什么 | 写了 vs 没写 |
|---|---|---|
| 直接说出答案 | 让它猜,不是描述 | 写了才猜,没写就描述 |
| 回复尽量简短(几个字) | 限长度 | 不啰嗦 |
| 不要解释 | 只给结论 | 不画蛇添足 |
| 不要思考过程 | 直接给答案 | 不让它"先想再答" |
💡 这条提示词是第 26 课那个"提示词决定它怎么答"的延伸。想让 AI"干到点"的事,常常要同时告诉它"别干多余的"——"不要解释、不要思考过程"就是"负面指令"。你还可以在请求体里看到一句
"thinking":{"type":"disabled"},是正式关掉它的思考模式,让它别"想太久"把答案挤没。(如果不关,它可能只思考、不给答案——踩坑 #6。)
五、动手做实验:它猜得准不准
实验一:画四个常见图
每次先写预测,再点 Guess 再对答案:
| 我画的简笔画 | 预测 AI 会猜 | 实际猜了什么 | 对了吗 |
|---|---|---|---|
| 太阳(大圆+放射线) | |||
| 房子(方框+三角屋顶+小门) | |||
| 笑脸(圆+两点+弯线) | |||
| 花(小圆+几瓣椭圆) |
实验二:画一团"抽象"的线
随便乱涂一团线,点 Guess。三种都可能:猜个怪东西 / 说"不知道" / 像在脑补。都记下来。
实验三:空白画布就点 Guess
按一下灰色 "Clear" 擦白,啥也不画直接点 Guess。
| 我做了什么 | 预测 | 实际 |
|---|---|---|
| 空白就点 Guess |
这三个实验在帮你回答同一件事:AI 看见的,是它收到的那张缩略图。 画得越糊,它越"看不清";画得清楚、常见,它越容易说中。
六、它猜错,是坏了吗?(拆台实验)
试着拔掉 WiFi,再点 Guess。
| 观察 | 推测 |
|---|---|
| 屏幕出现什么?喇叭响了吗? | |
| 为什么? |
再连回网。记住:AI 猜错、说 "no idea"、念不出来,多半不是板子坏了——真正"看图说话"的是云端那个模型,板子只负责"把画包成信、寄出去、念回来"。想让它猜得准,就换一张更清楚、更常见的画。
试试把提示词从"直接说答案"改成"详细描述这幅画",再点 Guess——它的口吻会由"猜"变"讲"。这又是一次"提示词说了算"。
七、想自己看懂一点点代码:两个名字就够
打开 demo01_draw_guess.ino(或问 AI 帮手),只看两个名字:
- canvas:内存里的那张纸。240×320、
ps_malloc开在 PSRAM。读画从它读,不readRect(屏幕 MISO 没接,readRect读回噪点)。 - captureAsBase64():把纸变信的那一棒。缩图 → 转 RGB888 → 手动拼 PNG(CRC32 + adler32 + zlib stored 块)→ base64。图片几万字节,塞不进 JsonDocument(会被截断),所以请求体是手动拼字符串(踩坑 #5)。
中文伪代码(不用背):
手指在画布区按下拖动:
屏幕画一条线
同时写进内存画布 canvas
抬手 :停止画
点蓝色 Guess:
屏幕变深蓝 + "AI guessing..."
captureAsBase64(120, 160):
画布缩成 120x160 像素 → 拼 PNG → base64
askVision(base64):
手动拼 JSON(model + thinking disabled + 提示词 + 图片)
HTTP 寄给火山 Ark
读回 content
showResult(答案):
中文字体居中显示
百度 TTS 念"我猜你画的是,xxx"
再点一下屏幕,回到画笔继续画
八、过关检查:自己讲一遍
不看答案,用自己的话说:
- AI 没有眼睛,它靠哪几步"看到"你的画?
- 为什么画要从内存画布取,不从屏幕"截"?屏幕哪个硬件原因导致的?
- base64 是干什么的?为什么图要"翻译成文字"才能寄?
- 提示词里"直接说答案、不要解释、不要思考过程"分别命令 AI 什么?
- 拔掉 WiFi 再点 Guess,会发生什么?这证明了"看图说话"发生在哪一边?
- AI 猜错是板子坏了吗?它到底"看见"了什么?
点开对答案
1. 内存画布 → 缩图包 PNG → base64 → HTTP 寄给视觉模型 → 它看小图直接说答案 → 板子显示+念出来。 2. 屏幕 MISO 物理没接,readRect 读回噪点。所以画存在内存画布,从内存读。 3. base64 是把图片"翻译"成一串字母数字,让图片能装进 HTTP/JSON 信封寄走。 4. 猜不是描述 / 简短 / 只给结论 / 直接给答案——用提示词"剪掉"多余行为。 5. 请求发不出去,一直卡或报错。说明"看图说话"发生在云端,板子只负责发货+念回。 6. 不是坏。它看见的是收到的那张缩略图,画得糊就猜错;更常见/清楚就容易说中。今天请留下三样东西:① 一个"你画了、AI 猜对了"的证据(画了什么 + 猜了什么);② 一个"AI 显然猜错"的画(并说说它"看见"的到底是什么);③ 一句话——"AI 看见的,究竟是不是你屏幕上的那幅画?"
九、往哪边玩(创意方向)
| 想做什么 | 要怎么改 / 需要什么 | 会观察到 |
|---|---|---|
| 画个会动的东西 | 猜完让屏幕把答案变成会动的图 | 板子从"猜"到"动" |
| 成语 / 谜语你画我猜 | 把提示词改成"这是成语,猜一个成语" | 同一张图,换个提示词,说法就变 |
| 画不出就题诗 | 提示词改成"看这幅画,写一句诗" | AI 从"猜"变"创作" |
| 连环画 | 画 5 张,AI 逐个猜,串成故事 | 把多次答案连成一个故事 |
| 和第 28 课合体 | 你说"我画好了",它念"我猜是……" | 你就复刻了第 28 课语音助手的雏形 |
密钥提醒:源码里
WIFI_SSID/WIFI_PASS、ARK_KEY、BAIDU_API_KEY/SECRET_KEY都是YOUR_*占位符。只放本机,别写进笔记、截图、串口日志。